when 條件

基本用法

使用 when 條件來控制任務或角色是執行還是被跳過。這通常用於根據目標系統的事實更改播放行為。考慮一下這本劇本:

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

Ubuntu.ymlRHEL.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_names 魔術變數

條件語法和邏輯

單一條件

句法

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', '>=')

請注意使用括號將第一個分佈檢查中的分組。