チェック モードで Ansible コマンド/シェル タスクが変更されたことを報告するにはどうすればよいですか?

チェック モードで Ansible コマンド/シェル タスクが変更されたことを報告するにはどうすればよいですか?

私の Ansible プレイブックには次の内容があります:

- name: "A: Check to see if we need to run task B"
  [... implementation omitted, not relevant ...]
  register: task_a_result
  check_mode: no  # even run in check mode
  changed_when: no  # this only reads/checks stuff

- name: "B: Write x to file"
  shell: "echo {{ my_var|quote }} > /path/to/file"
  when: task_a_result.stdout_lines[0].startswith('ABCDEF')
  changed_when: yes  # when run, it always changes the state

私はしますないBをチェックモードで実行したい(したがって、なしcheck_mode: no)が、報告非チェックモードで実行された場合、変更されたものとして扱われます。この動作が必要なのは、非チェックモードで実行しているときに驚きたくないしかし、自分で条件を設定したにもかかわらずchanged_when: yes、Ansibleはタスクを次のように表示し続けます。スキップしたがって変更なし私に:

skipping: [myhost] => changed=false 
  msg: skipped, running in check mode

(上記はチェックモードで、通常の非チェックモードでは「変更済み」と報告されます。)

誤解され、不適切に閉じられたと思われる次のバグレポートを見つけました:14950ですが、これ以上コメントすることはできません。

何か基本的なことを見落としていませんか? 他のモジュールは通常、Ansible で「変更されたはず」のステータスを問題なく報告しますが、これはシェル/コマンドでも可能ですか?

Ansible 2.7.12 と 2.8.2 を使用すると、同じ結果が得られます。

次のようなコマンド自体の厄介なハックを避けたいと思っています:

- name: "B: Write x to file"
  shell: "echo {{ my_var|quote }} {{ '>' if task_a_result.stdout_lines[0].startswith('ABCDEF') else '' }} /path/to/file"
  when: task_a_result.stdout_lines[0].startswith('ABCDEF')
  changed_when: yes

はい、コピー/テンプレートモジュールでファイルに書き込むことができることは知っていますが、上書きするたとえばecho 1234 > /sys/module/zfs/parameters/zfs_arc_max、copy/template はファイルを置き換えようとするため、カーネル パラメータの設定がそのように機能しない可能性があります。また、このカーネル モジュール パラメータは、Linux の sysctl を通じて公開されません。

答え1

これは少し古い話だとは思いますが、この問題の解決策を探しています。コマンド モジュールが OP であることによる驚きにもうんざりしています。

チェック モードで別のコマンドを実行するように「コマンド」部分を変更するとどうなるでしょうか。また、チェック モードでも常にタスクを実行します。

注: 文句を言う前に、これは悪い例だとわかっています。「command」モジュールに「creates」オプションがあることはわかっています。これは単なる例です。

これまでのところ、これが私の解決策です:

- name: Get some info
  stat: {path: /tmp/somefile}
  register: file_info

- name: Run the command conditionally
  command:
    "{{ 'true' if (file_info['stat']['exists'] or ansible_check_mode)
    else 'touch /tmp/somefile' }}"
  changed_when: not file_info['stat']['exists']
  check_mode: false

動作しますが、肥大化しています。

もっと良い解決策があれば教えてください。

答え2

私も同様のニーズがあります。チェック モードで実行されていない場合に予期せぬ事態が発生しないように、コマンドが実行されるかどうかを確認したいと思います。

回避策として、変更があることを報告するデバッグタスクを追加し、コマンドタスクのwhen条件を使用してデバッグタスクにchanged_whenを設定しました。

- name: "Report pending change"
  debug:
    msg: "Change pending"
  changed_when: task_a_result.stdout_lines[0].startswith('ABCDEF')
  when: ansible_check_mode|bool

関連情報