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.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.
Respuesta1
Delegue la tarea a localhost y uselineinfile
para 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 regexp
atributo 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.fact
hosts 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.fact
nombre 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.