Как получить журналы / подробные сведения о выполнении модуля ansible-playbook?


95

Скажем, я выполняю следующее.

$ cat test.sh
#!/bin/bash
echo Hello World
exit 0

$ cat Hello.yml
---

- hosts: MyTestHost
  tasks:
  - name: Hello yourself
    script: test.sh


$ ansible-playbook  Hello.yml

PLAY [MyTestHost] ****************************************************************

GATHERING FACTS ***************************************************************
ok: [MyTestHost]

TASK: [Hello yourself] ********************************************************
ok: [MyTestHost]

PLAY RECAP ********************************************************************
MyTestHost                    : ok=2    changed=0    unreachable=0    failed=0

$

Я точно знаю, что это было удачно.

Где / как мне увидеть "Hello World", отображаемое / напечатанное моим скриптом на удаленном хосте (MyTestHost)? Или код возврата / выхода из скрипта?

Мои исследования показывают, что можно было бы написать плагин для перехвата обратных вызовов выполнения модуля или чего-то еще в этих строках и записи файла журнала. Я бы предпочел не тратить на это свое время.

Например, что-то вроде stdout ниже (обратите внимание, что я использую ansible, а не ansible-playbook):

$ ansible plabb54 -i /project/plab/svn/plab-maintenance/ansible/plab_hosts.txt -m script -a ./test.sh
plabb54 | success >> {
    "rc": 0,
    "stderr": "",
    "stdout": "Hello World\n"
}

$

Ответы:


114

Если вы передадите -vфлаг в ansible-playbook в командной строке, вы увидите stdout и stderr для каждой выполненной задачи:

$ ansible-playbook -v playbook.yaml

Ansible также имеет встроенную поддержку ведения журнала. Добавьте следующие строки в свой файл конфигурации ansible :

[defaults] 
log_path=/path/to/logfile

Ansible будет искать конфигурационный файл в нескольких местах:

  • ansible.cfg в текущем каталоге, в котором вы запустили ansible-playbook
  • ~/.ansible.cfg
  • /etc/ansible/ansible.cfg

8
Спасибо. Просто жадный: могу ли я динамически запускать / останавливать логирование из плейбука? Вроде set -xи set +xв сценарии оболочки.
Kashyap

@thekashyap Я не думаю, что сейчас это возможно.
Lorin Hochstein

9
Вы можете использовать этот no_log: Trueфлаг, чтобы предотвратить регистрацию команды или плейбука, но я считаю, что это настолько детально, насколько это возможно.
Ade Miller

4
Не могли бы вы описать, как мне поставить, logrotateчтобы log_pathкаждый ansibleзапуск имел другой файл (с командой / playbook, включенной в файл)?
пенополистирол летать

Мне понадобилось три vсекунды, чтобы получить stdout и stderr
rich

24

Задача сценария playbook будет сгенерирована так stdoutже, как и команда non-playbook, ее просто нужно сохранить в переменной с помощью register. Как только мы его получим, модуль отладки сможет печатать в выходной поток playbook.

tasks:
- name: Hello yourself
  script: test.sh
  register: hello

- name: Debug hello
  debug: var=hello

- name: Debug hello.stdout as part of a string
  debug: "msg=The script's stdout was `{{ hello.stdout }}`."

Результат должен выглядеть примерно так:

TASK: [Hello yourself] ******************************************************** 
changed: [MyTestHost]

TASK: [Debug hello] *********************************************************** 
ok: [MyTestHost] => {
    "hello": {
        "changed": true, 
        "invocation": {
            "module_args": "test.sh", 
            "module_name": "script"
        }, 
        "rc": 0, 
        "stderr": "", 
        "stdout": "Hello World\r\n", 
        "stdout_lines": [
            "Hello World"
        ]
    }
}

TASK: [Debug hello.stdout as part of a string] ******************************** 
ok: [MyTestHost] => {
    "msg": "The script's stdout was `Hello World\r\n`."
}

но Алло себя задачу не дали каких - либо стандартный вывод
Саурабх Чандра Пател

Это мой предпочтительный метод. Научитесь использовать значения зарегистрированных переменных в операторах отладки, и мир - ваша устрица.
Джошуа К.

14

Существует также другой способ создания файла журнала.

Перед запуском ansible-playbookвыполните следующие команды, чтобы включить ведение журнала:

  • Укажите расположение файла журнала.

    экспорт ANSIBLE_LOG_PATH = ~ / ansible.log

  • Включить отладку

    экспорт ANSIBLE_DEBUG = True

  • Чтобы проверить созданный файл журнала.

    меньше $ ANSIBLE_LOG_PATH


1
ANSIBLE_DEBUG отличается от указания файла журнала. Это даже отдельно от выбора многословности! Это все еще очень хорошо, потому что отладка выдаст вам отладочные сообщения, ориентированные на разработчика, с абсолютно предельным уровнем детализации. Хорошо иметь рядом.
AlanSE

4

Официальные плагины

Вы можете использовать плагины обратного вызова вывода . Например, начиная с Ansible 2.4, вы можете использовать плагин обратного вызова вывода отладки :

# In ansible.cfg:
[defaults]
stdout_callback = debug

(В качестве альтернативы запустите export ANSIBLE_STDOUT_CALLBACK=debug перед запуском playbook)

Важно: вы должны запустить ansible-playbookс опцией -v( --verbose), чтобы увидеть эффект. После stdout_callback = debugустановки результат должен выглядеть примерно так:

TASK [Say Hello] ********************************
changed: [192.168.1.2] => {
    "changed": true,
    "rc": 0
}

STDOUT:


Hello!



STDERR:

Shared connection to 192.168.1.2 closed.

debugЕсли вы хотите, чтобы вывод был отформатирован по-другому, кроме модуля, есть и другие модули . Там же json, yaml, unixy, dense, minimalи т.д. ( полный список ).

Например, с stdout_callback = yamlвыводом будет примерно следующее:

TASK [Say Hello] **********************************
changed: [192.168.1.2] => changed=true 
  rc: 0
  stderr: |-
    Shared connection to 192.168.1.2 closed.
  stderr_lines:
  - Shared connection to 192.168.1.2 closed.
  stdout: |2-

    Hello!
  stdout_lines: <omitted>

Сторонние плагины

Если ни один из официальных плагинов вас не устраивает, вы можете попробовать его human_log. Есть несколько версий:


3

Используя плагины обратного вызова, вы можете получить стандартный вывод ваших команд в читаемой форме с помощью play: gist: human_log.py

Отредактируйте, например, вывод:

 _____________________________________
< TASK: common | install apt packages >
 -------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||


changed: [10.76.71.167] => (item=htop,vim-tiny,curl,git,unzip,update-motd,ssh-askpass,gcc,python-dev,libxml2,libxml2-dev,libxslt-dev,python-lxml,python-pip)

stdout:
Reading package lists...
Building dependency tree...
Reading state information...
libxslt1-dev is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 24 not upgraded.


stderr:

start:
2015-03-27 17:12:22.132237

end:
2015-03-27 17:12:22.136859

1

Справочная система Ansible, например, ansible-playbook --helpпоказывает, как повысить подробность вывода, задав для режима подробного вывода (-v) более подробный (-vvv) или подробный режим отладки соединения (-vvvv). Это должно дать вам некоторые подробности, которые вам нужны в stdout, которые затем можно будет зарегистрировать.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.