So verwenden Sie die Ausgabe eines Befehls im Ansible-ini_file-Wert

So verwenden Sie die Ausgabe eines Befehls im Ansible-ini_file-Wert

Ich wollte einen Wert in einer INI-Datei festlegen, aber dieser Wert ist ein MD5-Hash der aktuellen Zeit. (Ich habe keine Angst, den Wert versehentlich zu ersetzen oder ihn auf magische Weise zweimal auszuführen und auf zwei verschiedenen Servern denselben Wert zu haben.)

Ich habe Folgendes versucht, aber in der Datei nur den Befehl als Wert erhalten (ich bin nicht sicher, warum ich dachte, dass es funktionieren würde ...):

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

Gibt es eine einfache Möglichkeit, es zum Laufen zu bringen?

Antwort1

Q:"Wie verwende ich die Befehlsausgabe im Ansible-ini_file-Wert?"

A: Erfassen Sie das Ergebnis des Befehls und verwenden Sie es als Wert, z. B.

- 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 }}"

gibt (läuft mit --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]

Es ist einfacher, Ansible-Fakten zu verwenden, wenn Sie Daten und Zeit als Eingabe verwenden möchten. Beispielsweise das Wörterbuchansible_Datum_Uhrzeitbehält Datum und Uhrzeit bei, wenn Sie die Fakten sammeln. Im Playbook setzen wir gather_facts: false. Daher ist das Wörterbuch nicht definiert

    - debug:
        var: ansible_date_time.iso8601

gibt

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

Sie müssen entweder die Fakten sammeln, gather_facts: truewenn Sie das Spiel starten oder laufen setup, zB

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

gibt

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

Dies ist nicht sehr praktisch, da Sie ausführen müssen, um die aktuelle Zeit zu erhalten setup. Stattdessen wird der Filterstrfzeitgibt Ihnen immer die aktuelle Zeit an, zB

    - 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') }}"

gibt

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

Randbemerkung: Die Verwendung dieses Hashs kann die Suche möglicherweise sehr schnell machen, wenn der Index Datum und Uhrzeit (in Sekundengenauigkeit) darstellt.

Antwort2

Ansible kann seine eigenen Datums- und Zeitzeichenfolgen generieren und seine eigenen MD5-Summen berechnen, ohne externe Programme aufrufen zu müssen. Bedenken Sie:

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

Beachten Sie, dass dies ansible_date_timeden Zeitpunkt enthält, zu dem Sie zuletzt Fakten vom Remote-Server gesammelt haben, nicht unbedingt die aktuelle Zeit. Wenn Sie bei jedem Playbook-Lauf immer Fakten sammeln, sollte dies kein Problem sein.

verwandte Informationen