曾经有个Linux运维,后来他累了,在真正开始聊Ansible之前,我想先给各位讲个故事。
小安很早以前就是一名Linux运维工程师,他的基础很扎实,常用工具、公司涉及的服务以及公司的运维流程都比较熟悉。比如他能熟练地使用Shel脚本去做一些日常的运维管理,Shll脚本不方便的时候也能写写PHP和Per脚本来给自己的工作添一点色彩。
由于这时公司环境比较小,小安管理的资源也比较少,所以那时候的运维工作对于小安来说,绝大多数时候就是打开远程连接工具(比如Xshell),点开他需要维护的几台主机的ssh连接,在这几个窗口上敲敲命令就可以了,工作还是蛮顺利的。
后来公司扩张了,小安要管理的主机逐渐变多,每次拿到新主机,无论是测试机还是生产机都要上去初始化配置一番,每次版本发布时也要点点点、敲敲敲,此外还有很多很简单但却没法省略的操作。这种日子他看不到尽头,而且小安已经意识到公司扩张之后再也抽不出时间来学习新技能,他不想将有限的时间花在这些无谓的操作上,他不想收到HR的辞退消息,他不想…….
小安觉得很累,累的原因并不是运维工作的内容有多难、背锅的次数是不是在增加等等,真正打败他的是单调和枯燥。单调和枯燥不仅打败了小安,还打败了小明、小白、小难过、小伤心等大批大批的优秀运维同胞们.这些简单但却无聊的部署和维护,小安和各位同胞们都只想做一次,对此他们有共同的呼声∶"曾经体验好过终生陪伴,否则就珍爱生命远离运维"。
后来,配置管理工具出现了,小安看到了未来,终于不用每次都切换到各个主机上去做这些无聊、简单又不可省略的重复配置和管理操作了。小安比较了几个比较出名的配置管理工具,他决定选择Ansible,他觉得Ansible是一个集大成者,使用方便又简单——他又爱了。
三分钟内,请给我Ansible所有资料
我赶紧Google了一下Ansible的资料,对它做个简介。
Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。
Ansible能批量配置、部署、管理一大堆的主机。比如以前需要切换到每个主机上执行的一或多个操作,使用Ansible只需在固定的一台Ansible控制节点上去完成所有主机的操作。
例如,下面的操作(看不懂没关系表示将Ansible所在主机上的/etc/my.cn文件拷贝到mysql主机组内的所有主机的/etc/目录下,mysql主机组可以是单台主机,也可以是很多台主机,这可以由用户自己来定义。
$ ansible mysql -m copy -a "src=/etc/my.cnf dest=/etc/"
其实,固定在一台主机上去控制其它主机,通过ssh工具或一些基于ssh二次开发的简单工具也能实现,但Ansible吸引人的地方在于它提供的playbook能批量整合不同主机上执行的不同任务,同时还提供一些额外的机制让用户可以去协调这些任务的执行策略。
Ansible是基于模块工作的,它只是提供了一种运行框架,它本身没有完成任务的能力,真正执行操作的是Ansible的模块,比如copy模块用于拷贝文件到远程主机上,service模块用于管理服务的启动、停止、重启等。
这有点像Shell,Shell自身提供的操作是很有限的,但是它提供了一个很友好的平台让实现各种功能的命令得以执行。Ansible自身可以类比于Shell自身,Ansible的各种模块可以类比于Shell下各种命令。
Ansible一个比较鲜明的特性是Agentless。
即无Agent的存在,它就像普通命令一样,并非C/S软件,也只需在某个作为控制节点的主机上安装一次Ansible即可,通常它基于ssh连接来控制远程主机,远程主机上不需要安装Ansible或其它额外的服务。
Ansible的另一个比较鲜明的特性是它的绝大多数模块都具备幕等性(idempotence)所谓幂等性,指的是多次操作或多次执行不影响结果。比如算术运算时数值加是幂等的,无论加多少次结果都不会改变,而数值加1是非幂等的,每次加1结果都会改变。再比如执行systemct stopxx命令来停止服务,当发现要停止的目标服务已经处于停止状态,它什么也不会做,所以多次停止的结果仍然是停止,不会改变结果,它是幂等的,而systemct restartxx是非幂等的。Ansible的很多模块在执行时都会先判断目标节点是否要执行任务,所以,可以放心大胆地让Ansible去执行任务,重复执行某个任务绝大多数时候不会产生任何副作用。
[root@real-server2 ~]# ansible 192.168.179.102 -m file -a "path=/usr/local/nginx/ state=directory"
192.168.179.102 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true, #ansible判断该目录不存在,所以在192.168.179.102创建了该目录
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/usr/local/nginx/",
"secontext": "unconfined_u:object_r:usr_t:s0",
"size": 6,
"state": "directory",
"uid": 0
}
[root@real-server2 ~]# ansible 192.168.179.101 -m file -a "path=/usr/local/nginx/ state=directory"
192.168.179.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false, #ansible判断该目录存在,所以啥都不干
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/usr/local/nginx/",
"secontext": "unconfined_u:object_r:usr_t:s0",
"size": 151,
"state": "directory",
"uid": 0
}
如何学习并学好Ansible?
Ansible作为一个自动化管理工具,它的用法可以非常简单,只需学几个基本的模块,就像ssh命令一样去使用,就能完成一些简单的批量配置管理功能。它的用法也可以非常难,需要学习大量Ansible自身的知识,而且还需要学习Ansible中涉及到的额外知识。比较悲催的是Ansible的知识体系比较庞大,它的知识板块也比较零散,想要构建一个比较完善的Ansible知识体系确实稍有难度,这也往往会让我们对深入Ansible无处下手甚至产生迷茫感,相信不少学习过Ansible的人对此应该都有所体会。
其实,Ansible的知识虽多,但这些知识点本身是死的,需要什么功能学什么功能就可以,总有一天可以吞下绝大多数的知识点。但这并不够,实际的环境是非常灵活且复杂的,使用Ansible去管理配置时,需要关注很多任务流程和逻辑,如果编写的任务没有逻辑,使用Ansible很可能会让你知道一口大锅从天而降是一种什么样的体验,所以需要去协调Ansible中的各个任务,协调各个任务是Ansible的另一难点。
最后一个难点,我个人认为是写出适合自己公司环境的可复用(即一次编写多次使用)的playbook或role。这要求熟悉如何应对各种需求和逻辑,对知识点也了然于心,这需要很强的综合能力。要掌握Ansible,需要∶
1.系统性地学习Ansibl,从而构建自己的Ansible知识体系
(1)学基本用法和常用模块
(2)学Ansible涉及到的额外知识,如YAML和Jinja2
(3)学习零散但却重要的边角知识点,比如delegate_to、run_once
(4)了解一些高级玩法或很少用的上的功能
2.真实应用Ansible去配置管理各类服务并协子任务逻辑,保证Ansible的执行逻辑不会影响业务。总结起来,就是一句在座的各位听了估计会很想打人的废话∶理论和实践相结合。