web-dev-qa-db-fra.com

Écriture de tâche impossible dans le fichier journal local

En utilisant Ansible, j'aimerais pouvoir écrire le sysout d'une tâche exécutant une commande dans un fichier journal local (c'est-à-dire sur le serveur géré). Pour le moment, je ne peux le faire qu'en utilisant une tâche comme celle-ci:

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

La raison en est que le processus prend beaucoup de temps (c'est-à-dire que nous ne pouvons pas attendre qu'il se termine pour obtenir sa sortie) et que nous aimerions collecter la sortie pendant son exécution.

Existe-t-il un moyen "Ansible" de rediriger vers sysout de la commande vers un fichier journal local pendant son exécution sans utiliser le canal tee?

3
trikelef

Vous devez utiliser le registre dans la première tâche et maintenant, vous pouvez créer une deuxième tâche pour écrire la sortie dans un fichier local

- 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

Un défaut par défaut, et de loin le modèle le plus courant, consiste à laisser la tâche se terminer et à enregistrer la sortie à la fin. Il a une fonction asynchrone, mais vous devez interroger le travail qu'il fait dans votre playbook.


Envisagez plutôt d'utiliser les fonctionnalités du script init pour le mettre en arrière-plan. Vous avez marqué ce Linux, une telle chose avec une journalisation robuste est assez facile dans une unité systemd.

vmstat fournit régulièrement des données à stdout et constitue un exemple simple. Je présente la manière la plus idiote de consigner la sortie de vmstat: /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 attendra dans un état de démarrage jusqu'à la fin du processus. Vous pouvez vouloir un type différent si vous voulez plus d'une fourchette asynchrone et continuez le comportement.

La sortie standard est capturée et disponible via les outils habituels.

root@sf-958952:/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

Vous pouvez également filtrer la sortie en interrogeant le journal systemd: journalctl _SYSTEMD_UNIT=dumbstat.service

Par défaut, le journal est transféré vers syslog, si vous souhaitez un fichier local ou le transférer quelque part.

De manière amusante, le système 240 et les versions ultérieures peuvent se connecter directement à un fichier avec StandardOutput=append: mais c'est trop nouveau pour CentOS 7 ou Ubuntu 18.04.


Tout cela n'a pas grand-chose à voir avec Ansible. Vous pouvez déployer une telle unité avec le module template et la démarrer avec le module systemd.

1
John Mahowald