![Как использовать вывод команды внутри значения ini_file ansible](https://rvso.com/image/768927/%D0%9A%D0%B0%D0%BA%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B%20%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B8%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20ini_file%20ansible.png)
Я хотел установить значение внутри ini_file, но это значение представляет собой MD5-хеш текущего времени. (Я не боюсь случайно заменить значение или волшебным образом запустить его дважды и получить одно и то же значение на двух разных серверах.)
Вот что я попробовал, но в качестве значения в файле получил только команду (не знаю, почему я думал, что это сработает...):
- name: Replace HardwareID with new MD5
ini_file:
path: /etc/app/config.ini
section: DEFAULT
option: hardware_token
value: $(date | md5sum | cut -d" " -f1)
Есть ли простой способ заставить это работать?
решение1
В:"Как использовать вывод команды внутри значения ini_file Ansible?"
A: Зарегистрируйте результат команды и используйте его в качестве значения, например:
- 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 }}"
дает (запуск с --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]
Проще использовать Ansible facts, если вы хотите использовать данные и время в качестве входных данных. Например, словарьansible_date_timeсохраняет дату и время, если вы собираете факты. В плейбуке мы устанавливаем gather_facts: false
. Поэтому словарь не определен
- debug:
var: ansible_date_time.iso8601
дает
ok: [test_24] =>
ansible_date_time.iso8601: VARIABLE IS NOT DEFINED!
Вам придется либо собирать факты, gather_facts: true
когда вы начнете играть, либо запустить setup
, например,
- setup:
gather_subset: min
- debug:
var: ansible_date_time.iso8601
дает
ok: [test_24] =>
ansible_date_time.iso8601: '2021-07-29T21:32:26Z'
Это не очень практично, так как для получения текущего времени вам придется запустить setup
. Вместо этого фильтрstrftimeвсегда показывает текущее время, например
- 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
Примечание: использование этого хеша может обеспечить очень быстрый поиск, если индексом является дата-время (с точностью до секунд).
решение2
Ansible может генерировать собственные строки даты и времени и выполнять собственные суммы MD5 без вызова внешних программ. Рассмотрим:
---
- hosts: localhost
connection: local
tasks:
- debug:
msg: "{{ ansible_date_time.iso8601 | hash('md5') }}"
Обратите внимание, что ansible_date_time
содержит последний раз, когда вы собирали факты с удаленного сервера, не обязательно текущее время. Если вы всегда собираете факты при каждом запуске playbook, то это не должно быть проблемой.