![Cómo utilizar la salida de un comando dentro del valor ansible ini_file](https://rvso.com/image/768927/C%C3%B3mo%20utilizar%20la%20salida%20de%20un%20comando%20dentro%20del%20valor%20ansible%20ini_file.png)
Quería establecer un valor dentro de un archivo ini, pero este valor es un hash MD5 de la hora actual. (No tengo miedo de reemplazar accidentalmente el valor, o de ejecutarlo mágicamente dos veces y tener el mismo valor en dos servidores diferentes).
Esto es lo que intenté, pero solo obtuve el comando como valor en el archivo (no estoy seguro de por qué pensé que funcionaría...):
- name: Replace HardwareID with new MD5
ini_file:
path: /etc/app/config.ini
section: DEFAULT
option: hardware_token
value: $(date | md5sum | cut -d" " -f1)
¿Existe una forma sencilla de hacerlo funcionar?
Respuesta1
P:"¿Cómo utilizar la salida del comando dentro del valor ini_file de Ansible?"
R: Registre el resultado del comando y utilícelo como valor, por ejemplo
- 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 }}"
da (ejecutando con --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 más fácil utilizar hechos de Ansible si desea utilizar datos y tiempo como entrada. Por ejemplo, el diccionarioansible_fecha_horamantiene la fecha y la hora si reúne los hechos. En el libro de jugadas, establecemos gather_facts: false
. Por lo tanto el diccionario no está definido.
- debug:
var: ansible_date_time.iso8601
da
ok: [test_24] =>
ansible_date_time.iso8601: VARIABLE IS NOT DEFINED!
Tendrás que recopilar los hechos gather_facts: true
cuando comiences la obra o correr setup
, por ejemplo.
- setup:
gather_subset: min
- debug:
var: ansible_date_time.iso8601
da
ok: [test_24] =>
ansible_date_time.iso8601: '2021-07-29T21:32:26Z'
Esto no es muy práctico porque para obtener la hora actual hay que ejecutar setup
. En cambio, el filtrotiempo de tensiónsiempre te da la hora actual, por ejemplo
- 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') }}"
da
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
Como nota al margen: el uso de este hash puede resultar en una búsqueda muy rápida si la fecha y hora (en granularidad de segundos) es el índice.
Respuesta2
Ansible puede generar sus propias cadenas de fecha y hora y hacer sus propias sumas MD5 sin llamar a programas externos. Considerar:
---
- hosts: localhost
connection: local
tasks:
- debug:
msg: "{{ ansible_date_time.iso8601 | hash('md5') }}"
Tenga en cuenta que ansible_date_time
contiene la última vez que recopiló datos del servidor remoto, no necesariamente la hora actual. Si siempre recopila datos en cada ejecución del libro de jugadas, entonces esto no debería ser un problema.