failed_when - タスクの失敗条件を定義する

2019/05/21

Ansible

 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$ 

カテゴリー

目次

QooQ