Я пишу сценарий, который будет проверять версию приложения на разных хостах и записывать вывод в переменную Ansible.
Мое требование - я хочу вывести переменную ansible в файл output.log.
Проблема в том, что переменная записывается в файл только для последнего хоста в инвентаре хостов, но я хочу, чтобы все хосты были добавлены в файл output.log.
решение1
Делегируйте задачу localhost и используйтеlineinfile
чтобы добавить его в свой файл:
- name: store info
lineinfile:
path: "/tmp/out.log"
regexp: "\\s{{ inventory_hostname }}$"
line: "{{ java_version.msg }} {{ inventory_hostname }}"
create: yes
delegate_to: localhost
Атрибут regexp
гарантирует, что старые записи будут заменены при повторном запуске сценария, если версия изменится.
решение2
Установите скрипт фактов /etc/ansible/facts.d/java.fact
на удаленных хостах и сделайте его исполняемым. Экранирование JSON для печати на стандартном выходе немного уродливо. Также уродливо парсить версию "number" из 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
- группы — это магический словарь inventory_hostname, индексированный по группе
- 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 могут быть записаны в любом формате, который вам нравится.