タスクの実行結果をwhenで指定するならcheck_modeつける

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

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