Как использовать вывод команды внутри значения ini_file ansible

Как использовать вывод команды внутри значения ini_file ansible

Я хотел установить значение внутри 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, то это не должно быть проблемой.

Связанный контент