Используя Ansible, я хотел бы иметь возможность записывать системный вывод задачи, выполняющей команду, в локальный (то есть на управляемом сервере) файл журнала. На данный момент я могу сделать это только с помощью такой задачи:
- name: Run my command
shell: <command> <arg1> <arg3> ... |tee -a <local log file>
Причина в том, что для завершения требуется много времени (т. Е. Мы не можем ждать, пока он закончит получить свой вывод), и мы хотели бы собрать вывод во время его выполнения.
Есть ли какой-либо "Ansible" способ перенаправить sysout команды в локальный файл журнала во время ее выполнения без использования tee
труба?
Вам нужно использовать регистр в первой задаче, и теперь вы можете создать вторую задачу для записи вывода в локальный файл.
- 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
Ansible по умолчанию и, безусловно, наиболее распространенный шаблон, заключается в том, чтобы позволить задаче завершиться и зарегистрировать вывод в конце. Он имеет асинхронную функцию, однако вам нужно запросить задание, которое он выполняет в вашей книге.
Лучше подумайте об использовании функций сценария инициализации для его создания. Вы отметили этот Linux, такая штука с надежным журналированием довольно проста в модуле systemd.
vmstat регулярно выводит данные на стандартный вывод и представляет собой простой пример. Я представляю самый глупый способ записать вывод 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
будет ждать в начальном состоянии, пока процесс не завершится. Вам может потребоваться другой тип, если вы хотите больше асинхронной вилки и продолжения поведения.
Стандартный выход фиксируется и доступен через обычные инструменты.
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
Вы также можете отфильтровать вывод, запросив журнал systemd: journalctl _SYSTEMD_UNIT=dumbstat.service
По умолчанию журнал перенаправляется в системный журнал, если вы хотите получить локальный файл или куда-то его переслать.
Забавно, что система 240 и более поздние версии могут вести журнал прямо в файл с StandardOutput=append:
но это слишком ново для CentOS 7 или Ubuntu 18.04.
Все это не имеет ничего общего с Ansible. Вы можете развернуть такой блок с помощью template
модуль и запустите его с systemd
модуль.
Мне удалось запустить команду python с помощью оболочки и перенаправить вывод в локальный файл на том же хосте (то есть там, где была запущена моя книга воспроизведения) и просмотреть его, используя хвост -F файл_журнала пока выполнялась недоступная задача. Но это сработало только тогда, когда я дал исполняемый файл как / bin / bash
- name: Run Python tool
shell: "python3 -m pythontool &> log_file"
args:
executable: /bin/bash
- name: Run my command
shell: <command> <arg1> <arg3> ... >> <local log file>