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
?
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
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
.