Теги
Если у вас большой плейбук, может оказаться полезным возможность запускать только определённую часть его, вместо запуска всего плейбука. Ansible поддерживает атрибут «tags:» для этой цели.
Теги могут применяться к многим структурам в Ansible (см. «наследование тегов», ниже), но его простейшее использование — с отдельными задачами. Вот пример, который применяет разные теги к двум задачам:
tasks:
- yum:
name:
- httpd
- memcached
state: present
tags:
- packages
- template:
src: templates/src.j2
dest: /etc/foo.conf
tags:
- configuration
При выполнении плейбука вы можете фильтровать задачи на основе тегов двумя способами:
- В командной строке с опциями
--tagsили--skip-tags - В настройках конфигурации Ansible с опциями
TAGS_RUNиTAGS_SKIP
Например, если вы хотите запустить только часть «конфигурация» и «пакеты» очень длинного плейбука, вы можете использовать опцию --tags в командной строке:
ansible-playbook example.yml --tags "configuration,packages"
С другой стороны, если вы хотите запустить плейбук без определённых задач с тегами, вы можете использовать опцию командной строки --skip-tags
ansible-playbook example.yml --skip-tags "packages"
Вы можете увидеть, какие задачи будут выполнены с помощью --tags или --skip-tags, комбинируя это с --list-tasks:
ansible-playbook example.yml --tags "configuration,packages" --list-tasks
Предупреждение
- Сбор фактов по умолчанию имеет тег ‘всегда’. Он пропускается ТОЛЬКО, если вы применяете тег, а затем используете другой тег в
--tagsили тот же тег в--skip-tags.
Повторное использование тегов
Вы можете применить один и тот же тег к нескольким задачам. Когда плей выполняется с помощью опции командной строки --tags, все задачи с этим именем тега будут выполнены.
В этом примере несколько задач помечены одним тегом «ntp»:
---
# file: roles/common/tasks/main.yml
- name: be sure ntp is installed
yum:
name: ntp
state: present
tags: ntp
- name: be sure ntp is configured
template:
src: ntp.conf.j2
dest: /etc/ntp.conf
notify:
- restart ntpd
tags: ntp
- name: be sure ntpd is running and enabled
service:
name: ntpd
state: started
enabled: yes
tags: ntp
Наследование тегов
Добавление tags: к плейбуку или к статически импортированным задачам и ролям добавляет эти теги ко всем содержащимся задачам. Это называется наследованием тегов. Наследование тегов не применяется к динамическим включениям, таким как include_role и include_tasks.
Когда вы применяете атрибуты tags: к структурам, отличным от задач, Ansible обрабатывает атрибут тега, чтобы применить его ТОЛЬКО к содержащимся в них задачам. Применение тегов в местах, отличных от задач, — это просто удобство, чтобы вам не приходилось помечать задачи индивидуально.
В этом примере все задачи в двух плейбуках помечены тегами. Первый плейбук имеет все свои задачи, помеченные тегом ‘bar’, а второй — все задачи с тегом ‘foo’:
- hosts: all
tags:
- bar
tasks:
...
- hosts: all
tags: [ foo ]
tasks:
...
Вы также можете применить теги к задачам, импортированным с помощью roles:
roles:
- role: webserver
vars:
port: 5000
tags: [ web, foo ]
И к import_role: и import_tasks: операторам:
- import_role:
name: myrole
tags: [ web, foo ]
- import_tasks: foo.yml
tags: [ web, foo ]
Всё это применяет указанные теги к каждой задаче внутри плейбука, импортированного файла или роли, так что эти задачи можно избирательно запускать при вызове плейбука с соответствующими тегами.
Теги применяются вниз по цепочке зависимостей. Чтобы тег унаследовался задачами зависимой роли, он должен быть применён к объявлению роли или статическому импорту, а не ко всем задачам внутри роли.
Нет способа «импортировать только эти теги»; вы, вероятно, захотите разделить на более мелкие роли/включения, если обнаружите необходимость в такой функции.
Вышеизложенное не относится к include_tasks или другим динамическим включениям, так как атрибуты, применённые к включению, влияют только на само включение.
Вы можете увидеть, какие теги применяются к задачам, ролям и статическим импортам, выполнив ansible-playbook с опцией --list-tasks. Вы можете отобразить все доступные теги с опцией --list-tags.
Примечание
Вышеизложенное не относится к include_tasks, include_roles, или другим динамическим включениям. Теги, применённые к любому из них, применяются только к самому включению.
Для использования тегов с задачами и ролями, предназначенными для динамических включений, все необходимые задачи должны быть явно помечены на уровне задачи; или block: может использоваться для одновременной маркировки нескольких задач. Само включение также должно быть помечено тегом.
Вот пример маркировки задач роли тегом mytag, используя оператор block, для последующего использования с динамическим включением:
Файл плейбука:
- hosts: all
tasks:
- include_role:
name: myrole
tags: mytag
Файл задач роли:
- block:
- name: First task to run
...
- name: Second task to run
...
tags:
- mytag
Специальные теги
Пример:
tasks:
- debug:
msg: "Always runs"
tags:
- always
- debug:
msg: "runs when you use tag1"
tags:
- tag1
Новое в версии 2.5.
Ещё один специальный тег — never, который предотвращает выполнение задачи, если тег не запрошен явно.
Пример:
tasks:
- debug: msg="{{ showmevar }}"
tags: [ never, debug ]
В этом примере задача будет выполняться только при явном запросе тега debug или never.
Существует ещё 3 специальных ключевых слова для тегов: tagged, untagged и all, которые запускают только тегированные, только нетегированные и все задачи соответственно.
По умолчанию Ansible работает так, как будто был указан --tags all.
См. также
- О плейбуках
- Введение в плейбуки
- Роли
- Организация плейбука с помощью ролей
- Список рассылки пользователей
- Есть вопрос? Загляните на google группу!
- irc.freenode.net
- #ansible чат канала IRC
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.9/user_guide/playbooks_tags.html