在本模块中,我将为您介绍 Ansible 中的条件操作,以及如何在您的 Ansible Playbook 中日常使用它们。

条件语句的作用

条件语句用于检查某个条件,并根据条件的结果改变程序的行为。为了编写有用的代码,我们几乎总是需要检查条件并据此改变程序的行为。Ansible 中的条件语句形式为 when,它使用 Jinja2 的测试和过滤器来实现条件逻辑。Ansible 支持所有标准的测试和过滤器,并添加了一些独特的功能。

基本条件语句示例

文件名:conditional_basic_false.yml

---
- name: conditional_basic
  hosts: all
  vars:
    configure_nginx: false
  tasks:
    - name: reload nginx
      ansible.builtin.service:
        name: nginx
        state: reloaded
      when: configure_nginx

在这个基本示例中,任务“reload nginx”仅在变量 configure_nginx 的布尔值为 true 时才会执行。在本例中,变量值为 false,因此我们预计该任务将被跳过。让我们看看执行代码的输出。

执行结果(configure_nginx 为 false)

$ ansible-playbook -i inventory conditional_basic_false.yml
PLAY [conditional_basic] ****************************************************
TASK [Gathering Facts] ******************************************************
ok: [host1.example.com]
TASK [reload nginx] *********************************************************
skipping: [host1.example.com]
PLAY RECAP *******************************************************************
host1.example.com       : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

这是“conditional_basic_false.yml”文件的执行输出。在此执行中,Play 针对 host1.example.com 节点运行。输出以绿色和蓝色突出显示。正如您所见,Ansible 读取了任务“reload nginx”,但由于我们的条件语句,该任务被跳过。

修改条件为 true

文件名:conditional_basic_true.yml

---
- name: conditional_basic
  hosts: all
  vars:
    configure_nginx: true
  tasks:
    - name: reload nginx
      ansible.builtin.service:
        name: nginx
        state: reloaded
      when: configure_nginx

这是一个相同的示例,但我们将变量值从 false 改为 true。现在任务“reload nginx”将会执行,因为变量 configure_nginx 的布尔值为 true。让我们看看这次代码执行的输出。

执行结果(configure_nginx 为 true)

$ ansible-playbook -i inventory conditional_basic_true.yml
PLAY [conditional_basic] ****************************************************
TASK [Gathering Facts] ******************************************************
ok: [host1.example.com]
TASK [reload nginx] *********************************************************
ok: [host1.example.com]
PLAY RECAP *******************************************************************
host1.example.com       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

这是“conditional_basic_true.yml”文件的执行输出。在此执行中,Play 针对 host1.example.com 节点运行。输出以绿色突出显示。正如您所见,Ansible 读取了任务“reload nginx”,并且根据我们的条件语句成功执行了该任务。

基于 Ansible 事实的条件语句

文件名:conditional_facts.yml

---
- name: conditional_facts
  hosts: all
  tasks:
    - name: Shut down Debian-like systems
      ansible.builtin.command: /sbin/shutdown -t now
      when: ansible_facts['os_family'] == "Debian"

将条件语句与 Ansible 事实结合使用非常有用。这样可以根据各个主机的条件(如 IP 地址、操作系统、文件系统状态等)调整代码的执行。在这个示例中,如果目标系统是基于 Debian 的(如 Debian 或 Ubuntu),则执行关机命令。

执行结果

$ ansible-playbook -i inventory conditional_facts.yml
PLAY [conditional_facts] ****************************************************
TASK [Gathering Facts] ******************************************************
ok: [host1.example.com]
TASK [Shut down Debian-like systems] *****************************************
skipping: [host1.example.com]
PLAY RECAP *******************************************************************
host1.example.com       : ok=1    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0

将条件语句与 Ansible 事实结合使用非常有用。这样可以根据各个主机的条件(如 IP 地址、操作系统、文件系统状态等)调整代码的执行。在这个示例中,如果目标系统是基于 Debian 的(如 Debian 或 Ubuntu),则执行关机命令。

总结

条件语句非常重要,因为它们使我们能够创建能够响应某些事件、条件或 Ansible 事实的 Ansible Playbook。这种语句是智能 Ansible Playbook 的基础。