Como usar a saída de um comando dentro do valor ansible ini_file

Como usar a saída de um comando dentro do valor ansible ini_file

Eu queria definir um valor dentro de um ini_file, mas esse valor é um hash MD5 da hora atual. (Não tenho medo de substituir acidentalmente o valor ou de executá-lo magicamente duas vezes e ter o mesmo valor em dois servidores diferentes.)

Foi isso que tentei, mas obtive apenas o comando como valor no arquivo (não sei por que pensei que funcionaria...):

- 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 uma maneira simples de fazer isso funcionar?

Responder1

P:"Como usar a saída do comando dentro do valor Ansible ini_file?"

R: Registre o resultado do comando e use-o como valor, por exemplo

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

dá (executando com --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]

É mais fácil usar fatos Ansible se você quiser usar dados e tempo como entrada. Por exemplo, o dicionárioansible_date_timemantém a data e a hora se você reunir os fatos. No manual, definimos gather_facts: false. Portanto o dicionário não está definido

    - debug:
        var: ansible_date_time.iso8601

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

Você terá que reunir os fatos gather_facts: truequando iniciar a peça ou correr setup, por exemplo

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

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

Isso não é muito prático porque para obter a hora atual é necessário executar setup. Em vez disso, o filtrohorário de trabalhofornece sempre a hora atual, por exemplo

    - 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

Como observação lateral: usar esse hash pode ser uma pesquisa muito rápida se a data e hora (em granularidade de segundos) for o índice.

Responder2

O Ansible pode gerar suas próprias strings de data e hora e fazer suas próprias somas MD5 sem recorrer a programas externos. Considerar:

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

Observe que ansible_date_timecontém a última vez que você coletou fatos do servidor remoto, não necessariamente a hora atual. Se você sempre coletar fatos em cada execução do manual, isso não deverá ser um problema.

informação relacionada