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 root@192.168.1.200

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

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

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

$ ansible test -m ping



测试结果

我们看到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表示目标路径。


拷贝结果

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容