Теги
Если у вас большой набор задач, может быть полезно запускать только определенные части вместо всего набора. Это можно сделать с помощью тегов Ansible. Использование тегов для выполнения или пропуска выбранных задач — это двухэтапный процесс:
- Добавьте теги к своим задачам, либо индивидуально, либо с наследованием тегов от блока, воспроизведения, роли или импорта.
- Выберите или пропустите теги при запуске вашего набора задач.
Добавление тегов с ключевым словом 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: true
tags: ntp
- name: Install NFS utils
ansible.builtin.yum:
name:
- nfs-utils
- nfs-util-lib
state: present
tags: filesharing
Если вы запустили эти четыре задачи в наборе задач с --tags ntp, Ansible выполнит три задачи с тегом ntp и пропустит одну задачу, у которой нет этого тега.
Добавление тегов к блокам
Если вы хотите применить тег к многим, но не ко всем задачам в вашем воспроизведении, используйте блок и определите теги на этом уровне. Например, мы можем изменить пример NTP, показанный выше, чтобы использовать блок:
# myrole/tasks/main.yml
- 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: true
- 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: true
- 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"] }
Добавление тегов к включениям
Вы можете применять теги к динамическим включениям в наборе задач. Как и теги на отдельной задаче, теги на задаче include_* применяются только к самому включению, а не к любым задачам в включенном файле или роли. Если вы добавляете mytag к динамическому включению, а затем запускаете набор задач с --tags mytag, Ansible выполняет само включение, выполняет любые задачи в включенном файле или роли с тегом mytag, и пропускает любые задачи в включенном файле или роли без этого тега. Подробнее см. Выборочное выполнение задач с тегами в многократно используемых файлах.
Вы добавляете теги к включениям так же, как добавляете теги к любой другой задаче:
--- # file: roles/common/tasks/main.yml - name: Dynamic reuse 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
Добавление тегов к импортам
Вы также можете применить тег или теги ко всем задачам, импортированным статическими операторами import_role и import_tasks:
---
- 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.yml
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
Специальные теги
Ansible зарезервировал несколько имен тегов для специального поведения: always, never, tagged, untagged и all. Как always, так и never в основном используются для добавления тегов к самим задачам, а три других — при выборе тегов для выполнения или пропуска.
Always и Never
Ansible зарезервировал несколько имен тегов для специального поведения, два из которых always и never. Если вы назначите тег always задаче или воспроизведению, Ansible всегда выполнит эту задачу или воспроизведение, если вы не пропустили её (--skip-tags always) или другой тег, определённый для этой задачи.
Например:
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 specify tag1, all(default) or tagged"
tags:
- tag1
- name: Print a message
ansible.builtin.debug:
msg: "always runs unless you explicitly skip, like if you use ``--skip-tags tag2``"
tags:
- always
- tag2
Предупреждение
- Задача внутреннего сбора фактов по умолчанию имеет тег «always». Но она может быть пропущена, если вы применили тег к воспроизведению и вы явно пропустили её (
--skip-tags) или косвенно, когда вы используете--tagsи опустите её.
Предупреждение
- Задача валидации спецификации аргумента роли по умолчанию имеет тег «always». Эта валидация будет пропущена, если вы используете
--skip-tags always.
Новое в версии 2.5.
Если вы назначите тег never задаче или воспроизведению, Ansible пропустит эту задачу или воспроизведение, если вы её не запросите (--tags never) или другой тег, определённый для этой задачи.
Например:
tasks:
- name: Run the rarely-used debug task, either with ``--tags debug`` or ``--tags never``
ansible.builtin.debug:
msg: '{{ showmevar }}'
tags: [ never, debug ]
Редко используемая задача отладки в примере выше выполняется только при запросе тегов debug или never.
Выборка или пропуск тегов при запуске плейбука
После добавления тегов к задачам, включениям, блокам, плейям, ролям и импортам, вы можете выборочно выполнять или пропускать задачи на основе их тегов при запуске ansible-playbook. Ansible выполняет или пропускает все задачи с тегами, соответствующими тегам, которые вы передаете в командной строке. Если вы добавили тег на уровне блока или плейя, с помощью roles, или с помощью импорта, этот тег применяется ко всем задачам внутри блока, плейя, роли или импортированной роли или файла. Если у вас есть роль с несколькими тегами и вы хотите вызывать подмножества роли в разное время, либо используйте её с динамическими включениями, либо разделите роль на несколько ролей.
ansible-playbook предлагает пять командно-строчных опций, связанных с тегами:
-
--tags all- выполнить все задачи, помеченные и непомеченные тегами, кроме случаевnever(поведение по умолчанию). -
--tags tag1,tag2- выполнить только задачи с тегомtag1или тегомtag2(также с тегамиalways). -
--skip-tags tag3,tag4- выполнить все задачи, кроме задач с тегомtag3или тегомtag4илиnever. -
--tags tagged- выполнить только задачи с хотя бы одним тегом (neverпереопределяет). -
--tags untagged- выполнить только задачи без тегов (alwaysпереопределяет).
Например, чтобы выполнить только задачи и блоки, помеченные либо тегом configuration или тегом packages в очень длинном плейбуке:
ansible-playbook example.yml --tags "configuration,packages"
Чтобы выполнить все задачи, кроме тех, которые помечены тегом packages:
ansible-playbook example.yml --skip-tags "packages"
Чтобы выполнить все задачи, даже те, которые исключены из-за тега never:
ansible-playbook example.yml --tags "all,never"
Выполнить задачи с тегом tag1 или tag3, но пропустить задачи, которые также имеют тег tag4:
ansible-playbook example.yml --tags "tag1,tag3" --skip-tags "tag4"
Приоритет тегов
Пропуск всегда имеет приоритет перед явными тегами, например, если вы указываете как --tags так и --skip-tags, последний имеет приоритет. Например, --tags tag1,tag3,tag4 --skip-tags tag3 будет выполнять только задачи с тегом tag1 или tag4, но не с тегом tag3, даже если задача имеет один из других тегов.
Предварительный просмотр результатов использования тегов
При запуске роли или плейбука вы можете не знать или не помнить, какие задачи имеют какие теги или какие теги существуют вообще. 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 пропускает задачу без тегов, выполняет помеченную индивидуальную задачу и выполняет две задачи в блоке. Также он может выполнить сбор фактов (неявная задача), так как она помечена тегом always.
Наследование тегов: добавление тегов к нескольким задачам
Если вы хотите применить тот же тег или теги к нескольким задачам, не добавляя строку tags к каждой задаче, вы можете определить теги на уровне вашей плей или блока, или когда вы добавляете роль или импортируете файл. Ansible применяет теги вниз по цепочке зависимостей ко всем дочерним задачам. При использовании ролей и импортов Ansible добавляет теги, установленные в разделе roles или импорте, к любым тегам, установленным на отдельных задачах или блоках внутри роли или импортированного файла. Это называется наследованием тегов. Наследование тегов удобно, потому что вам не нужно маркировать каждую задачу. Однако теги по-прежнему применяются к задачам индивидуально.
С плейями, блоками, ключевым словом role и статическими импортами Ansible применяет наследование тегов, добавляя определенные вами теги к каждой задаче внутри плейя, блока, роли или импортированного файла. Однако наследование тегов не применяется к динамическому повторному использованию с include_role и include_tasks. При динамическом повторном использовании (включениях) определенные вами теги применяются только к самому включению. Если вам нужно наследование тегов, используйте статический импорт. Если вы не можете использовать импорт, потому что остальная часть вашего плейбука использует включения, см. Наследование тегов для включений: блоки и ключевое слово apply, чтобы обойти это поведение.
Вы можете применять теги к динамическим включениям в плейбуке. Как и в случае с тегами на отдельной задаче, теги на задаче include_* применяются только к самому включению, а не к задачам внутри включенного файла или роли. Если вы добавляете mytag к динамическому включению, а затем запускаете этот плейбук с --tags mytag, Ansible выполняет само включение, выполняет любые задачи внутри включенного файла или роли, помеченные тегом mytag, и пропускает любые задачи внутри включенного файла или роли без этого тега. См. Выборочное выполнение задач с тегами в повторно используемых файлах для получения более подробной информации.
Настройка тегов глобально
Если вы запускаете или пропускаете определенные теги по умолчанию, вы можете использовать опции TAGS_RUN и TAGS_SKIP в конфигурации Ansible для установки этих значений по умолчанию.
См. также
- Плейбуки Ansible
-
Введение в плейбуки
- Роли
-
Организация плейбуков по ролям
- Общение
-
У вас есть вопросы? Нужна помощь? Хотите поделиться своими идеями? Посетите руководство по общению Ansible
© 2012–2018 Michael DeHaan
© 2018–2024 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_tags.html