Ansible Documentation
Controlling What Defines Failure機能
- 通常 Ansible はタスクのリターンコード (rc) がゼロ以外のとき、エラーが発生したと判断する
- failed_when を使用するとタスクにエラーが発生したと判断する条件を設定できる
例
ファイルの内容が同じであれば diff コマンドのリターンコードは 0 になり、shell モジュールはエラーになりません。--- - hosts: all gather_facts: no tasks: - name: ファイルの内容を比較して同じあればエラーにする shell: diff ~/file-a ~/file-b register: result failed_when: result.rc == 0しかし failed_when でリターンコード (rc) が 0 のときにエラーとしているため、ファイルの内容が同じであればこのようにエラーなります。
ansibleman@ubuntu-pc:~/ansible/error handling$ ansible-playbook -i hosts.yml site.yml
PLAY [all] **************************************************************************************
TASK [ファイルの内容を比較して同じあればエラーにする] ******************************************************************
fatal: [node_c0706]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "cmd": "diff ~/file-a ~/file-b", "delta": "0:00:00.009358", "end": "2019-05-21 22:08:56.798112", "failed_when_result": true, "rc": 0, "start": "2019-05-21 22:08:56.788754", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []}
PLAY RECAP **************************************************************************************
node_c0706 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
ansibleman@ubuntu-pc:~/ansible/error handling$
リターンコードだけではなく、エラーメッセージの内容を検索して特定の文字列が含まれていた場合にエラーとすることができます。この play は stderr 内に 'ありません' が含まれているときにエラーとしています。
--- - hosts: all gather_facts: no tasks: - name: stderr に 'ありません' が含まれていたらエラーにする shell: /usr/false register: result failed_when: "'ありません' in result.stderr"実行結果です。
ansibleman@ubuntu-pc:~/ansible/error handling$ ansible-playbook -i hosts.yml site.yml
PLAY [all] *********************************************************************
TASK [stderr に 'ありません' が含まれていたらエラーにする] *****************************************
fatal: [node_c0706]: FAILED! => {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": true, "cmd": "/usr/false", "delta": "0:00:00.003827", "end": "2019-05-21 22:35:30.578296", "failed_when_result": true, "msg": "non-zero return code", "rc": 127, "start": "2019-05-21 22:35:30.574469", "stderr": "/bin/sh: /usr/false: そのようなファイルやディレクトリはありません", "stderr_lines": ["/bin/sh: /usr/false: そのようなファイルやディレクトリはありません"], "stdout": "", "stdout_lines": []}
PLAY RECAP *********************************************************************
node_c0706 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
ansibleman@ubuntu-pc:~/ansible/error handling$
failed_when に指定した条件が成立したときエラーにと判断されるので、条件に no または false を指定すると条件判断の結果は常に false になります。結果、タスクの成否にかかわらず常にエラーと判断されません。
--- - hosts: all gather_facts: no tasks: - name: 常にエラーにならない shell: /usr/false failed_when: no実行結果です。failed_when で指定した条件の結果が false なので常にエラーになりません。
ansibleman@ubuntu-pc:~/ansible/error handling$ ansible-playbook -i hosts.yml site.yml
PLAY [all] *********************************************************************
TASK [常にエラーにならない] **************************************************************
changed: [node_c0706]
PLAY RECAP *********************************************************************
node_c0706 : ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ansibleman@ubuntu-pc:~/ansible/error handling$