私の 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