it-swarm.com.de

Ansible Aufgabe in lokale Protokolldatei schreiben

Mit Ansible möchte ich in der Lage sein, das Sysout einer Aufgabe, die einen Befehl ausführt, in eine lokale Protokolldatei (d. H. Auf dem verwalteten Server) zu schreiben. Im Moment kann ich dies nur mit einer Aufgabe wie dieser tun:

- name: Run my command
  Shell: <command> <arg1> <arg3> ... |tee -a <local log file>

Der Grund dafür ist, dass die Fertigstellung sehr lange dauert (d. H. Wir können nicht warten, bis sie fertig ist, um ihre Ausgabe zu erhalten) und die Ausgabe während ihrer Ausführung sammeln möchte.

Gibt es eine "Ansible" -Methode, um den Befehl während seiner Ausführung ohne Verwendung der Pipe tee zu sysout in eine lokale Protokolldatei umzuleiten?

3
trikelef

Sie müssen register in der ersten Aufgabe verwenden und können jetzt eine zweite Aufgabe erstellen, um die Ausgabe in eine lokale Datei zu schreiben

- name: Shell command
  Shell: my_Shell_command
  register: myshell_output
- name: copy the output to a local file
  copy:
    content: "{{ myshell_output.stdout }}"
    dest: "/tmp/hello.txt"
  delegate_to: localhost
4
c4f4t0r

Ein vernünftiger Standard und bei weitem das häufigste Muster besteht darin, die Aufgabe zu beenden und die Ausgabe am Ende zu registrieren. Es verfügt über eine asynchrone Funktion, Sie müssen jedoch den Job abfragen, den es in Ihrem Playbook erledigt.


Erwägen Sie stattdessen die Verwendung von Init-Skriptfunktionen als Hintergrund. Sie haben dieses Linux markiert, so etwas mit robuster Protokollierung ist in einer systemd-Einheit ziemlich einfach.

vmstat gibt Daten regelmäßig an stdout aus und ist ein einfaches Beispiel. Ich präsentiere den albernsten Weg, um die vmstat-Ausgabe zu protokollieren: /etc/systemd/system/dumbstat.service

[Unit]
Description=Dumb vmstat wrapper service example
Documentation=https://serverfault.com/questions/958952/ansible-task-write-to-local-log-file

[Service]
Type=oneshot
ExecStart=/usr/bin/vmstat 5 12
StandardOutput=journal

[Install]
WantedBy=multi-user.target

Type=oneshot wartet im Startzustand, bis der Prozess beendet wird. Möglicherweise möchten Sie einen anderen Typ, wenn Sie mehr von einer asynchronen Verzweigung möchten und das Verhalten fortsetzen möchten.

Standardausgang wird erfasst und ist über die üblichen Tools verfügbar.

[email protected]:/var/log# systemctl status dumbstat
● dumbstat.service - Dumb vmstat wrapper service example
   Loaded: loaded (/etc/systemd/system/dumbstat.service; disabled; vendor preset: enabled)
   Active: activating (start) since Wed 2019-03-20 14:49:41 UTC; 7s ago
     Docs: https://serverfault.com/questions/958952/ansible-task-write-to-local-log-file
 Main PID: 3103 (vmstat)
    Tasks: 1 (limit: 4401)
   CGroup: /system.slice/dumbstat.service
           └─3103 /usr/bin/vmstat -w 5 12

Mar 20 14:49:41 sf-958952 systemd[1]: Starting Dumb vmstat wrapper service example...
Mar 20 14:49:41 sf-958952 vmstat[3103]: procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
Mar 20 14:49:41 sf-958952 vmstat[3103]:  r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
Mar 20 14:49:41 sf-958952 vmstat[3103]:  7  0            0      3104416        70260       417228    0    0   208    36   40  132   1   1  98   0   0
Mar 20 14:49:46 sf-958952 vmstat[3103]:  0  0            0      3107200        70260       417260    0    0     0     0   40  130   1   0  99   0   0

Sie können die Ausgabe auch filtern, indem Sie das systemd-Journal abfragen: journalctl _SYSTEMD_UNIT=dumbstat.service

Standardmäßig wird das Journal an syslog weitergeleitet, wenn Sie eine lokale Datei oder irgendwo weiterleiten möchten.

Amüsanterweise kann System 240 und höher direkt in einer Datei mit StandardOutput=append: aber das ist zu neu für CentOS 7 oder Ubuntu 18.04.


All dies hat wenig mit Ansible zu tun. Sie können eine solche Einheit mit dem Modul template bereitstellen und mit dem Modul systemd starten.

1
John Mahowald