こちらの記事はAnsible lint Advent Calendar 2022 22日目の記事になります。
今回はルール no-changed-when について説明します。
no-changed-when
no-changed-when は ansible.builtin.command モジュールおよび ansible.builtin.shell モジュールにおいてタスクが冪等性を保証するか検証します。
Ansibleではほぼ全てのモジュールにおいて冪等性が保証されていますが ansible.builtin.command モジュールおよび ansible.builtin.shell モジュールではユーザーが処理が冪等になる条件を指定する
必要があります。
冪等性とは
Wikipedia には 冪等性 とは大雑把に言って、ある操作を1回行っても複数回行っても結果が同じであることをいう概念
とあります。
問題のあるコード
この処理は実行するたびにchanged
が返却されます。
---
- name: Example playbook
hosts: localhost
tasks:
- name: Does not handle any output or return codes
ansible.builtin.command: cat {{ my_file | quote }} # <- 実行するたびに changed ステータスを返す。冪等性が保証されていない。
修正されたコード
changed
が返却される条件を指定しそれ以外では冪等性を保証するように変更します。
---
- name: Example playbook
hosts: localhost
tasks:
- name: Handle shell output with return code
ansible.builtin.command: cat {{ my_file | quote }}
register: my_output # <- コマンドの結果を変数にセットする
changed_when: my_output.rc != 0 # <- 変数の値に対しステータスが changed になる条件を指定する