Cómo utilizar la salida de un comando dentro del valor ansible ini_file

Cómo utilizar la salida de un comando dentro del valor ansible ini_file

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: truecuando 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_timecontiene 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.

información relacionada