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 を追記した