奔跑吧Ansible

幂等性、DSL、观察者模式、内置模块、可复用……

本书对Ansible 2的用法进行了比较全面的讲解,再结合文档,读者就能深入理解Ansible了。

Ansible采用观察者模式,控制主机是可被观察者,远程主机是观察者。远程主机只需支持SSHPython即可,控制主机通过inventory来管理远程主机。远程主机可被归类为不同的群组,一个群组又可以从属于其他群组。

playbook使用声明式的DSL(含有条件、循环结构)定义,用YAML语法表示。Ansible集成了Jinja2模板引擎,除了自身提供的过滤器外,还允许用户自定义过滤器。在可重用方面,playbook不但可以includeimport任务文件,还可拆分成role

Ansible最突出的特性是幂等性(同一个操作被执行一次与执行多次是等效的),只需要运行playbook一次就可以将每台服务器都置为期望的状态。使用commandshell模块时,也应当保证操作是幂等的。用户可以自定义模块,但每一个模块都应当是幂等的。

Ansible提供了多种部署策略,还可执行异步任务,有多种回调插件可选。在Docker的使用方面,我个人认为Docker的归DockerAnsible的归AnsibleAnsible没必要接管镜像与应用栈的定义。

文摘

playbook包括一个或多个play,一个play由一组无序的主机(host)和一系列有序的task组成,每个task仅由一个模块构成。任何task运行的时候都有潜在可能以某种方式改变主机的状态,Ansible模块首先会在采取任何行动之前检查主机的状态是否需要改变。

只有在所有task执行完后,handler才会执行。哪怕被通知了多次,它也只执行一次。当play中定义了多个handler时,handler按照play中定义的顺序执行,而不是通知的顺序。handler唯一常见的用途是重启服务和重启机器。

Ansible会在名为host_vars的目录中寻找主机变量文件,在名为group_vars的目录中寻找组变量文件。在Ansible中,变量的作用域载体为主机,只有针对特定主机讨论变量的值才有意义。

调用模块时,Ansible会执行如下操作:

  • 生成带有参数的独立Python脚本(只限于Python模块)

  • 将模块复制到服务器

  • 在服务器上创建一个参数文件(只限于非Python模块)

  • 在服务器上,以参数文件作为参数调用模块

  • 解析模块的标准输出