Теги
- Добавьте теги к вашим задачам, либо индивидуально, либо с наследованием тегов из блока, плей, роли или импорта.
- Выберите или пропустите теги при запуске плейбука.
Добавление тегов с помощью ключевого слова tags
Вы можете добавить теги к одной задаче или включению. Вы также можете добавить теги к нескольким задачам, определив их на уровне блока, плей, роли или импорта. Ключевое слово tags охватывает все эти случаи использования. Ключевое слово tags всегда определяет теги и добавляет их к задачам; оно не выбирает и не пропускает задачи для выполнения. Вы можете выбирать или пропускать задачи только на основе тегов в командной строке при запуске плейбука. Подробнее см. Выбор или пропуск тегов при запуске плейбука.
Добавление тегов к отдельным задачам
На самом простом уровне вы можете применить один или несколько тегов к отдельной задаче. Вы можете добавлять теги к задачам в плейбуках, в файлах задач или в рамках роли. Вот пример, который добавляет теги к двум задачам с различными тегами:
tasks:
- name: Install the servers
ansible.builtin.yum:
name:
- httpd
- memcached
state: present
tags:
- packages
- webservers
- name: Configure the service
ansible.builtin.template:
src: templates/src.j2
dest: /etc/foo.conf
tags:
- configuration
Вы можете применить один и тот же тег к нескольким отдельным задачам. В этом примере несколько задач помечены одним тегом «ntp»:
---
# file: roles/common/tasks/main.yml
- name: Install ntp
ansible.builtin.yum:
name: ntp
state: present
tags: ntp
- name: Configure ntp
ansible.builtin.template:
src: ntp.conf.j2
dest: /etc/ntp.conf
notify:
- restart ntpd
tags: ntp
- name: Enable and run ntpd
ansible.builtin.service:
name: ntpd
state: started
enabled: yes
tags: ntp
- name: Install NFS utils
ansible.builtin.yum:
name:
- nfs-utils
- nfs-util-lib
state: present
tags: filesharing
Если бы вы запустили эти четыре задачи в плейбуке с --tags ntp, Ansible выполнил бы три задачи, помеченные ntp, и пропустил бы одну задачу, у которой нет этого тега.
Добавление тегов к включениям
Вы добавляете теги к включениям так же, как добавляете теги к любой другой задаче:
--- # file: roles/common/tasks/main.yml - name: Dynamic re-use of database tasks include_tasks: db.yml tags: db
Вы можете добавить тег только к динамическому включению роли. В этом примере тег foo будет not применяться к задачам внутри роли bar:
---
- hosts: webservers
tasks:
- name: Include the bar role
include_role:
name: bar
tags:
- foo
С плей, блоками, ключевым словом role, и статическими импортами Ansible применяет наследование тегов, добавляя определённые вами теги ко всем задачам внутри плей, блока, роли или импортированного файла. Однако наследование тегов не применяется к динамическому повторному использованию с include_role и include_tasks. При динамическом повторном использовании (включениях) определённые вами теги применяются только к самому включению. Если вам нужно наследование тегов, используйте статический импорт. Если вы не можете использовать импорт, потому что остальная часть вашего плейбука использует включения, см. Наследование тегов для включений: блоки и ключевое слово apply, чтобы узнать способы решения этой проблемы.
Наследование тегов: добавление тегов к нескольким задачам
Добавление тегов к блокам
Если вы хотите применить тег к многим, но не ко всем задачам в вашем плей, используйте блок и определите теги на этом уровне. Например, мы можем отредактировать пример NTP, показанный выше, чтобы использовать блок:
# myrole/tasks/main.yml
tasks:
- name: ntp tasks
tags: ntp
block:
- name: Install ntp
ansible.builtin.yum:
name: ntp
state: present
- name: Configure ntp
ansible.builtin.template:
src: ntp.conf.j2
dest: /etc/ntp.conf
notify:
- restart ntpd
- name: Enable and run ntpd
ansible.builtin.service:
name: ntpd
state: started
enabled: yes
- name: Install NFS utils
ansible.builtin.yum:
name:
- nfs-utils
- nfs-util-lib
state: present
tags: filesharing
Добавление тегов к плей
Если все задачи в плей должны получить один и тот же тег, вы можете добавить тег на уровне плей. Например, если у вас был плей только с задачами NTP, вы могли бы пометить весь плей:
- hosts: all
tags: ntp
tasks:
- name: Install ntp
ansible.builtin.yum:
name: ntp
state: present
- name: Configure ntp
ansible.builtin.template:
src: ntp.conf.j2
dest: /etc/ntp.conf
notify:
- restart ntpd
- name: Enable and run ntpd
ansible.builtin.service:
name: ntpd
state: started
enabled: yes
- hosts: fileservers
tags: filesharing
tasks:
...
Добавление тегов к ролям
Существует три способа добавления тегов к ролям:
- Добавьте один и тот же тег или несколько тегов ко всем задачам в роли, установив теги в
roles. Смотрите примеры в этом разделе. - Добавьте один и тот же тег или несколько тегов ко всем задачам в роли, установив теги в статическом
import_roleв вашем плейбуке. Смотрите примеры в Добавление тегов к импортам. - Добавьте тег или несколько тегов к отдельным задачам или блокам внутри самой роли. Это единственный подход, который позволяет выбрать или пропустить некоторые задачи внутри роли. Чтобы выбрать или пропустить задачи внутри роли, вы должны установить теги на отдельных задачах или блоках, использовать динамическое
include_roleв вашем плейбуке и добавить один и тот же тег или несколько тегов к включению. Когда вы используете этот подход, а затем запускаете свой плейбук с--tags foo, Ansible выполняет само включение плюс любые задачи в роли, которые также имеют тегfoo. Подробнее см. Добавление тегов к включениям.
Когда вы статически включаете роль в свой плейбук с помощью ключевого слова roles, Ansible добавляет все определённые вами теги ко всем задачам в роли. Например:
roles:
- role: webserver
vars:
port: 5000
tags: [ web, foo ]
или:
---
- hosts: webservers
roles:
- role: foo
tags:
- bar
- baz
# using YAML shorthand, this is equivalent to:
# - { role: foo, tags: ["bar", "baz"] }
Добавление тегов к импортам
---
- hosts: webservers
tasks:
- name: Import the foo role
import_role:
name: foo
tags:
- bar
- baz
- name: Import tasks from foo.yml
import_tasks: foo.yml
tags: [ web, foo ]
Наследование тегов для включений: блоки и ключевое слово apply
По умолчанию Ansible не применяет наследование тегов к динамическому повторному использованию с include_role и include_tasks. Если вы добавите теги к включению, они применяются только к самому включению, а не к любым задачам в включённом файле или роли. Это позволяет выполнять выбранные задачи в роли или файле задач — см. Выборочное выполнение помеченных задач в повторно используемых файлах при запуске вашего плейбука.
Если вам нужно наследование тегов, вы, вероятно, захотите использовать импорты. Однако использование и включений, и импортов в одном плейбуке может привести к трудно диагностируемым ошибкам. По этой причине, если ваш плейбук использует include_* для повторного использования ролей или задач, и вам нужно наследование тегов для одного включения, Ansible предлагает два варианта решения. Вы можете использовать ключевое слово apply:
- name: Apply the db tag to the include and to all tasks in db.yaml
include_tasks:
file: db.yml
# adds 'db' tag to tasks within db.yml
apply:
tags: db
# adds 'db' tag to this 'include_tasks' itself
tags: db
Или вы можете использовать блок:
- block:
- name: Include tasks from db.yml
include_tasks: db.yml
tags: db
Специальные теги: always и never
Например:
tasks:
- name: Print a message
ansible.builtin.debug:
msg: "Always runs"
tags:
- always
- name: Print a message
ansible.builtin.debug:
msg: "runs when you use tag1"
tags:
- tag1
Предупреждение
- Сбор фактов помечается тегом ‘always’ по умолчанию. Он пропускается только в том случае, если вы применяете тег, а затем используете другой тег в
--tagsили тот же тег в--skip-tags.
Добавлено в версии 2.5.
Если вы назначите тег never задаче или плей, Ansible пропустит эту задачу или плей, если вы её явно не запросите (--tags never).
Например:
tasks:
- name: Run the rarely-used debug task
ansible.builtin.debug:
msg: '{{ showmevar }}'
tags: [ never, debug ]
Редко используемая задача debug в примере выше выполняется только тогда, когда вы явно запросите теги debug или never.
Выбор или пропуск тегов при запуске плейбука
ansible-playbook предлагает пять командно-строчных опций, связанных с тегами:
-
--tags all- выполнить все задачи, игнорировать теги (поведение по умолчанию) -
--tags [tag1, tag2]- выполнить только задачи с тегамиtag1иtag2 -
--skip-tags [tag3, tag4]- выполнить все задачи, за исключением тех, которые имеют тегиtag3иtag4 -
--tags tagged- выполнить только задачи с хотя бы одним тегом -
--tags untagged- выполнить только задачи без тегов
Например, чтобы выполнить только задачи и блоки, помеченные тегами configuration и packages в очень длинном плейбуке:
ansible-playbook example.yml --tags "configuration,packages"
Чтобы выполнить все задачи, за исключением тех, которые помечены тегом packages:
ansible-playbook example.yml --skip-tags "packages"
Предварительный просмотр результатов использования тегов
При запуске роли или плейбука вы можете не знать или не помнить, какие задачи имеют какие теги или какие теги вообще существуют. Ansible предлагает две командно-строчные флага для ansible-playbook, которые помогут вам управлять плейбуками с тегами:
-
--list-tags- сгенерировать список доступных тегов -
--list-tasks- при использовании с--tags tagnameили--skip-tags tagname, сгенерировать предварительный просмотр задач с тегами
Например, если вы не знаете, является ли тег для задач конфигурации config или conf в плейбуке, роли или файле задач, вы можете отобразить все доступные теги без выполнения каких-либо задач:
ansible-playbook example.yml --list-tags
Если вы не знаете, какие задачи имеют теги configuration и packages, вы можете передать эти теги и добавить --list-tasks. Ansible отображает задачи, но не выполняет ни одну из них.
ansible-playbook example.yml --tags "configuration,packages" --list-tasks
У этих командно-строчных флагов есть одно ограничение: они не могут отображать теги или задачи в динамически включенных файлах или ролях. Смотрите Сравнение включений и импортов: динамическое и статическое повторное использование для получения дополнительной информации о различиях между статическими импортами и динамическими включениями.
Выборочное выполнение задач с тегами в повторно используемых файлах
Если у вас есть роль или файл задач с тегами, определенными на уровне задачи или блока, вы можете выборочно выполнять или пропускать эти помеченные задачи в плейбуке, если используете динамическое включение вместо статического импорта. Вы должны использовать тот же тег в включенных задачах и в инструкции включения. Например, вы можете создать файл с некоторыми помеченными и некоторыми непомеченными задачами:
# mixed.yml
tasks:
- name: Run the task with no tags
ansible.builtin.debug:
msg: this task has no tags
- name: Run the tagged task
ansible.builtin.debug:
msg: this task is tagged with mytag
tags: mytag
- block:
- name: Run the first block task with mytag
...
- name: Run the second block task with mytag
...
tags:
- mytag
И вы можете включить файл задач выше в плейбуке:
# myplaybook.yml
- hosts: all
tasks:
- name: Run tasks from mixed.yml
include_tasks:
name: mixed.yml
tags: mytag
При запуске плейбука с ansible-playbook -i hosts myplaybook.yml --tags "mytag", Ansible пропускает задачу без тегов, выполняет помеченную индивидуальную задачу и выполняет две задачи в блоке.
Настройка тегов глобально
Если вы хотите по умолчанию запускать или пропускать определенные теги, вы можете использовать опции TAGS_RUN и TAGS_SKIP в конфигурации Ansible для установки этих значений по умолчанию.
См. также
- Вступление к плейбукам
-
Введение в плейбуки
- Роли
-
Организация плейбука с помощью ролей
- Пользовательский список рассылки
-
У вас есть вопрос? Загляните на форум!
- irc.freenode.net
-
IRC-чат-канал #ansible
© 2012–2018 Michael DeHaan
© 2018–2021 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.11/user_guide/playbooks_tags.html