以前、下記のような方法で shell モジュールでファイルが無いときだけ実行して、かつ、ファイルがあるときは ok と表示させつつ、チェックモードで実行したときにも changed とか ok とかそれっぽく表示できるようにしてみましたが、
最近の Ansible なら(2.1以上)、チェックモードで実行されているかどうか ansible_check_mode
マジック変数で判断できるので、↓のようにもっと簡単?にできました。
- hosts: localhost
tasks:
- name: create hoge
shell: |
# ファイルが存在するなら ok を標準出力に出して終了
if [ -e /tmp/hoge ]; then
echo ok
exit
fi
# チェックモードなら何もしない
if [ "$ansible_check_mode" -ne 0 ]; then
exit
fi
# 実際の処理
uname -a > /tmp/hoge
environment:
# ansible_check_mode を環境変数で渡す
ansible_check_mode: '{{ ansible_check_mode|int }}'
register: res
# チェックモードでも実行する
check_mode: no
# 標準出力が ok なら変更なしとみなす
changed_when: res.stdout != 'ok'
この例だと簡単すぎてそもそも shell モジュールでやる必要無くね? と思いますが、例のためのサンプルなので本当はもっと shell モジュールでなければ出来ないことなのだと思ってもらえればと・・・例えば make -q
の終了コードで実行の要否を判断するとか?
---
- hosts: localhost
tasks:
- name: make hoge
shell: |
make -q
if [ $? -ne 1 ]; then
# 終了コードが 1 以外ならビルド不要かエラーのどっちか
exit $?
fi
if [ "$ansible_check_mode" -eq 0 ]; then
if ! make; then
exit 2
fi
fi
exit 1
environment:
ansible_check_mode: '{{ ansible_check_mode|int }}'
register: res
check_mode: no
changed_when: res.rc == 1
failed_when: not res.rc in (0, 1)
チェックモードでもそうじゃなくても、ビルドが必要なら changed になるし、不要なら ok になります。