Теги
Если у вас большой плейбук, может оказаться полезным умение запускать только определённую его часть, а не всё содержимое плейбука. Ansible поддерживает атрибут «tags:» для этой цели.
При выполнении плейбука вы можете фильтровать задачи на основе тегов двумя способами:
- В командной строке, с помощью опций
--tagsили--skip-tags - В настройках конфигурации Ansible, с помощью опций
TAGS_RUNиTAGS_SKIP
Теги могут быть применены к множеству структур в Ansible (см. «Наследование тегов» ниже), но их наиболее простое применение — с отдельными задачами. Вот пример, который применяет разные теги к двум задачам:
tasks:
- yum:
name: "{{ item }}"
state: present
loop:
- httpd
- memcached
tags:
- packages
- template:
src: templates/src.j2
dest: /etc/foo.conf
tags:
- configuration
Если вы хотите запустить только части «configuration» и «packages» очень длинного плейбука, вы можете использовать опцию --tags в командной строке:
ansible-playbook example.yml --tags "configuration,packages"
С другой стороны, если вы хотите запустить плейбук без определённых задач с тегами, вы можете использовать опцию командной строки --skip-tags
ansible-playbook example.yml --skip-tags "packages"
Повторное использование тегов
Вы можете применить один и тот же тег к нескольким задачам. Когда плей выполняется с использованием опции командной строки --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.
См. также
- Работа с плейбуками
- Введение в плейбуки
- Роли
- Организация плейбуков по ролям
- Список рассылки пользователей
- Есть вопросы? Задайте их в группе!
- irc.freenode.net
- Канал IRC-чата #ansible
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.8/user_guide/playbooks_tags.html