when - 条件判断

2019/03/23

Ansible

 Ansible Documentation

The When Statement

 機能

特定の条件を満たすときだけタスクを実行する

 比較演算子

演算子説明 (true)
x == y x と y が等しいとき
x != y x と y が等しくないとき
x > y x が y より大きいとき
x >= y x が y より大きいか等しいとき
x < y x が y より小さいとき
x <= y x が y より小さいか等しいとき

 論理演算子

演算子説明 (true)
x and y x と y がともに true のとき
x or y x と y のどちらかが true のとき
not x x が false のとき 

 その他の演算子

演算子説明 (true)
x in [x, y, z] x, y, z の中に x があるとき
x not in [x, y, z] x, y, z の中に x がないとき

 基本的な使用例

基本的な使用例です。
- name: 対象ホストが Debian 系のときディストリビューションを表示する
  debug: 
    var: ansible_facts['distribution']
  when: ansible_facts['os_family'] == "Debian"

論理演算子の使用例です。
- name: 対象ホストが CentOS6 か Debian9 のときバージョン番号を表示する
  debug: 
    var: ansible_facts['distribution_version']
  when: (ansible_facts['distribution'] == "CentOS" and ansible_facts['distribution_major_version'] == "6") or
        (ansible_facts['distribution'] == "Debian" and ansible_facts['distribution_major_version'] == "9")
すべての条件を and で結ぶときはリスト形式で書けます。
- name: 対象ホストが CentOS7 のときバージョン番号を表示する
  debug: 
    var: ansible_facts['distribution_version']
  when: 
    - ansible_facts['distribution'] == "CentOS"
    - ansible_facts['distribution_major_version'] == "7"
複数の候補から該当のものがあるかの確認例です。
- name: CentOS か Ubuntu のとき IP アドレスを表示する
  debug:
    var: ansible_facts['default_ipv4']['address']
  when: ansible_facts['distribution'] in ["CentOS", "Ubuntu"]

 loop: との組み合わせ

 loop: と組み合わせた例です。まず loop: で item を取り出し、取り出した item が  when: 条件に合致するときだけタスクを実行していることがわかります。
---
- hosts: node-c0706
  gather_facts: no

  tasks:
    - name: loop と when の組み合わせ
      debug: 
        var: item
      loop:
        - 0
        - 2
        - 4
        - 6
        - 8
        - 10
      when: item > 5
実行結果
[ansibleman@ansiblesv ansible]$ ansible-playbook -i hosts.yml site4.yml
 
PLAY [node-c0706] ****************************************************************************
 
TASK [loop と when の組み合わせ] ********************************************************************
skipping: [node-c0706] => (item=0) 
skipping: [node-c0706] => (item=2) 
skipping: [node-c0706] => (item=4) 
ok: [node-c0706] => (item=6) => {
    "item": 6
}
ok: [node-c0706] => (item=8) => {
    "item": 8
}
ok: [node-c0706] => (item=10) => {
    "item": 10
}
 
PLAY RECAP ***********************************************************************************
node-c0706                 : ok=1    changed=0    unreachable=0    failed=0   
 
[ansibleman@ansiblesv ansible]$ 
次のような条件を指定することもできます。
---
- hosts: node-c0706
  gather_facts: no

  tasks:
    - name: loop と when の組み合わせ
      debug: 
        var: item
      loop:
        - 0
        - 2
        - 4
        - 6
        - 8
        - 10
      when: 3 < item < 8
実行結果
[ansibleman@ansiblesv ansible]$ ansible-playbook -i hosts.yml site4.yml
 
PLAY [node-c0706] ****************************************************************************
 
TASK [loop と when の組み合わせ] ********************************************************************
skipping: [node-c0706] => (item=0) 
skipping: [node-c0706] => (item=2) 
ok: [node-c0706] => (item=4) => {
    "item": 4
}
ok: [node-c0706] => (item=6) => {
    "item": 6
}
skipping: [node-c0706] => (item=8) 
skipping: [node-c0706] => (item=10) 
 
PLAY RECAP ***********************************************************************************
node-c0706                 : ok=1    changed=0    unreachable=0    failed=0   
 
[ansibleman@ansiblesv ansible]$
このような指定もできます。
---
- hosts: node-c0706
  gather_facts: no

  vars:
    user_account:
      - uname: admin-oda
        ugrp: g-admin
      - uname: staff-toyotomi
        ugrp: g-staff
      - uname: admin-tokugawa
        ugrp: g-admin
      - uname: staff-takeda
        ugrp: g-staff
      - uname: admin-uesugi
        ugrp: g-staff

  tasks:
    - name: g-staff グループだけアカウント名を表示
      debug: 
        var: item.uname
      loop: "{{ user_account }}"
      when: item.ugrp == "g-staff"
実行結果
[ansibleman@ansiblesv ansible]$ ansible-playbook -i hosts.yml site5.yml
 
PLAY [node-c0706] ****************************************************************************
 
TASK [g-staff グループだけアカウント名を表示] ***************************************************************
skipping: [node-c0706] => (item={u'uname': u'admin-oda', u'ugrp': u'g-admin'}) 
ok: [node-c0706] => (item={u'uname': u'staff-toyotomi', u'ugrp': u'g-staff'}) => {
    "item": {
        "ugrp": "g-staff", 
        "uname": "staff-toyotomi"
    }, 
    "item.uname": "staff-toyotomi"
}
skipping: [node-c0706] => (item={u'uname': u'admin-tokugawa', u'ugrp': u'g-admin'}) 
ok: [node-c0706] => (item={u'uname': u'staff-takeda', u'ugrp': u'g-staff'}) => {
    "item": {
        "ugrp": "g-staff", 
        "uname": "staff-takeda"
    }, 
    "item.uname": "staff-takeda"
}
ok: [node-c0706] => (item={u'uname': u'admin-uesugi', u'ugrp': u'g-staff'}) => {
    "item": {
        "ugrp": "g-staff", 
        "uname": "admin-uesugi"
    }, 
    "item.uname": "admin-uesugi"
}
 
PLAY RECAP ***********************************************************************************
node-c0706                 : ok=1    changed=0    unreachable=0    failed=0   
 
[ansibleman@ansiblesv ansible]$ 

 変更履歴

2019/05/20 「その他の演算子」に not in を追記した

カテゴリー

目次

QooQ