Ansible 日常维护和使用知识( 四 )


HandlersHandlers也是一些Task的列表 , 和一般的Task并没有什么区别 。 它是由通知者进行的Notify , 如果没有被Notify , 则Handlers不会执行 , 如果被Notify了 , 则Handlers被执行 。 不管有多少个通知者进行了Notify , 等到Play中的所有Task都执行完成之后 , Handlers也只会被执行一次 。 例如:

Ansible 日常维护和使用知识
文章图片
变量引用我们可以在PlayBook中通过“vars:变量名”的方式声明变量 , 并通过“{{变量名}}”的方式使用已声明的变量 。 另外 , 我们还可以直接引用Ansible的变量 , 包括采集到的主机Fact中的变量 , 例如:通过ansible_all_ipv4_address来获取IPV4地址 , 或者通过ansible_distribution、ansible_distribution_version来获取操作类型和版本信息 。 除此之外 , 还能引用已编辑好的Inventory文件中定义的主机变量 , 这样当安装完一些软件 , 需要根据主机中定义的变量来做一些自动化配置时 , 将会非常好用 。 例如:
vi/etc/ansible/hosts#定义Inventory文件中的变量与值
X.X.108.2hostname="test"

Ansible 日常维护和使用知识
文章图片
上面的案例是通过vars的方式定义了package和service两个变量 , 并在下面的yum和service两个Task中进行引用 , 第三个Task则是直接引用setup生成的Fact变量和来自Inventory文件中定义的主机变量hostname , 来实现将内容信息传递至远端主机的文件中 , 输出结果如下:
cat/tmp/test.txt
test:RedHat7.2
条件判断我们可以在PlayBook中通过“when:变量==值”的方式声明一个条件判断 , 可以看出when的值是一个条件表达式 , 如果条件判断成立 , Task就执行 , 如果判断不成立 , 则task不执行 。 例如当我们需要根据变量、Facts(setup)或此前任务的执行结果来作为某Task执行与否的前提时 , 则要用到条件判断 , 这时可以在Playbook中使用when子句:在Task后添加when子句 。 另外 , when子句支持jinjia2表达式或语法 。

Ansible 日常维护和使用知识
文章图片
迭代当我们有需要重复性执行的任务时 , 可以使用迭代机制 。 其使用格式为将需要迭代的内容定义为item变量引用 , 并通过with_items语句指明迭代的元素列表即可 。 例如:

Ansible 日常维护和使用知识
文章图片

Ansible 日常维护和使用知识
文章图片
TemplatesJinja是基于Python的模板引擎 。 Template类是Jinja的另一个重要组件 , 可以看作一个编译过的模块文件 , 用来生产目标文本 , 我们可以传递Python的变量给模板去替换模板中的标记 。 例如 , 我们在做Nginx安装与配置时 , 有些监听端口、服务名称等配置可以通过变量的方式在Inventroy文件中为不同主机预定义好 , 当我们定义好了一个模板 , 并将模板中的监听端口和服务名称设置为变量后 , 在运行Template这个Task时 , 将会把不同主机的这些变量信息传递到模板中使用 , 实现配置的自动化 。 例如:
vi/tmp/httpd.conf.j2#定义模板中的变量
Listen{{http_port}}
ServerName{{server_name}}
MaxClients{{access_num}}
vi/etc/ansible/hosts#定义Inventory文件中的变量与值
[test]
X.X.X.2http_port=X.X.X.2:80access_num=50server_name="test:80"
安装Nginx时 , 将把Inventory文件中主机定义好的变量与值传递到模板中 , 并拷贝至该远端主机:

Ansible 日常维护和使用知识
文章图片
Tags在一个Playbook中 , 我们一般会定义很多个Task , 如果我们只想执行其中的某一个Task或多个Task时就可以使用Tags标签功能了 , 例如:

Ansible 日常维护和使用知识
文章图片
ansible-playbooktest.yml--tags="nginx"
4、AnsibleFacts使用
Facts组件是Ansible用于采集被管主机设备信息的一个功能 , 当Ansible采集Fact的时候 , 它会收集被管主机的各种详细信息:CPU架构、操作系统、IP地址、内存信息、磁盘信息等 , 这些信息保存在被称作Fact的变量中 。 Ansible使用一个名为Setup的特殊模块来实现Fact的收集 , 在Playbook中默认会调用这个模块进行Fact收集 , 在命令行中可以通过“ansibleip-msetup”来进行手动收集 , 整个Facts信息被包装JSON格式的数据结构中 , AnsibleFacts是最上层的值 。 例如:

Ansible 日常维护和使用知识
文章图片
Facts还支持通过filter参数来查看指定信息 , 例如下面只查看远端主机的操作系统和版本: