Метки
Если у вас большой плейбук, может быть полезно запускать только его отдельные части, а не весь плейбук целиком. Для этого можно использовать метки Ansible. Использование меток для выполнения или пропуска выбранных задач состоит из двух шагов:
- Добавьте метки к задачам по отдельности или с помощью наследования меток от блока, play, роли или импорта.
- Выберите метки или пропустите их при запуске плейбука.
Примечание
Ключевое слово tags используется при предварительной обработке плейбука и имеет высокий приоритет при определении задач, доступных для выполнения.
Добавление меток с помощью ключевого слова tags
Можно добавлять метки к отдельной задаче или включению. Также можно добавлять метки сразу к нескольким задачам, задав их на уровне блока, play, роли или импорта. Ключевое слово 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 и пропустит задачу без этой метки.
Добавление меток к обработчикам
Обработчики — это особый тип задач, которые выполняются только после уведомления. Поэтому они игнорируют все метки и их нельзя ни выбрать, ни исключить с их помощью.
Добавление меток к блокам
Если нужно применить метку ко многим, но не ко всем задачам в play, используйте блок и задайте метки на этом уровне. Например, можно изменить показанный выше пример с 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
Имейте в виду, что выбор tag имеет приоритет над большинством других правил, включая обработку ошибок block. Если назначить метку задаче в block, но не в разделе rescue или always, эти разделы не будут обработаны, если выбранные метки не охватывают содержащиеся в них задачи.
- block:
- debug: msg=run with tag, but always fail
failed_when: true
tags: example
rescue:
- debug: msg=I always run because the block always fails, except if you select to only run 'example' tag
always:
- debug: msg=I always run, except if you select to only run 'example' tag
В этом примере без указания --tags будут выполнены все 3 задачи, а при запуске с --tags example — только первая задача.
Добавление меток к play
Если всем задачам в play нужно назначить одну и ту же метку, её можно добавить на уровне play. Например, если бы в play содержались только задачи NTP, можно было бы пометить весь play:
- 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:
# ...
Примечание
Метка будет назначена всем задачам, включая неявные задачи play (например, сбор фактов), в том числе добавленные с помощью ролей.
Добавление меток к ролям
Есть три способа добавлять метки к ролям:
- Назначить одну или несколько одинаковых меток всем задачам роли, задав метки в
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 задаче или play, Ansible всегда будет выполнять эту задачу или play, кроме случаев, когда вы явно пропустите их (--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». Однако её можно пропустить, если назначить метку play и пропустить её напрямую (
--skip-tags) или косвенно — при использовании--tagsбез указания этой метки.
Предупреждение
- Задача проверки спецификации аргументов роли по умолчанию помечена меткой «always». Эта проверка будет пропущена при использовании
--skip-tags always.
Добавлено в версии 2.5.
Если назначить метку never задаче или play, Ansible пропустит эту задачу или play, если только вы явно не запросите её выполнение (--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.
Выбор или пропуск меток при запуске плейбука
Добавив метки к задачам, включениям, блокам, play, ролям и импортам, вы можете выборочно выполнять задачи или пропускать их на основании меток при запуске ansible-playbook. Ansible выполняет или пропускает все задачи с метками, соответствующими меткам, указанным в командной строке. Если вы добавили метку на уровне блока или play, с помощью roles или импорта, эта метка применяется ко всем задачам внутри блока, play, роли или импортированной роли либо файла. Если у роли несколько меток и вы хотите запускать разные части роли в разное время, либо используйте динамические включения, либо разделите роль на несколько ролей.
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 к каждой задаче, можно задать метки на уровне play или блока либо при добавлении роли или импорте файла. Ansible распространяет метки вниз по цепочке зависимостей на все дочерние задачи. Для ролей и импортов Ansible добавляет метки, заданные в разделе roles или импорте, к меткам, назначенным отдельным задачам или блокам внутри роли либо импортированного файла. Это называется наследованием меток. Наследование меток удобно, поскольку не нужно помечать каждую задачу. Однако метки всё равно применяются к задачам по отдельности.
Для play, блоков, ключевого слова role и статических импортов Ansible применяет наследование меток, добавляя заданные метки ко всем задачам внутри play, блока, роли или импортированного файла. Однако наследование меток не применяется при динамическом повторном использовании с include_role и include_tasks. При динамическом повторном использовании (включениях) заданные метки применяются только к самому включению. Если вам нужно наследование меток, используйте статический импорт. Если нельзя использовать импорт, поскольку в остальной части плейбука применяются включения, способы обойти это поведение описаны в разделе Наследование меток для включений: блоки и ключевое слово apply.
Метки можно назначать динамическим включениям в плейбуке. Как и метки отдельной задачи, метки задачи include_* применяются только к самому включению, но не к задачам внутри включённого файла или роли. Если добавить mytag к динамическому включению, а затем запустить плейбук с --tags mytag, Ansible выполнит само включение и задачи внутри включённого файла или роли, помеченные mytag, а задачи без этой метки пропустит. Подробнее см. в разделе Выборочный запуск помеченных задач в повторно используемых файлах.
Глобальная настройка меток
Если по умолчанию нужно выполнять или пропускать определённые метки, можно задать эти значения по умолчанию с помощью параметров TAGS_RUN и TAGS_SKIP в конфигурации Ansible.
См. также
- Плейбуки Ansible
-
Введение в плейбуки
- Роли
-
Организация плейбуков с помощью ролей
- Связь с сообществом
-
Есть вопросы? Нужна помощь? Хотите поделиться идеями? Посетите руководство по взаимодействию с сообществом Ansible
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/playbook_guide/playbooks_tags.html