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
dá
ok: [test_24] =>
ansible_date_time.iso8601: VARIABLE IS NOT DEFINED!
Você terá que reunir os fatos gather_facts: true
quando iniciar a peça ou correr setup
, por exemplo
- setup:
gather_subset: min
- debug:
var: ansible_date_time.iso8601
dá
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') }}"
dá
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_time
conté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.