Назад | Перейти на главную страницу

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

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

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

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

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

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

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

play.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"