Ansible-Task-Ausgabe in eine Datei im Ansible-Server

Ansible-Task-Ausgabe in eine Datei im Ansible-Server

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öchteStück Ansible-Code zum Schreiben der Ansible-Variable in output.log.

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.

Bildreferenz

Antwort1

Delegieren Sie die Aufgabe an localhost und verwenden Sielineinfileum 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 regexpAttribut 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.factRemote-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.factDateinamen
{% 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.

verwandte Informationen