Вывод задачи 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 можно записать в любом формате, который вам нравится.