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

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

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

Мое требование - я хочу вывести переменную ansible в файл output.logФрагмент кода 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 могут быть записаны в любом формате, который вам нравится.

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