Рейтинг:1

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

флаг ve

Я хотел установить значение внутри ini_file, но это значение является хешем MD5 текущего времени. (Я не боюсь случайно заменить значение или волшебным образом запустить его дважды и иметь одно и то же значение на двух разных серверах.)

Это то, что я пробовал, но получил только команду в качестве значения в файле (не знаю, почему я думал, что это сработает...):

- имя: заменить HardwareID на новый MD5
      ini_файл:
        путь: /etc/app/config.ini
        раздел: ПО УМОЛЧАНИЮ
        опция: hardware_token
        значение: $(дата | md5sum | вырезать -d" " -f1)

Есть ли простой способ заставить его работать?

Michael Hampton avatar
флаг cz
Это просто md5sum какой-то случайной строки. Важно ли, в каком формате находится строка?
Рейтинг:1
флаг cz

Ansible может генерировать свои собственные строки даты и времени и вычислять свои собственные суммы MD5, не обращаясь к внешним программам. Рассмотреть возможность:

---
- хосты: локальный
  подключение: местное
  задачи:
    - отладка:
        сообщение: "{{ ansible_date_time.iso8601 | хэш ('md5') }}"

Обратите внимание, что ansible_date_time содержит последний раз, когда вы собирали факты с удаленного сервера, не обязательно текущее время. Если вы всегда собираете факты при каждом запуске playbook, то это не должно быть проблемой.

Guilherme Richter avatar
флаг ve
Я не знал, что у Ansible есть эти нативные «функции». Рад, что задал этот вопрос.
Рейтинг:0
флаг br

Вопрос: "Как использовать вывод команды внутри значения Ansible ini_file?"

A: Зарегистрируйте результат команды и используйте его в качестве значения, например.

- хосты: test_24
  сбор_фактов: ложь
  задачи:
    - оболочка: 'дата | md5sum | вырезать -d" " -f1'
      регистрация: результат
      check_mode: ложь
    - отладка:
        переменная: результат
    - имя: заменить HardwareID на новый MD5
      ini_файл:
        путь: etc/app/config.ini
        раздел: ПО УМОЛЧАНИЮ
        опция: hardware_token
        значение: "{{результат.stdout }}"

дает (работает с --check --diff)

ЗАДАЧА [Заменить HardwareID новым MD5] **************************************
--- до: etc/app/config.ini (содержимое)
+++ после: etc/app/config.ini (содержимое)
@@ -0,0 +1,3 @@
+
+[ПО УМОЛЧАНИЮ]
+ hardware_token = ba3f11c4f1ecfe9d1e805dc8c8c8b149

изменено: [test_24]

Факты Ansible проще использовать, если вы хотите использовать данные и время в качестве входных данных. Например, словарь ansible_date_time сохраняет дату и время, если вы собираете факты. В плейбуке мы установили сбор_фактов: ложь. Поэтому словарь не определен

    - отладка:
        переменная: ansible_date_time.iso8601

дает

хорошо: [test_24] => 
  ansible_date_time.iso8601: ПЕРЕМЕННАЯ НЕ ОПРЕДЕЛЕНА!

Вам придется либо собрать факты собрать_факты: правда когда вы начинаете играть или бежать настраивать, например

    - настраивать:
        collect_subset: мин.
    - отладка:
        переменная: ansible_date_time.iso8601

дает

хорошо: [test_24] => 
  ansible_date_time.iso8601: '2021-07-29T21:32:26Z'

Это не очень практично, потому что для получения текущего времени вам нужно запустить настраивать. Вместо этого фильтр strftime дает вам всегда текущее время, например.

    - отладка:
        msg: "{{ '%Y-%m-%d %H:%M:%S' | strftime }}"

    - имя: заменить HardwareID на новый MD5
      ini_файл:
        путь: etc/app/config.ini
        раздел: ПО УМОЛЧАНИЮ
        опция: hardware_token
        значение: "{{'%Y-%m-%d' | strftime | hash('md5') }}"

дает

ЗАДАЧА [отладка] **************************************************** *****************
хорошо: [test_24] => 
  сообщение: '2021-07-29'

ЗАДАЧА [Заменить HardwareID на новый MD5] ****************************************
--- до: etc/app/config.ini (содержимое)
+++ после: etc/app/config.ini (содержимое)
@@ -0,0 +1,3 @@
+
+[ПО УМОЛЧАНИЮ]
+hardware_token = 5847924805aa614957022ed73d517e7e

В качестве примечания: использование этого хеша может быть очень быстрым поиском, если дата-время (с точностью до секунд) является индексом.

Guilherme Richter avatar
флаг ve
Ничего себе, я понятия не имел, что могу сделать некоторые из этих вещей в ansible. Кроме того, предлагаемое вами решение намного лучше, чем «просто возьмите вывод оболочки и используйте значение».

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.