ansible学习小记

2022-07-17 10:49:49 浏览数 (1)

明天游戏就要上线咯,由于之前的测试都是几台机器,纯手动部署就ok了,现在正式上线十多台机器,要是再一个个手动部署就gg了 ,所以需要一个自动化部署的工具,也就是使用ansbile. 话不多说,也就是看了几天,只能是略了解 ,重点是能把部署的工程自动化跑起来,至于方法好不好的问题,不在讨论范围了,毕竟也不是专业的运维人员

安装

  • 首先安装,关于安装的问题提醒大家一般在网上搜的话,最好看下日期,一般选择比较接近现在的时间的文章参考比较好,我一开始就是按照某篇安装的ansible,步骤很多,现在知道那个全都是手动安装。结果是成功了,但是后来操作发现一个奇怪的错误,网上一堆也找不到解决,一番功夫发现有个人也遇到,结果他安装了2.0的版本发现就没有这个问题了!!!瞬间秒看了自己的安装的版本果然是1.7的老版本,于是怒删之,重新安装,话说有这一番折腾真是把人的耐心磨没了都,后来我是参考了公司另外一个人写的read_me才发现原来安装贼方便。。。
  • 由于系统默认的python2.6是不行的,ansible需要python2.7以上的,所以先安装python 并且处理好yum的配置。
  • python2.7 下载

tar -zxvf Python-2.7.14.tgz ./configure make all make install make clean make distclean 建立软链接,使系统默认的python指向python2.7 mv /usr/bin/python /usr/bin/python2.6.6 ln -s /usr/local/bin/python2.7 /usr/bin/python python -V – 这样就看到已经是python2.7了 因为yum是不兼容 Python 2.7的,所以yum不能正常工作,我们需要指定 yum 的Python版本 vim /usr/bin/yum 将头行指定的解释器 /usr/bin/python 修改为/usr/bin/python2.6.6

  • ansible安装有多种方式,在此是pip安装足够方便了(看到别人使用yum install epel-release -y yum install ansible -y 不过我没试过哈) 安装pip 下载 可以直接右键网页另存为get-pip.py 安装python get-pip.py
  • 安装sshpass下载 这个是为了ssh直接不用密码确认登录的 cd sshpass-1.06/ ./configure make && make install
  • 到这一步就可以直接使用pip安装ansible啦 (看到别人也可以使用yum install epel-release -y yum install ansible -y) pip install ansible

这里ansible就安装完啦,是不是so easy~ 然后在建立一个/etc/ansilbe/hosts文件进行测试咯 其实这是ansible默认读取的位置,后续可以加参数指定hosts文件的。

代码语言:javascript复制
[test_server]
192.168.0.231 ansible_ssh_user=root ansible_ssh_pass=123456

其中test_server为组,下面那些就是机器节点 组可以用多个 同一个机器节点,可以属于不同的组

根据以上配置,就可以开始测试啦

[root@localhost python]# ansible server -a ‘uptime’ 192.168.0.231 | SUCCESS | rc=0 >> 18:54:26 up 2:51, 3 users, load average: 0.32, 0.26, 0.20 ansible all -m ping也有很多教程都是用这个测试的,all 就是代表所有组,在此可以换成test_server

常用模块

  • command:执行某命令,不能用管道之类的东西,因为其不是用shell执行的,没有shell的那种特性
    • ansible all -m command -a ‘uptime’:所有的机器执行uptime命令
    • ansible all -m command -a ‘chdir /data/ ls’:所有机器执行ls命令,ls的目录是/data

    由于其是默认的模块,是以以上命令也可以简写成ansible all -a 'uptime'

  • shell:使用机器的shell执行
    • ansible all -m shell -a ‘uptime’:所有的机器执行uptime命令
    • ansible all -m shell -a ‘ps -ef|grep nginx’:所有机器执行ps -ef|grep nginx命令
    • *
  • script:到对象节点上执行本地脚本
    • ansible all -m script -a /data/set.sh
  • ping:看看机器能否ping通
    • ansible all -m ping
  • setup:获取机器的配置
    • ansible all -m setup:获取所有机器的配置信息
    • ansible all -m setup –tree /path/to/save:获取机器的配置信息,并且写入到目录path/to/save
  • yum:和机器的yum一样(不要给控制机也yum,否则会报错)
    • ansible all -m yum -a ‘name=nc’:为所有机器yum一个nc
    • ansible all -m yum -a “name=nc state=present”:立刻为所有机器yum一个nc

    调用此命令时候,不要yum中安装有ansilble机器(即ansible控制机),否则会报以下错误 192.168.0.231 | FAILED! => { “changed”: false, “msg”: “python2 bindings for rpm are needed for this module. python2 yum module is needed for this module” }

原因估计ansible这样执行的,/usr/bin/python /usr/bin/yum XXXXX 所以只要是其他机器安装了ansible的,或者修改了/usr/bin/python的版本就会报上面这个错误

  • copy:复制命令
    • ansible all -m copy -a “src=/data/src.txt dest=/data/dest.txt”:将本地的/data/src.txt文件拷贝到所有机器的/data/dest.txt文件中,此处,其会对比文件是否相同,若是相同,则比较文件是否有修改,若是没有修改,则不做事,若是修改,则覆盖之
    • ansible all -m copy -a “src=/data/src.txt dest=/data”:将本地的/data/src.txt文件拷贝到所有机器的/data/文件夹中
    • ansible all -m copy -a “src=/data/ dest=/data”:将本地的/data/目录拷贝到所有机器的/data/文件夹中(文件在路径/data/data/目录里面)

    调用此命令时候,不要将文件也copy到自己的机器(即ansible控制机),否则会报以下错误(尽管你已经安装了libselinux-python) 192.168.0.231 | FAILED! => { “changed”: false, “checksum”: “956f6c7150dcecba1103ecd14c42c5aab83bdd98”, “msg”: “Aborting, target uses selinux but python bindings (libselinux-python) aren’t installed!” }

playbook

实例1
代码语言:javascript复制
#dep.yml
---
- name: dep
  hosts: all
  remote_user: root
  tasks:
  - name: install zip
    yum : name=zip
    tags:
    - tag1
    - tag2
  - name: install unzip
    yum : name=unzip
  - name: install nc
    yum : name=nc
  - name: install lrzsz
    yum : name=lrzsz

* 运行指令ansible-playbook dep.yml:在所有的机器上面,执行所有tasks * 运行指令ansible-playbook dep.yml -i bitch.hosts:在所有的机器上面,执行所有tasks,其host文件不用默认的/etc/ansible/hosts,而是用bitch.hosts这个hosts文件 * 运行指令ansible-playbook dep.yml --tags tag1,tag2:在所有的机器上面,执行带有tags标志为tag1或者tag2的tasks * hosts: 那些组的机器(即配置文件/etc/ansible/hosts里面的配置) * remote_user:执行远程命令的用户 * tasks:任务,是一个列表 * name:任务名称 * yum:即模块名称,参考上面说的常用模块 * tags:标志,是一个列表,可配置多个

实例2

代码语言:javascript复制
#include_example.yml
---
- name: bitch
  hosts: all
  remote_user: root
  gather_facts: true
  tasks:
  - name: say hi
    tags: foo
    shell: echo "hi..."

- include: dep.yml #此文件问实例1中的文件
  • 运行指令ansible-playbook include_example.yml:在所有的机器上面,执行所有tasks(包括dep.yml里面的)

实例3

代码语言:javascript复制
#var_example.yml
---  
- name: copyfile
  hosts: server
  remote_user: root
  vars:
  - ddir: '/data/test_ansible'
  tasks:
  - name: depzip
    yum : name=zip
  - name: newdir
    file: path="{{ddir}}" state=directory
  • 运行指令ansible-playbook var_example.yml:在所有的机器上面,执行所有tasks
  • vars:定义变量ddir,使用方法在{{ddir}}

实例4

  • 文件vars_files_conf.yml

代码语言:javascript复制
zip_src_file: 'cn.zip'
zip_dest_dir: '/data'

代码语言:javascript复制
#scp_scheme.yml
---
- name: scp_scheme
  hosts: all
  remote_user: root
  vars_files:
    - vars_files_conf.yml

  tasks:

  - name: scp scheme
    copy: src="{{zip_src_file}}" dest="{{dest_dir}}"
  • 运行指令ansible-playbook scp_scheme.yml:在所有的机器上面,执行所有tasks
  • 通过在一个文件中定义变量,到处使用
  • vars_files:里面定义了两个变量zip_src_file,zip_dest_dir

由于ansible默认的gather_facts 收集主机信息是开的,当批量运行的时候会导致很慢,所以一般把它关掉,执行速度快些。

代码语言:javascript复制
---
- name: dep_agent
  hosts: '{{host}}'
  user: root
  gather_facts: false
  vars_files:
    - var_conf.yml
  tasks:
  - name: tar
    unarchive: src={{agent_file}} dest={{dest_agent_dir}}
  - name: seq
    script:
         /data/ansible/set_host.sh {{host}}
  - name: start agent
    shell: "nohup /data/agent/bin/falcon-agent -c /data/agent/config/cfg.json > /dev/null 2>&1 &"

0 人点赞