Вопрос или проблема
Вывод моих плейбуков всегда полностью захламлен бесполезным выводом о том, какие задачи были пропущены, что делает его раздражающим и трудоемким для поиска конкретной информации, которую мне нужно найти.
Вот пример плейбука:
- name: Остановка Puppet Agent
service: name=pe-puppet state=stopped
ignore_errors: true
register: result
- include: rollback/restart-pe-puppet.yml
when: result|failed
И связанный вывод:
TASK: [name | Остановка Puppet Agent] **************************************
<server.name> REMOTE_MODULE service name=pe-puppet state=stopped
changed: [server.name] => {"changed": true, "name": "pe-puppet", "state":"stopped"}
TASK: [name | judge_log msg='Перезапуск pe-puppet'] ***********************
skipping: [server.name]
TASK: [name | запуск pe-puppet] *****************************************
skipping: [server.name]
TASK: [name | judge_log msg='Успешный перезапуск pe-puppet'] ***************
skipping: [server.name]
TASK: [name | judge_log msg='Не удалось перезапустить pe-puppet' sec=FATAL] *********
skipping: [server.name]
TASK: [name | fail msg="Не удалось запустить pe-puppet."] **********************
skipping: [server.name]
TASK: [name | judge_log msg='{{APP_NAME | capitalize}} развертывание не удалось.'] ***
skipping: [server.name]
TASK: [name | fail msg="Развертывание {{APP_NAME | capitalize}} не удалось."] ***
skipping: [server.name]
Почти весь этот вывод бесполезен для меня. Параметр display_skipped_hosts
говорит, что он все равно вызывает появление заголовка задачи. Есть ли способ полностью исключить пропущенные задачи?
Я использую другой способ, не меняя никакой код:
Ansible использует плагин обратного вызова ‘default’ для отображения вывода, но вы можете использовать плагин обратного вызова ‘skippy’ вместо ‘default’. ‘skippy’ использует ‘default’, за исключением пропущенных задач.
Чтобы использовать плагин ‘skippy’, добавьте следующую строку (или раскомментируйте ее) в ваш файл ansible.cfg:
stdout_callback = skippy
Чтобы локализовать ваш ansible.cfg, используйте команду:
ansible --version
Если у вас нет этого файла, получите файл-пример из исходников ansible и скопируйте его в вашу рабочую папку, откуда вы вызываете ansible.
Теперь модуль skippy
устарел.
Создайте ansible.cfg
в корне вашего проекта и добавьте следующие инструкции:
[defaults]
display_skipped_hosts = no
Вы также можете отредактировать свой глобальный файл конфигурации /etc/ansible/ansible.cfg
.
Если документация говорит, что заголовок все еще появляется, то избежать этого не получится, если вы не измените поведение ansible, отредактировав код. Если вы все же настаиваете на редактировании, вы можете попробовать найти файл lib/ansible/callbacks.py
и добавить эту строку:
msg = ''
перед этой строкой
display(msg, color="cyan", runner=self.runner)
Это старая тема, но я наткнулся на эту проблему, когда пытался избежать вывода учетных данных в итерационных задачах (loop, with_*).
Решение заключалось в атрибуте no_log для задачи. Он может быть установлен на основе уровня детализации следующим образом:
- name: Печать данных Nextcloud
ansible.builtin.debug:
msg: "{{ item.key }}"
with_dict: "{{ nextcloud.linux_users }}"
when:
- nextcloud.linux_users is defined
- nextcloud.linux_users | length > 0
no_log: "{{ ansible_verbosity < 3 }}"
Из-за строки no_log: "{{ ansible_verbosity < 3 }}"
я должен вызывать ansible с параметрами -vvv
, чтобы снова вывести данные элементов.
Ответ или решение
Чтобы избежать вывода пропущенных задач в Ansible, вы можете воспользоваться следующими подходами.
1. Изменение стандартного плагина вывода
По умолчанию Ansible использует плагин вывода default
, который отображает все задачи, включая пропущенные. Вместо этого вы можете использовать плагин вывода skippy
, который игнорирует пропущенные задачи в выводе. Чтобы это сделать, вам нужно изменить ваш файл ansible.cfg
. Добавьте или измените следующую строку:
[defaults]
stdout_callback = skippy
Чтобы найти ваш файл ansible.cfg
, выполните команду:
ansible --version
Если у вас нет этого файла, вы можете взять пример из источников Ansible и скопировать его в вашу рабочую папку, откуда запускаете Ansible.
2. Изменение глобальной конфигурации
Если вы предпочтете изменить глобальные настройки, вы можете отредактировать файл /etc/ansible/ansible.cfg
и добавить следующую строку в секцию [defaults]
:
[defaults]
display_skipped_hosts = no
Это отключит отображение пропущенных задач в играх для всех проектов на вашей машине.
3. Использование параметра no_log
Если среди ваших задач есть те, которые вы не хотите видеть в выводе, особенно в контексте вывода конфиденциальной информации, вы можете использовать параметр no_log
. Например:
- name: Печать данных Nextcloud
ansible.builtin.debug:
msg: "{{ item.key }}"
with_dict: "{{ nextcloud.linux_users }}"
when:
- nextcloud.linux_users is defined
- nextcloud.linux_users | length > 0
no_log: "{{ ansible_verbosity < 3 }}"
В этом примере вывод будет скрыт, если уровень verbosity менее 3. Вы можете запускать Ansible с параметрами -vvv
, чтобы получать данные обратно.
4. Ручное изменение кода Ansible (не рекомендуется)
В качестве последнего варианта, если вы все же хотите полностью исключить заголовки пропущенных задач, вы можете вручную изменить исходный код Ansible. Для этого найдите файл lib/ansible/callbacks.py
и добавьте следующую строку перед вызовом display
:
msg = ''
Обратите внимание, что изменение исходного кода Ansible может привести к проблемам при обновлении программного обеспечения и не рекомендуется для долгосрочных решений.
Заключение
Используя один из указанных методов, вы сможете избежать ненужного вывода пропущенных задач в вашем окружении Ansible, что упростит анализ результатов выполнения ваших плейбуков. Если у вас есть дополнительные вопросы или требуется помощь, не стесняйтесь обращаться за поддержкой.