Salida de la tarea ansible a un archivo en el servidor ansible

Salida de la tarea ansible a un archivo en el servidor ansible

Estoy escribiendo un manual que verificará la versión de la aplicación en diferentes hosts y escribirá el resultado en una variable Ansible.

Mi requisito es que quiero generar la variable ansible en un archivo output.logPedazo de código ansible para escribir la variable ansible en output.log.

¿Cuál es el problema? La variable está escrita en el archivo solo para el último host en el inventario de hosts, pero quiero que todos los hosts se agreguen al archivo output.log.

Referencia de imagen

Respuesta1

Delegue la tarea a localhost y uselineinfilepara agregarlo a su archivo:

- name: store info
  lineinfile: 
    path: "/tmp/out.log"
    regexp: "\\s{{ inventory_hostname }}$"
    line: "{{ java_version.msg }} {{ inventory_hostname }}"
    create: yes
  delegate_to: localhost

El regexpatributo garantizará que las entradas antiguas se reemplacen cuando ejecute el libro de estrategias nuevamente y la versión haya cambiado.

Respuesta2

Instale un script de hechos en /etc/ansible/facts.d/java.facthosts remotos y hágalo ejecutable. Escapar de JSON para imprimir en formato estándar es un poco feo. También es feo analizar un "número" de versión de java -version. Aunque es posible que esté recopilando la versión de una manera diferente, ajuste el script según sea necesario.

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

Escriba una plantilla de Jinja para imprimir las líneas del número de versión en el formato deseado. Di que el archivo estemplates/javaversionreport.txt

  • grupos es un dictado mágico de inventario_hostname indexado por grupo
  • hostvars es un dictado mágico con las variables de otros hosts
  • ansible_local es la variable de "hechos locales"
  • java es del java.factnombre del archivo
{% for host in groups['hosts'] %}
{{ hostvars[host].ansible_local.java.java_version }} {{ host }}
{% endfor %}

Y juega a recopilar datos y redactar el informe. Ajuste el patrón de hosts como desee.

---
- 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

El renderizado de una plantilla se ejecuta más rápido que reescribir archivos con linefinfile. Aunque la recopilación de datos puede ser lenta. Además, las plantillas de Jinja se pueden escribir en cualquier formato que desee.

información relacionada