Ansible: проверьте правильность предоставленных тегов перед запуском сценария

Ansible: проверьте правильность предоставленных тегов перед запуском сценария

Подозреваю, что это попытка быть слишком умным (и неудачная), но - особенно при разработке PB - очень полезно использовать теги для ограничения выполняемых ролей - например, у нас есть: (фрагмент сценария) ...

 - { role: yum,      tags: [ 'yum' ] }
 - { role: proxy,    tags: [ 'proxy' ]  }
 - { role: firewall, tags: [ 'firewall' ] }

Теперь иногда я запускаю тег с ошибкой, например

$ ansible-playbook servername, user=fred  my_playbook --tags=firewal

И предварительные задачи запускаются, как и постзадачи, что создает видимость того, что что-то происходит, но, конечно, ни одна задача не соответствует неправильно введенному тегу. Я это замечаю в журнале (каждая роль делает это):

- include_tasks: includes/log_role_completion.yml this_role={{ role_name }}

что приводит к следующему:

- name: "Setup completed_roles list"
  set_fact:
    completed_roles: "{{ this_role }}"
  changed_when: false
  when: completed_roles is not defined

- name: "Add role to list of completed roles"
  set_fact:
    completed_roles: "{{ completed_roles }} {{ this_role }}"
  changed_when: false
  when: completed_roles != this_role

Затем роль post_tasks записывает список завершенных ролей - или сообщение о том, что ни одна из них не была запущена, возможно, из-за неправильно написанного тега. Это работает хорошо - и я знаю, что ansible пишет логи, но они либо многословны, либо криптичны, и мне нравится иметь /var/log/ansible на цели с чем-то вроде этого:

Ansible version 2.6.2 run commenced at 2018-08-31: 20:23:40 GMT using account vmw-user
Ansible version 2.6.2 run completed at 2018-08-31: 20:23:40 GMT for roles chrony, proxy, and log_complete

Это действительно полезно, НО (и вот, наконец, вопрос) я бы предпочел, чтобы сценарий проверял, предоставлен ли тег, не соответствующий ни одному тегу, используемому в сценарии, и останавливался, тем самым предупреждая меня о том, что я неправильно написал что-то. Это также предотвратит неполное выполнение сценария — роль с неправильно написанным тегом вообще не будет запущена, что может вызвать проблему.

Переменная vars.ansible_run_tags содержит теги, предоставленные пользователем: есть ли способ узнать, какие теги установлены в плейбуке? Я не хочу сначала запускать в режиме проверки и вручную анализировать вывод — я бы хотел, чтобы это было автоматически.

решение1

IMHO такой переменной, чтобы "посмотреть, какие теги установлены в плейбуке", нет. Есть толькоansible_run_tagsиansible_skip_tags. Боюсь, единственным вариантом будет написать оболочку ansible-playbook для проверки наличия предоставленных тегов в playbook («сначала запустить в режиме проверки и вручную проанализировать вывод»).

Кстати. Ниже приведен упрощенный список выполненных ролей.

completed_roles: "{{ completed_roles|default('') }} {{ this_role }}"

Чтобы избежать «запуска предварительных задач, а также последующих задач, из-за чего создается впечатление, что что-то происходит», вы можете использоватьимпорт_ролейикогдаусловие вместо тегов. Ниже приведен пример, где role3.yml и role4.yml печатают только сообщение.

играть.yml

- hosts:
    - localhost
  tasks:
    - import_role: name=role3
      when: selector|default('') in [ 'role3', 'all_roles' ]
    - import_role: name=role4
      when: selector|default('') in [ 'role4', 'all_roles' ]

.

> ansible-playbook -e selector=role4 play.yml | grep msg
    "msg": "role4"

.

> ansible-playbook -e selector=all_roles play.yml | grep msg
    "msg": "role3"
    "msg": "role4"

Связанный контент