CentOS Linux release 7.9.2009 (Core)
python version 2.7.5
ansible 2.9.23
こちらのドキュメントを参考にしています。
https://docs.ansible.com/ansible/2.9_ja/user_guide/playbooks_conditionals.html
Ansibleで特定の場合にのみ実行したいタスクがあった際、条件にマッチしたら実行するように書くことができます。
このplaybookはdebugモジュールの実行をwhenにより、ターゲットノードのディストリビューションがRedhatだった場合に実行されます。
---
- hosts: localhost
gather_facts: yes
tasks:
- name: when test
debug:
msg: "execute : {{ ansible_facts['distribution'] }} "
when: ansible_facts['distribution'] == "Redhat"
実行結果はタスク”when test“がスキップされました。ターゲットノードのディストリビューションはCentOSなので条件にマッチしなかったためスキップされています。
[root@ansible-ctl ~]# ansible-playbook -i /etc/ansible/hosts when-test1.yml
PLAY [localhost] *********************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************
ok: [localhost]
TASK [when test] *********************************************************************************************************************
skipping: [localhost]
PLAY RECAP ***************************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
この条件は複数並べることも可能です。先ほどのplaybookと似たような作りですが、条件が2つ設定されています。
---
- hosts: localhost
gather_facts: yes
tasks:
- name: when test
debug:
msg: "execute : {{ ansible_facts['distribution'] }} : {{ ansible_facts['distribution_major_version'] }}"
when:
- ansible_facts['distribution'] == "CentOS"
- ansible_facts['distribution_major_version'] == "7"
こちらはタスクがスキップされずに実行されました。ターゲットノードのOSはCentOS 7なので条件にマッチしています。
[root@ansible-ctl ~]# ansible-playbook -i /etc/ansible/hosts when-test2.yml
PLAY [localhost] *********************************************************************************************************************
TASK [Gathering Facts] ***************************************************************************************************************
ok: [localhost]
TASK [when test] *********************************************************************************************************************
ok: [localhost] => {
"msg": "execute : CentOS : 7"
}
PLAY RECAP ***************************************************************************************************************************
localhost : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@ansible-ctl ~]#
ここまでの条件を使用すれば、ディストリビューションが複数混在する場合でも、タスクを環境に合わせて実行することもできそうです。
次は前段のタスク結果を受けて、実行するかどうか条件を判定する動作を見てみます。
always errorタスクを実行して、結果を変数resultに格納し、タスクがエラーになっても止まらず後続処理を続けるようにします。タスクwhen testは変数resultがfailedだった場合に実行されます。
---
- hosts: localhost
gather_facts: no
tasks:
- name: always error
command: /bin/false
register: result
ignore_errors: True
- name: when test
debug:
msg: "execute: {{ result }}"
when:
- result is failed
- name: show var
debug:
var=ansible_facts
実行結果はこのようになりました。前段のalways errorでFAILEDになり、そのまま後続のwhen testが実行されています。
[root@ansible-ctl ~]# ansible-playbook -i /etc/ansible/hosts when-test3.yml
PLAY [localhost] *********************************************************************************************************************
TASK [always error] ******************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": ["/bin/false"], "delta": "0:00:00.002817", "end": "2021-08-19 19:54:42.013830", "msg": "non-zero return code", "rc": 1, "start": "2021-08-19 19:54:42.011013", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
...ignoring
TASK [when test] *********************************************************************************************************************
ok: [localhost] => {
"msg": "execute: {'stderr_lines': [], u'changed': True, u'end': u'2021-08-19 19:54:42.013830', u'stdout': u'', u'cmd': [u'/bin/false'], u'failed': True, u'delta': u'0:00:00.002817', u'stderr': u'', u'rc': 1, u'msg': u'non-zero return code', 'stdout_lines': [], u'start': u'2021-08-19 19:54:42.011013'}"
}
PLAY RECAP ***************************************************************************************************************************
localhost : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
[root@ansible-ctl ~]#
この条件を使って、タスクの実行結果から特定の値をみて、次のタスクを実行するか判定する。という動きもとれそうです。
コメント