![So verwenden Sie die Ausgabe eines Befehls im Ansible-ini_file-Wert](https://rvso.com/image/768927/So%20verwenden%20Sie%20die%20Ausgabe%20eines%20Befehls%20im%20Ansible-ini_file-Wert.png)
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: true
wenn 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_time
den 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.