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`をつければよい。

---

- 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

例の場合は、マシンに対しての破壊的タスクに対して追加しているわけではないが、破壊的なタスクにつければ、思わぬ変更が入ってしまうので注意しよう。