Ansibleでコマンドの実行結果をwhenで指定するなら、そのコマンドにcheck_mode
をつけましょう.
Ansibleの公式ドキュメントに書いてあることだが、cehck_mode: no
をつけないと、dryrunでコマンドが実行されずにエラーになります.
Ansibleのバージョンが2.2未満であれば、alwarys_run
というオプションがあるので、そちらを利用しましょう.
エラーになるタスクの例は、下記のようになります.
--- - name: 'LANGの確認' shell: localectl status | grep "System Locale" | sed -re "s/.*:\sLANG=//" changed_when: false register: current_lang - name: 'LANGの設定' shell: localectl set-locale LANG={{lang}} when: current_lang.stdout != lang
dryrunを実行した場合、1つ目のタスクLANGの確認
が実行されずに、2つ目のタスクLANGの設定
のwhenが評価されてしまいます.
が、LANGの確認
はå®NGの確認に
check_mode: no`をつければOKです.
--- - name: 'LANGの確認' shell: localectl status | grep "System Locale" | sed -re "s/.*:\sLANG=//" changed_when: false register: current_lang check_mode: no - name: 'LANGの設定' shell: localectl set-locale LANG={{lang}} when: current_lang.stdout != lang
例の場合は、マシンに対しての破壊的タスクに対して追加しているわけではないが、破壊的なタスクにつければ、思わぬ変更が入ってしまうので注意しましょう.