Spec-Zone.ru › Ansible

Теги

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

  1. Добавьте теги к своим задачам, либо индивидуально, либо с наследованием тегов от блока, воспроизведения, роли или импорта.
  2. Выберите или пропустите теги при запуске вашего набора задач.
  • Добавление тегов с ключевым словом tags

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

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

    • Always и Never
  • Выбор или пропускание тегов при запуске набора задач

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

Добавление тегов с ключевым словом 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:
  ...

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

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

  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 задаче или воспроизведению, 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

Spec-Zone.ru

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