Ich schreibe ein Playbook, das die Anwendungsversion auf verschiedenen Hosts überprüft und die Ausgabe in eine Ansible-Variable schreibt.
Meine Anforderung ist, dass ich die Ansible-Variable in eine Datei output.log ausgeben möchte.
Das Problem ist, dass die Variable nur für den letzten Host im Host-Inventar in die Datei geschrieben wird. Ich möchte jedoch, dass alle Hosts in die Datei output.log angehängt werden.
Antwort1
Delegieren Sie die Aufgabe an localhost und verwenden Sielineinfile
um es zu Ihrer Datei hinzuzufügen:
- name: store info
lineinfile:
path: "/tmp/out.log"
regexp: "\\s{{ inventory_hostname }}$"
line: "{{ java_version.msg }} {{ inventory_hostname }}"
create: yes
delegate_to: localhost
Das regexp
Attribut stellt sicher, dass alte Einträge ersetzt werden, wenn Sie das Playbook erneut ausführen und sich die Version geändert hat.
Antwort2
Installieren Sie ein Facts-Skript auf /etc/ansible/facts.d/java.fact
Remote-Hosts und machen Sie es ausführbar. Das Escapen von JSON zum Drucken auf Standardausgabe ist etwas hässlich. Ebenso hässlich ist das Parsen einer Versionsnummer aus java -version
. Auch wenn Sie die Version möglicherweise auf eine andere Weise erfassen, passen Sie das Skript nach Bedarf an.
#!/bin/sh
JAVA_VERSION=$(java -version 2>&1 | grep version | cut -d '"' -f 2)
printf "{\"java_version\": \"${JAVA_VERSION}\"}\n"
Schreiben Sie eine Jinja-Vorlage, um die Versionsnummernzeilen im gewünschten Format auszudrucken. Angenommen, die Datei isttemplates/javaversionreport.txt
- groups ist ein magisches Dict von inventory_hostname, indiziert nach Gruppe
- hostvars ist ein magisches Diktierprogramm mit Variablen anderer Hosts
- ansible_local ist die Variable „lokale Fakten“
- java ist aus dem
java.fact
Dateinamen
{% for host in groups['hosts'] %}
{{ hostvars[host].ansible_local.java.java_version }} {{ host }}
{% endfor %}
Und spielt, um Fakten zu sammeln und den Bericht zu schreiben. Passen Sie das Hosts-Muster nach Wunsch an.
---
- 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
Das Rendern einer Vorlage läuft schneller als das Neuschreiben von Dateien mit Linefinfile. Allerdings kann das Sammeln von Fakten langsam sein. Außerdem können Jinja-Vorlagen in jedem beliebigen Format geschrieben werden.