Вывод задачи Ansible в файл на сервере Ansible

Я пишу сборник сценариев, который будет проверять версию приложения на разных хостах и ​​записывать выходные данные в переменную Ansible.

Мое требование: я хочу вывести переменную ansible в файл output.log .

Проблема в том, что переменная записывается в файл только для последнего хоста в списке хостов, но я хочу, чтобы все хосты были добавлены в файл output.log.

1 ответ

Установите скрипт фактов, чтобы/etc/ansible/facts.d/java.factна удаленных хостах и ​​сделайте его исполняемым. Экранировать JSON для печати на стандартном выходе немного некрасиво. Также некрасиво анализировать «номер» версии изjava -version. Хотя вы можете собирать версию другим способом, при необходимости скорректируйте скрипт.

      #!/bin/sh
JAVA_VERSION=$(java -version 2>&1  | grep version | cut -d '"' -f 2)
printf "{\"java_version\": \"${JAVA_VERSION}\"}\n"

Напишите шаблон Jinja для печати строк номера версии в нужном формате. Скажем, файлtemplates/javaversionreport.txt

  • группы — это магический словарь инвентаризации_имя_хоста, индексируемый группой
  • Hostvars — это волшебный словарь с переменными других хостов
  • ansible_local — переменная «локальных фактов».
  • Java изjava.factимя файла
      {% for host in groups['hosts'] %}
{{ hostvars[host].ansible_local.java.java_version }} {{ host }}
{% endfor %}

И играет, чтобы собрать факты и написать отчет. Настройте шаблон хостов по желанию.

      ---
- hosts: hosts
  gather_facts: True
  fact_path: /etc/ansible/facts.d


- hosts: localhost
  gather_facts: False

  tasks:
  - template:
      src: javaversionreport.txt
      dest: /tmp/out.log

Рендеринг одного шаблона выполняется быстрее, чем перезапись файлов с помощью linefinfile. Хотя сбор фактов может быть медленным. Кроме того, шаблоны Jinja можно записать в любом формате, который вам нравится.

Другие вопросы по тегам