Теги
Если у вас есть большой плейбук, может быть полезно возможность запускать только определенную часть, а не всё сразу. Ansible поддерживает атрибут «tags:” для этой цели.
При выполнении плейбука, вы можете отфильтровать задачи на основе тегов двумя способами:
- В командной строке с помощью опций
--tagsили--skip-tags - В настройках конфигурации Ansible с помощью опций
TAGS_RUNиTAGS_SKIP
Теги могут быть применены к многим структурам в Ansible (см. «Наследование тегов», ниже), но их наиболее простое использование — с отдельными задачами. Вот пример, который добавляет теги к двум задачам с разными тегами:
tasks:
- yum:
name: "{{ item }}"
state: installed
loop:
- httpd
- memcached
tags:
- packages
- template:
src: templates/src.j2
dest: /etc/foo.conf
tags:
- configuration
Если вы хотите запустить только часть «настройка» и «пакеты» очень длинного плейбука, вы можете использовать опцию --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: installed
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.7/user_guide/playbooks_tags.html