Контекст
У меня есть Ansible playbook, который включает в себя очень длительную задачу, до одного часа.
Очень упрощенно это выглядит так:
- hosts: localhost
tasks:
- name: Short task
debug:
msg: "I'm quick!"
- name: Long task
shell: "sleep 15s"
Когда пользователь запускает плейбук, сначала выводится следующее:
PLAY [localhost] ********************
TASK [Gathering Facts] **************
ok: [127.0.0.1]
TASK [Short task] *******************
ok: [127.0.0.1] => {
"msg": "I'm quick!"
}
(hang there until Long task is done)
TASK [Long task] ********************
changed: [127.0.0.1]
Проблема
Конечные пользователи сценария считают, что проблема в Short task
том, что он зависает, хотя именно это Long task
и вызывает задержку.
Вопрос
Как мне настроить ansible или playbook для печати заголовков, определенных вname:
довыполнение задания?
Я хочу добиться примерно такого результата:
PLAY [localhost] ********************
TASK [Gathering Facts] **************
ok: [127.0.0.1]
TASK [Short task] *******************
ok: [127.0.0.1] => {
"msg": "I'm quick!"
}
TASK [Long task] ********************
(and hang there during the execution)
changed: [127.0.0.1]
решение1
Переношу свой комментарий в ответ по просьбе ОП
Я использую Ansible 2.9.2.
Я пробовал без файла конфигурации и с файлом конфигурации без объявленного значения stdout_callback
(по умолчанию). Я не могу воспроизвести вашу проблему ни в одном из случаев.
Вот мой тестовый план:
---
- hosts: localhost
gather_facts: false
tasks:
- name: Short running
debug:
msg: I'm a short task
- name: LOOOOOOOOOng task
shell: sleep 2000
И результат (в обоих случаях. Примечание: прерывание пользователем после отображения заголовка задачи)
$ ansible-playbook /tmp/play.yml
PLAY [localhost] **************************************************************************************************************************************************************************************************
TASK [Short running] **********************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": "I'm a short task"
}
TASK [LOOOOOOOOOng task] ******************************************************************************************************************************************************************************************
^C [ERROR]: User interrupted execution
Дважды проверьте, какой файл конфигурации вы загружаете ansible-playbook --version
в каталоге, где вы собираетесь запустить плейбук. Я также предлагаю вам попробовать без какого-либо файла конфигурации, чтобы посмотреть, исправит ли это вашу проблему (а затем посмотреть, какая настройка на самом деле вызывает проблему).
Добавлено из комментария OP: оказывается, проблемная настройка в ansible.cfg в данном конкретном случае былаdisplay_skipped_hosts=False
решение2
Файл display_skipped_hosts=false
/etc/ansible/ansible.cfg исправил это для меня.
Это баг? Мне не нравится видеть пропущенные хосты, но мне нравится видеть прогресс моей пьесы.
Использование Ansible 2.10.3
решение3
Для тех, кто все еще хочет скрыть пропущенные задачи, теперь есть две возможности:
- Используяплагин обратного вызова по умолчаниюи установка
display_skipped_hosts = False
иshow_per_host_start = True
, это добавит еще одну строку журнала при запуске каждой задачи, однако это не вернет поведение, при котором заголовок просто выводится вовремя (и каким-то образом иногда появляется после того, как задача уже выполнена, что затрудняет чтение) - Продолжайте использовать (теперь устарело)плагин skippyкоторый был плагином go to до того, как плагин по умолчанию получил функцию пропуска. Он по-прежнему работает, как и ожидалось, с 2.11 и также является моим предпочтительным исправлением этого. Установите
stdout_callback = skippy
в ansible.cfg. Просто чтобы убедиться, что я также добавил плагин в белый список с помощьюcallback_enabled = ansible.posix.skippy
Мой ansible.cfg теперь выглядит так, и все работает так же, как и раньше. Я перешел на последнюю версию ansible.cfg со значениями по умолчанию:
[default]
# ...
stdout_callback = skippy
# if you had other plugins here just add to list, comma seperated
callback_enabled = ansible.posix.skippy
# deprecated flag, sometimes still needed, hence I always set both
callback_whitelist = ansible.posix.skippy
# ...
Дальнейшее чтение:
- Тикет по вопросу:https://github.com/ansible/ansible/issues/51042
- PR, который представил функцию плагина по умолчанию для добавления вывода задачи запускаhttps://github.com/ansible/ansible/pull/53819
- Последние документы для плагина по умолчаниюhttps://docs.ansible.com/ansible/latest/collections/ansible/builtin/default_callback.html
- Последние документы плагина skippyhttps://docs.ansible.com/ansible/latest/collections/ansible/posix/skippy_callback.html
- Как настроить плагины обратного вызоваhttps://docs.ansible.com/ansible/latest/plugins/callback.html
решение4
В моем случае я использовал «бесплатную» стратегию, которая не отображала заголовок до завершения задачи.