Як отримати журнали / деталі виконання модуля 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"
}

$

Відповіді:


113

Якщо ви передасте -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прапорець, щоб запобігти реєстрації команди або ігрової книги, але я вважаю, що це настільки дрібно детально.
Аде Міллер,

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

Мені знадобилося три v
багатий

24

Завдання сценарію playbook генерується так stdoutсамо, як і команда не-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

  • Увімкнути налагодження

    export ANSIBLE_DEBUG = Правда

  • Щоб перевірити створений файл журналу.

    менше $ ANSIBLE_LOG_PATH


1
ANSIBLE_DEBUG є певним чином відокремленим від зазначення файлу журналу. Це навіть окремо від вибору багатослів'я! Це все ще дуже добре закликати - налагодження надаватиме вам орієнтовані на розробника повідомлення про налагодження на абсолютно екстремальному рівні деталізації. Добре мати поруч.
AlanSE

4

Офіційні плагіни

Ви можете використовувати вихідні плагіни зворотного виклику . Наприклад, починаючи з Ansible 2.4, ви можете використовувати плагін зворотного виклику налагодження :

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

(Альтернативно, запустіть export ANSIBLE_STDOUT_CALLBACK=debugперед запуском вашої книги ігор )

Важливо: ви повинні працювати ansible-playbookз -v( --verboseопція) , щоб побачити ефект. Якщо stdout_callback = debugвстановити set, результат повинен виглядати приблизно так:

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

Використовуючи плагіни зворотного виклику, ви можете отримати stdout своїх команд у вихідному для читання вигляді за допомогою 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.