Ansible,运维人员的好助手。

Ansible是一款基于Linux环境开发的运维自动化工具,相较其它类似软件,它最大的特点是无需在目标系统安装客户端(Agent)即可实现对其进行统一管理和操作。

在我使用了一个多月Ansible后,我感觉Ansible的确是一款搞运维工作朋友的好助手。本文将结合笔者工作中利用ansible处理的实际案例,一窥ansible的功能及其妙用。

Ansible的安装(centos为例)

在centOS下安装Ansible只需一条命令:

$ sudo yum install ansible

安装过程很简单,但如果操作系统版本较低,需要额外安装Python2.6 或 Python2.7,注意目标客户机上也要求安装Python,并且版本不得低于2.5 。

Ansible默认使用ssh协议管理客户机,我也是按照默认协议进行的配置,所以目标客户机需要开启ssh协议。检查ssh是否运行的命令:

$ ps ax | grep sshd

经过以上简单的两步,我们就可以初试牛刀了。我将通过我在工作中遇到的需求来一步一步和大家一起探索ansible的强大功能。



运用案例

批量部署zabbix客户端

笔者最近接到一个工作,需要监测约100台在线服务器的运行情况。部署方案采用zabbix来完成监控任务,因为zabbix需要部署客户端,逐台部署对我这样的懒人是一个让人崩溃的工作,于是在网上搜索了自动化运维的知识,很多软件可以完成我的工作任务,但我选择了Ansible,看中的就是无需在客户端部署。

在使用ansible前,还需要做2件事,第1件是创建目标主机列表,配置文件的位置在/etc/ansible/hosts。

#  [test]表示组名,可以将不同类型或功能的服务器分在不同组,例如本例中的test组和test2组

[test]

1.1.1.1

2.2.2.2

[test2]

3.3.3.3

分好组后,第2件事是使用ssh证书,实现免密码登录。

假设安装ansible软件的服务器ip是192.168.1.100,免密码登录的服务器ip是192.168.1.200,首先在100上执行命令:

$ ssh-keygen -t rsa -b 2048

该命令会生成2个文件,默认存放在/root/.ssh/目录下,名为id_rsa,id_rsa.pub。接着我们要将公匙文件拷贝到目标机器。

$ ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 [email protected]

如果ssh的端口默认是22的话,也可以不用指定 -p参数,经过以上2步,我们就可以使用ssh hostIP的方式直接登录客户机了,不再需要输入密码。

基本准备工作做完,可以开始做正事了。Ansible的提供的功能是模块化的,我也只是根据工作需要使用了其中很小一部分,在此只是抛砖引玉,更多的功能,需要大家一起挖掘。

为了测试ansible是否能够正常工作,我使用了ping模块进行测试。

$ ansible test -m ping



Ansible,运维人员的好助手。_第1张图片
测试结果

我们看到ansible正常的返回了ping结果。简单解释一下命令的构造,test是先前在/etc/ansible/hosts里面建的组,-m(module)表示使用ansible提供的模块,在这里我使用了ping模块,ping模块不需要加额外的参数。

返回的结果里面,SUCCESS表示模块执行成功,changed表示对目标机器做了配置改变,很明显ping命令不会修改目标机器的配置。

验证了ansible能够正常工作,我们继续先前的任务,部署zabbix客户端第一步是安装zabbix安装源rpm包。在管理主机上(192.168.1.100)下载好rpm包。(wget http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-1.el7.centos.noarch.rpm),然后需要在每台机器上执行下列操作。

任务 1:将文件批量复制到所有目标机

$ ansible all -m copy -a "src=/root/zabbix-release-3.4-1.el7.centos.noarch.rpm dest=/root/"

all表示对/etc/ansible/hosts下所有的机器执行操作,copy表示调用ansible的copy模块,,-a(Argument)表示参数,copy模块的作用是把本地指定位置的文件拷贝到目标机,常用的参数有2个,一是src,表示拷贝源路径,dest表示目标路径。


Ansible,运维人员的好助手。_第2张图片
拷贝结果

看到success就表示命令执行成功了,但更重要的是看changed的值是否为true,只有为true的情况下才表示拷贝操作完成,因为你在目标机上增加了一个rpm文件,代表改变了目标机的配置。其它还有一些如文件权限及所有者的信息。

大家看到ansible的威力了吗,只需要一个命令,就可以将需要的文件拷贝到所有目标机上。

接下来是安装rpm包

$ ansible test -m shell -a "rpm -ivh /root/zabbix-release-3.4-1.el7.centos.noarch.rpm"

这次调用了shell模块,参数就是安装rpm包的命令,也是一步完成所有目标机的安装。

再后面的安装步骤也是大同小异,就不再一一列举。

顺利完成监控的部署后,老板又给了新的任务,要求给所有机器加一个计划任务,每天17:30定期增加一条防火墙策略,在每天23:30定期删除该策略。这个任务本身不难,麻烦的是要部署到100台服务器上,又该Ansible闪亮登场了。

做这个功能需要有一个判断,首先要查看目标机是否已经设置了策略,如果没设置则设置,如果设置过了则跳过。这里我们就要用到ansible提供的一个新玩意儿playbook,开个玩笑,不知道和playboy有没有什么关系:P

言归正题,playbook可以在某种程度上认为是一个shell脚本,不过它使用的的是YAML,一种标记性语言。不过我认为目前我接触到的任务目标并不需要专门去学习它的语法格式,我们还是在实战中总结经验吧。

任务2:对所有目标机设置crontab策略,并在设置时检查是否已经设置过策略,如设置过,则跳过。

#checkCrontab.yml

---

#固定格式,冒号后是自定义脚本名称

- name: check80 

#该策略应用到哪些组,组是在前面提过在/etc/ansible/hosts里面定义的。

   hosts: test 

#让ansible不去获取目标机的常规信息以节省脚本检测时间

   gather_facts: false 

#任务开始关键字

   tasks: 

#子任务名称,可自定义。

   - name: getCrontab   

#调用ansible的shell模块,并在目的机执行冒号后的命令,命令的目的是查看crontab里面的任务是否有指定的策略。

      shell: crontab -l |grep '30 17 \* \* \* /sbin/iptables -A OUTPUT -p tcp --dport 80 -j DROP' | wc -l

#register是将上一条命令执行后的输出结果存放到cronHave自定义变量中。

      register: cronHave 

//第2个子任务,在第1个子任务完成后才执行。

   - name: add when absent.    

//调用ansible的lineinfile模块,其作用是根据dest指定的文件,修改文本的内容,默认是将Line冒号后的内容追加到最后一行。

      lineinfile:     

         dest: /root/mytest     

         line: '30 17 * * * /sbin/iptables -A OUTPUT -p tcp --dport 80 -j DROP'   

//when表示条件,意思只有第一个子任务的返回值是0,才执行第2个子任务。

      when: cronHave.stdout | int == 0

这就是一个用YAML标记语言写的文件,不要被吓着了,整个文件就分为2个子任务,按顺序执行,第1个子任务是查询当前crontab里面是否已配置指定的策略,第2个子任务根据第1个子任务的结果决定是否执行。

playbook是一个很强大的武器,可以设置各种条件来执行不同的任务,我在这里也只是抛砖引玉,毕竟自己也才接触一个多月。写此文的目的,一是想记录一些自己做过后,二是愿和大家交流技术、交流看法,希望能一起进步。

你可能感兴趣的:(Ansible,运维人员的好助手。)