Spec-Zone.ru › Ansible

Метки

Если у вас большой плейбук, может быть полезно запускать только его отдельные части, а не весь плейбук целиком. Для этого можно использовать метки Ansible. Использование меток для выполнения или пропуска выбранных задач состоит из двух шагов:

  1. Добавьте метки к задачам по отдельности или с помощью наследования меток от блока, play, роли или импорта.
  2. Выберите метки или пропустите их при запуске плейбука.

Примечание

Ключевое слово tags используется при предварительной обработке плейбука и имеет высокий приоритет при определении задач, доступных для выполнения.

  • Добавление меток с помощью ключевого слова tags

    • Добавление меток к отдельным задачам

      • Добавление меток к обработчикам
      • Добавление меток к блокам
      • Добавление меток к play
      • Добавление меток к ролям
      • Добавление меток к включениям
      • Добавление меток к импортам
      • Наследование меток для включений: блоки и ключевое слово apply
  • Специальные метки

    • Always и Never
  • Выбор или пропуск меток при запуске плейбука

    • Приоритет меток
    • Предварительный просмотр результатов использования меток
    • Выборочный запуск помеченных задач в повторно используемых файлах
    • Наследование меток: добавление меток к нескольким задачам
    • Глобальная настройка меток

Добавление меток с помощью ключевого слова 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 (например, сбор фактов), в том числе добавленные с помощью ролей.

Добавление меток к ролям

Есть три способа добавлять метки к ролям:

  1. Назначить одну или несколько одинаковых меток всем задачам роли, задав метки в roles. Примеры приведены в этом разделе.
  2. Назначить одну или несколько одинаковых меток всем задачам роли, задав метки для статического import_role в плейбуке. Примеры см. в разделе Добавление меток к импортам.
  3. Добавить метку или метки к отдельным задачам либо блокам внутри самой роли. Это единственный способ, который позволяет выбирать или пропускать отдельные задачи внутри роли. Чтобы выбирать или пропускать задачи внутри роли, необходимо назначить метки отдельным задачам или блокам, использовать динамический 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API