ansible 当条件

示例

基本用法

使用when条件控制任务或角色是运行还是被跳过。通常用于根据目标系统的事实来更改播放行为。看这本剧本:

- hosts: all
  tasks:
    - include: Ubuntu.yml
      when: ansible_os_family == "Ubuntu"
    
    - include: RHEL.yml
      when: ansible_os_family == "RedHat"

凡Ubuntu.yml与RHEL.yml包括一些分配特定的逻辑。

另一个常见用法是将结果限制为某些Ansible库存组中的结果。考虑以下清单文件:

[dbs]
mydb01

[webservers]
myweb01

而这本剧本:

- hosts: all
  tasks:
    - name: Restart Apache on webservers
      become: yes
      service:
        name: apache2
        state: restarted
      when: webservers in group_names

这是使用group_namesmagic变量。

条件语法与逻辑

单一条件

语法

when: (condition)

  • when: ansible_os_family == "Debian"

  • when: ansible_pkg_mgr == "apt"

  • when: myvariablename is defined

布尔过滤器

when: result|failed

多种条件

语法

When: condition1 and/or condition2

示例(简单)

when: ansible_os_family == "Debian" and ansible_pkg_mgr == "apt"

示例(复杂)

使用括号可以使内容更清楚或控制优先级。“ AND”的优先级高于“ OR”的优先级。

子句可以跨越行:

when:
  ansible_distribution in ['RedHat', 'CentOS', 'ScientificLinux'] and
  (ansible_distribution_version|version_compare('7', '<') or
  ansible_distribution_version|version_compare('8', '>='))
  or
  ansible_distribution == 'Fedora'
  or
  ansible_distribution == 'Ubuntu' and
  ansible_distribution_version|version_compare('15.04', '>=')

请注意,在第一次分配检查中使用括号将“或”分组。