Скажем, я хочу запускать задачу только в том случае, если в списке тегов, заданных в командной строке, указан НЕ , даже если указаны другие теги.Из них только последний будет работать, как я ожидаю, во всех ситуациях:
- hosts: all
tasks:
- debug:
msg: 'not TAG (won't work if other tags specified)'
tags: not TAG
- debug:
msg: 'always, but not if TAG specified (doesn't work; always runs)'
tags: always,not TAG
- debug:
msg: 'ALWAYS, but not if TAG in ansible_run_tags'
when: "'TAG' not in ansible_run_tags"
tags: always
Попробуйте его с различными вариантами CLI, и вы, надеюсь, поймете, почему я нахожу это немного озадачивающим:
ansible-playbook tags-test.yml -l HOST
ansible-playbook tags-test.yml -l HOST -t TAG
ansible-playbook tags-test.yml -l HOST -t OTHERTAG
Вопросы: а) это ожидаемое поведение?и (b) есть ли лучший способ или какая-то логика, которую я упускаю?
Я удивлен, что мне пришлось копаться в (недокументированной, AFAICT) переменной ansible_run_tags
.
Поправка: было предложено опубликовать мой фактический вариант использования.Я использую ansible для запуска обновлений системы в системах семейства Debian.В конце я пытаюсь уведомить, требуется ли перезагрузка , если не был указан тег reboot
, и в этом случае вызвать перезагрузку (и ждать, пока система вернется к работе).Вот соответствующий фрагмент:
- name: check and perhaps reboot
block:
- name: Check if a reboot is required
stat:
path: /var/run/reboot-required
get_md5: no
register: reboot
tags: always,reboot
- name: Alert if a reboot is required
fail:
msg: "NOTE: a reboot required to finish uppdates."
when:
- ('reboot' not in ansible_run_tags)
- reboot.stat.exists
tags: always
- name: Reboot the server
reboot:
msg: rebooting after Ansible applied system updates
when: reboot.stat.exists or ('force-reboot' in ansible_run_tags)
tags: never,reboot,force-reboot
Я думаю, что мой первоначальный вопрос (ы) все еще имеет свои достоинства, но я также готов принять альтернативные методы выполнения этой же функции.