changed_when - タスクの変更条件を定義する

2019/05/25

Ansible

 Ansible Documentation

Overriding The Changed Result

 機能

  • タスクを実行した結果、対象ホストの状態が変化した場合にステータスが changed 状態になる
  • ※ shell モジュールなどの一部モジュールは常に changed になる
  •  changed_when を使用するとタスクの状態が変化したと判断する条件を設定できる

 例

diff コマンドのリターンコードは差異がなければ 0 、差異があれば 1 、エラーが発生したら 2 です。リターンコードが 1 のときは changed 、2 のときは failed になる例です。
[root@node-c0706 ~]# cat file-a
abc
[root@node-c0706 ~]# cat file-b
xyz
[root@node-c0706 ~]# 
- hosts: all
  gather_facts: no

  tasks:
    - name: ファイルを比較し、異なるときは notify する
      shell: diff ~/file-a ~/file-b
      register: result
      changed_when: result.rc == 1
      failed_when: result.rc > 1
      notify: "file changed"

  handlers:
    - name: ファイルに差異があったときの処理
      debug:
        msg: "ファイルに差異が見つかりました"
      listen: "file changed"
実行結果
ansibleman@ubuntu-pc:~/ansible/changed_when$ ansible-playbook -i hosts.yml site.yml

PLAY [all] *********************************************************************************************************

TASK [ファイルを比較し、異なるときは notify する] ***********************************************************************************
changed: [node-c0706]

RUNNING HANDLER [ファイルに差異があったときの処理] *********************************************************************************
ok: [node-c0706] => {
    "msg": "ファイルに差異が見つかりました"
}

PLAY RECAP *********************************************************************************************************
node-c0706                 : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/changed_when$ 

changed_when に指定した条件が成立したとき changed と判断されるので、条件に no または false を指定すると条件判断の結果は常に false になります。結果、タスクの実行結果が ok / changed にかかわらず常に changed と判断されません。次の例は changed_when と failed_when の両方に no を指定しているので、shell モジュールの結果にかかわらず ok と判断されます。
- hosts: all
  gather_facts: no

  tasks:
    - name: ファイルを比較する
      shell: diff ~/file-a ~/file-b
      register: result
      changed_when: no
      failed_when: no
実行結果
ansibleman@ubuntu-pc:~/ansible/changed_when$ ansible-playbook -i hosts.yml site.yml

PLAY [all] *********************************************************************************************************

TASK [ファイルを比較する] ***********************************************************************************
ok: [node-c0706]

PLAY RECAP *********************************************************************************************************
node-c0706                 : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

ansibleman@ubuntu-pc:~/ansible/changed_when$ 

カテゴリー

目次

QooQ