明天游戏就要上线咯,由于之前的测试都是几台机器,纯手动部署就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!” }
- ansible all -m copy -a “src=/data/src.txt dest=/data/dest.txt”:将本地的
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
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 &"