[Ansible] 如何对 Playbook 的处理进行分支 [配置管理]

大家好!我是系统解决方案部门的Shimeji。
我加入SRE团队已经两个月了。
虽然还有很多东西我不懂,但我很感激能在这个每天都能学习新知识的环境中工作!
学习新知识真是一件乐事!
今天我们要聊聊 Ansible,一个配置管理工具。
有时候你可能需要对 Playbook 的处理进行分支,对吧?
例如,假设您执行以下 Playbook 流程。
这是一个常见的流程:它会重命名现有配置文件,然后将新的配置文件放置在其原位置。
- name: 重命名配置文件 shell: mv /etc/hoge/main.cf /etc/hoge/main.cf_backup - name: 部署配置文件 template: src: "{{ inventory_dir }}/roles/hoge/template/conf.j2" dest: "/etc/hoge/main.cf" owner: root group: root mode: 644
上述过程将通过“重命名原始配置文件”和“安装新配置文件”顺利完成。
但是,如果您已经有一个名为“main.cf_backup”的文件,则可以跳过此过程……
在这种情况下,请使用注册变量和`when`语句。
注册变量允许您将已执行任务的结果存储到变量中。
然后,您可以根据这些结果对流程进行分支,从而跳过流程的某些部分。
要对流程进行分支,请使用 `when` 语句。
如果您想跳过一个已存在的文件,
以下是考虑上述因素后对剧本的处理过程。
- name: 重命名配置文件确认状态: path: /etc/hoge/main.cf_backup register: result - name: 重命名配置文件 shell: mv /etc/hoge/main.cf /etc/hoge/main.cf_backup when: not result.stat.exists - name: 部署配置文件模板: src: "{{ inventory_dir }}/roles/hoge/template/conf.j2" dest: "/etc/hoge/main.cf" owner: root group: root mode: 644
请参阅名为“重命名配置文件确认”的过程。
状态:路径:/etc/hoge/main.cf_backup 注册表:结果
`stat` 模块用于检查 `main.cf_backup` 文件是否存在。
如果存在,则将 `True` 存储在变量 `result` 中;否则,存储 `False`。
重命名配置文件过程中有一个 when 语句。
当:结果统计信息不存在
仅当结果不为 True 时才执行重命名配置文件操作。
让我们验证一下,当条件实际满足时,该进程是否没有执行。
我们将在以下服务器上执行该进程,该服务器上存在 main.cf_backup 文件:
192.168.33.72 [CentOS72]
ansible-playbook -i hosts operation.yml --ask-pass
PLAY [将通用配置应用于所有节点] ********************************* TASK [收集信息] ***************************************************************** ok: [192.168.33.72] TASK [hoge:重命名配置文件确认] ************************************************ ok: [192.168.33.72] TASK [hoge:重命名配置文件] ************************************************** 跳过: [192.168.33.72] TASK [hoge:部署配置文件] ***************************************************************** ok: [192.168.33.72] PLAY RECAP **************************************************************** 192.168.33.72 : ok=3已更改=0 无法访问=0 失败=0
是的,该步骤被跳过了。
其他分支操作
`when` 语句可以用于各种其他条件分支。
以下是一个 Playbook,它仅在操作系统为 CentOS 7 时才安装 Apache。
- name: CentOS7 安装 Apache yum: name: httpd state: present when: - ansible_facts['distribution'] == "CentOS" - ansible_facts['distribution_major_version'] == "7"
条件可以以列表形式编写。
在这种情况下,只有当所有条件都满足时,该进程才会执行。
(在上面的示例中,操作系统是 CentOS,版本为 7。)
让我们在以下两台服务器上实际运行该进程:
• 192.168.33.67 [CentOS67]
• 192.168.33.72 [CentOS72]
ansible-playbook -i hosts operation.yml --ask-pass
PLAY [将通用配置应用于所有节点] ********************************* TASK [收集信息] ***************************************************************** ok: [192.168.33.65] ok: [192.168.33.72] TASK [测试:CentOS7-install-apache] ************************************************* 跳过: [192.168.33.65] changed: [192.168.33.72] PLAY 执行结果 ********************************************************************* 192.168.33.65 : ok=1 changed=0 unreachable=0 failed=0 192.168.33.72 : ok=2 changed=1 unreachable=0 failed=0
该过程仅在 192.168.33.72 上执行。
成功!
结论
这只是一个简单的介绍,
`when` 语句还可以用于各种其他条件分支方法。
如果您想了解更多信息,请查阅官方文档!
官方文档
1
