在真正开始聊Ansible以前,我想先给各位讲个假故事。mysql
小安很早之前就是一名Linux运维工程师,他的基础很扎实,经常使用工具和公司涉及的服务以及公司的运维流程都比较熟悉,好比他能熟练地使用Shell脚本去作一些平常的运维管理,Shell脚本不方便的时候也能写写PHP和Perl脚原本给本身的工做添一点色彩。因为这时公司环境比较小,小安管理的资源也比较少,因此那时候的运维工做对于小安来讲,绝大多数时候就是打开远程链接工具(好比Xshell),点开他须要维护的几台主机的ssh链接,在这几个窗口上敲敲命令就能够了,工做仍是蛮顺利的。sql
后来公司扩张了,小安要管理的主机逐渐变多,小安仍然用着老方法去运维,期间倒也没有出什么问题,公司的业务仍然是正常的。可是,如今的小安已经累觉不爱了,每次拿到新主机,不管是测试机仍是生产机都要上去初始化配置一番,每次版本发布时也要点点点、敲敲敲,此外还有不少很简单但却无法省略的操做。若是只是几台主机,并不会有什么枯燥的感受,可是小安面对的是多批主机,每批主机上执行同一类操做,他常常须要在大量主机之间切换,这种日子他看不到尽头,并且小安已经意识到公司扩张以后再也抽不出时间来学习新技能,他不想将有限的时间花在这些无谓的操做上,他不想收到HR的辞退消息,他不想......shell
小安以为很累,累的缘由并非运维工做的内容有多难、背锅的次数是否是在增长等等,真正战胜他的是单调和枯燥。单调和枯燥不只战胜了小安,还战胜了小明、小白、小难过、小伤心等大批大批的优秀运维同胞们。这些简单但却无聊的部署和维护,小安和各位同胞们都只想作一次,对此他们有共同的呼声:"曾经体验好过终生陪伴,不然就珍爱生命远离运维"。框架
后来,配置管理工具出现了,小安看到了将来,终于不用每次都切换到各个主机上去作这些无聊、简单又不可省略的重复配置和管理操做了。less
小安比较了几个比较出名的配置管理工具,他决定选择Ansible,他以为Ansible是一个集大成者,使用方便又简单——他又爱了。运维
我赶忙去百度上Google了一下Ansible的资料,对它作个简介。ssh
Ansible是一个基于Python开发的配置管理和应用部署工具,如今也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优势,Pubbet和Saltstack能实现的功能,Ansible基本上均可以实现。ide
Ansible能批量配置、部署、管理一大堆的主机。好比之前须要切换到每一个主机上执行的一或多个操做,使用Ansible只需在固定的一台Ansible控制节点上去完成全部主机的操做。工具
例如,下面的操做(看不懂不要紧)表示将Ansible所在主机上的/etc/my.cnf文件拷贝到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)。所谓幂等性,指的是屡次操做或屡次执行不影响结果。好比算术运算时数值加0是幂等的,不管加多少次结果都不会改变,而数值加1是非幂等的,每次加1结果都会改变。再好比执行systemctl stop xxx
命令来中止服务,当发现要中止的目标服务已经处于中止状态,它什么也不会作,因此屡次中止的结果仍然是中止,不会改变结果,它是幂等的,而systemctl restart xxx
是非幂等的。Ansible的不少模块在执行时都会先判断目标节点是否要执行任务,因此,能够放心大胆地让Ansible去执行任务,重复执行某个任务绝大多数时候不会产生任何反作用。
Ansible做为一个自动化管理工具,它的用法能够很是简单,只需学几个基本的模块,就像ssh命令同样去使用,就能完成一些简单的批量配置管理功能。
它的用法也能够很是难,须要学习大量Ansible自身的知识,并且还须要学习Ansible中涉及到的额外知识。比较悲催的是Ansible的知识体系比较庞大,它的知识板块也比较零散,想要构建一个比较完善的Ansible知识体系确实稍有难度,这也每每会让咱们对深刻Ansible无处下手甚至产生迷茫感,相信很多学习过Ansible的人对此应该都有所体会。
其实,Ansible的知识虽多,但这些知识点自己是死的,须要什么功能学什么功能就能够,总有一天能够吞下绝大多数的知识点。但这并不够,实际的环境是很是灵活且复杂的,使用Ansible去管理配置时,须要关注不少任务流程和逻辑,若是编写的任务没有逻辑,使用Ansible极可能会让你知道一口大锅从天而降是一种什么样的体验,因此须要去协调Ansible中的各个任务,协调各个任务是Ansible的另外一难点。
最后一个难点,我我的认为是写出适合本身公司环境的可复用(即一次编写屡次使用)的playbook或role。这要求熟悉如何应对各类需求和逻辑,对知识点也了然于心,这须要很强的综合能力。
因此要掌握Ansible,须要:
- (1).学基本用法和经常使用模块 - (2).学Ansible涉及到的额外知识,如YAML和JinJa2 - (3).学习零散但却重要的边角知识点,好比`delegate_to`、`run_once` - (4).了解一些高级玩法或不多用的上的功能
总结起来,就是一句在座的各位听了估计会很想打人的废话:理论和实践相结合。
虽然确实是废话,但倒是真理,学习老是离不开理论和实践的,缺了任何一环,都会遇到难点和瓶颈。对Ansible的学习也如此,想要经过Ansible来释放本身,并让Ansible完美地执行各个任务,不只要求Ansible的功力要达到必定层次,还须要实际的经验来理解任务逻辑。
为了达到理论和实践相结合的目标,须要你我双方共同的努力。
对于我而言,为了让各位不打我,我会尽最大的努力,安排好本专栏中知识点的出场顺序(正如人生的出场顺序,知识点的出场顺序也很重要),同时辅以一些我精心挑选的经典案例来解释用法、适用场景并为你们详细解说任务之间的逻辑,从而让各位按部就班地逐步掌握Ansible的知识点,最终让你们系统性地掌握Ansible,并熟悉Ansible的正确使用姿式。
对于各位而言,要深刻掌握Ansible,须要本身去练习、测试、并记下属于本身的笔记(杜绝彻底拷贝粘贴),我能提供给各位的是知识的展示和引导,缺乏了各位本身的练习和本身的笔记,这一切都是空话。
最后,感谢各位的支持和订阅,也祝各位可以学有所成,能升职加薪,还有,能吃得起猪肉。
专栏《一步到位玩儿转Ansible》正式上线,抢200个早鸟优惠名额>>>https://blog.51cto.com/cloumn/detail/83