Ansible:条件の書き方

Ansible

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で特定の場合にのみ実行したいタスクがあった際、条件にマッチしたら実行するように書くことができます。

このplaybookdebugモジュールの実行を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は変数resultfailedだった場合に実行されます。

---
- 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 errorFAILEDになり、そのまま後続の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 ~]#

この条件を使って、タスクの実行結果から特定の値をみて、次のタスクを実行するか判定する。という動きもとれそうです。

コメント

タイトルとURLをコピーしました