[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
加载中...
1票,平均分:1.00/11
20,283
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

姬松茸

证书:
- TOEIC 835
- LPIC304
- AWS 解决方案架构师助理
- AWS 解决方案架构师专业
- GCP 专业云架构师
- IPA SC(未注册)

卡戈梅,卡戈梅,
我身后的那个老头是谁?

我年纪大了。(2018)