Назад | Перейти на главную страницу

Запись задачи Ansible в локальный файл журнала

Используя 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>