Ansible ini_file 値内でコマンドの出力を使用する方法

Ansible ini_file 値内でコマンドの出力を使用する方法

ini_file 内に値を設定したいのですが、この値は現在の時刻の MD5 ハッシュです。(誤って値を置き換えたり、魔法のように 2 回実行して 2 つの異なるサーバーで同じ値になったりすることを恐れていません。)

これは私が試したことですが、ファイル内の値としてコマンドのみが取得されました (なぜ動作すると思ったのかわかりません...):

- name: Replace HardwareID with new MD5
      ini_file:
        path: /etc/app/config.ini
        section: DEFAULT
        option: hardware_token
        value: $(date | md5sum | cut -d" " -f1)

それを機能させる簡単な方法はありますか?

答え1

質問:Ansible ini_file 値内でコマンドの出力を使用するにはどうすればよいでしょうか?

A: コマンドの結果を登録し、それを値として使用します。例:

- hosts: test_24
  gather_facts: false
  tasks:
    - shell: 'date | md5sum | cut -d" " -f1'
      register: result
      check_mode: false
    - debug:
        var: result
    - name: Replace HardwareID with new MD5
      ini_file:
        path: etc/app/config.ini
        section: DEFAULT
        option: hardware_token
        value: "{{ result.stdout }}"

(--check --diff で実行)

TASK [Replace HardwareID with new MD5] ***********************************
--- before: etc/app/config.ini (content)
+++ after: etc/app/config.ini (content)
@@ -0,0 +1,3 @@
+
+[DEFAULT]
+hardware_token = ba3f11c4f1ecfe9d1e805dc8c8c8b149

changed: [test_24]

データと時間を入力として使用する場合は、Ansible factsを使用する方が簡単です。たとえば、辞書ansible_日付_時間事実を収集すると、日付と時刻が保持されます。プレイブックでは、 を設定しますgather_facts: false。したがって、辞書は定義されていません

    - debug:
        var: ansible_date_time.iso8601

与える

ok: [test_24] => 
  ansible_date_time.iso8601: VARIABLE IS NOT DEFINED!

gather_facts: trueプレイを開始するときに事実を収集するか、実行する必要がありますsetup

    - setup:
        gather_subset: min
    - debug:
        var: ansible_date_time.iso8601

与える

ok: [test_24] => 
  ansible_date_time.iso8601: '2021-07-29T21:32:26Z'

これはあまり実用的ではありません。現在の時刻を取得するには を実行する必要があるからですsetup。代わりに、フィルタstrftime常に現在の時刻を表示します。例:

    - debug:
        msg: "{{ '%Y-%m-%d %H:%M:%S' | strftime }}"

    - name: Replace HardwareID with new MD5
      ini_file:
        path: etc/app/config.ini
        section: DEFAULT
        option: hardware_token
        value: "{{'%Y-%m-%d' | strftime | hash('md5') }}"

与える

TASK [debug] ***************************************************************
ok: [test_24] => 
  msg: '2021-07-29'

TASK [Replace HardwareID with new MD5] *************************************
--- before: etc/app/config.ini (content)
+++ after: etc/app/config.ini (content)
@@ -0,0 +1,3 @@
+
+[DEFAULT]
+hardware_token = 5847924805aa614957022ed73d517e7e

補足: 日時 (秒単位) がインデックスである場合、このハッシュを使用すると検索が非常に速くなる可能性があります。

答え2

Ansible は、外部プログラムを呼び出すことなく、独自の日付と時刻の文字列を生成し、独自の MD5 サムを実行できます。次の点を考慮してください。

---
- hosts: localhost
  connection: local
  tasks:
    - debug:
        msg: "{{ ansible_date_time.iso8601 | hash('md5') }}"

ansible_date_timeこれには、必ずしも現在の時刻ではなく、リモート サーバーから最後にファクトを収集した時刻が含まれることに注意してください。プレイブックの実行ごとに常にファクトを収集する場合は、これが問題になることはありません。

関連情報