#ansible #ansible-2.x
#ansible #ansible-2.x
Вопрос:
Я пытаюсь вызвать сборник воспроизведения ansible версии 1 (notifications.yml) из другого сборника воспроизведения, используя инструкцию include. Я хотел бы указать тег, а также передать параметр вызываемому сборнику пьес (из сборника пьес, в который включен сборник пьес). Я смог заставить это работать без тега, но, похоже, не могу заставить его работать с тегом. Возможно ли это вообще (без параметров командной строки), и если да, то каков синтаксис / правильный способ достижения этого:
main.yml
- include: playbooks/notifications.yml
tags: ['slack']
slack_msg: "test"
notifications.yml
---
- connection: local
hosts: 127.0.0.1
tasks:
- name: Send notification message via Slack
tags:
- slack
local_action:
module: slack
domain: changed.slack.com
token: "{{ slack_token }}"
msg: "{{ slack_msg }}"
channel: "{{ slack_channel }}"
username: "{{ slack_username }}"
- name: Send notification message via Email
tags:
- email
local_action:
module: mail
host: "smtp.gmail.com"
port: "587"
username: 'changed@changed.com'
password: 'changed'
to: "changed <changed@changed.com>"
subject: 'Ansible-report'
body: 'System {{ ansible_hostname }} has been successfully provisioned. User {{ ansible_user_id }}'
Комментарии:
1. Итак, вы хотите запускать это включение только тогда, когда указанный тег указан при запуске main.yml ?
2. я хотел выяснить, могу ли я указать тег в main.yml, чтобы он вызывал задачу, отмеченную этим тегом в уведомлениях. yml-файл. Теперь я собираюсь использовать условные обозначения, чтобы сделать это, хотя я все еще хотел бы выяснить, возможно ли это с тегами (я считаю, что мое использование тегов в main.yml неверно)
3. Передайте вместо этого переменную и используйте ее в notification.yml. Я не думаю, что теги могут быть переданы для включения.
4. это то, что я начал делать после публикации вопроса, т. е. передачи дополнительной переменной и использования условного выражения — спасибо
Ответ №1:
Сначала я немного расскажу о том, как на самом деле работают теги, когда мы используем include / roles.
Теги должны быть указаны при запуске playbook с использованием —tags, и все задачи, входящие в указанные теги, будут выполняться независимо от того, определены ли они в основном файле или в ролях / включенных файлах.Однако следует отметить несколько интересных фактов:
main.yml
---
- hosts: all
tasks:
- include: includeFile.yml tags=t1
- debug: msg="Inside main file"
tags:
- t2
includeFile.yml
- debug: msg="task 1 in includeFile"
tags:
- t1
- debug: msg="task 2 in includeFile"
tags:
- t2
- debug: msg="task 3 in includeFile"
tags:
- t3
1. ansible-playbook -i hosts main.yml --tags "t1"
Теперь, поскольку этот тег используется первой задачей в main.yml, которая включает файл, поэтому все задачи, определенные в includeFile.yml, будут выполняться без дальнейшей проверки тегов в includeFile.yml.
Обратите внимание, что задача в includeFile.yml также использует этот тег, но это не означает, что будет выполнена только эта конкретная задача.
2. ansible-playbook -i hosts main.yml --tags "t2"
В этом случае, поскольку первая задача (включить) в main.yml не использует этот тег. это не означает, что никакая задача includeFile.yml не будет выполнена, includeFile.yml далее будет выполнен поиск по указанному тегу. И, следовательно, будут выполнены вторая задача main.yml и вторая задача includeFile.yml.
3. ansible-playbook -i hosts main.yml --tags "t3"
Теперь в этом случае будет выполнена только третья задача includeFile.yml (та же логика, что и во втором пункте).
Теперь возвращаясь к вашему вопросу:
Мы можем упоминать теги только во время выполнения команды ansible-playbook, используя —tags . Итак, на данный момент мы не можем передавать теги при включении file.
Однако, если вы упомянете какой-либо тег (который присутствует во включаемом файле) во время запуска ansible-playbook, вам конец… но тогда будут выполняться только задачи (в главном файле), которые используют этот конкретный тег. Таким образом, этот вариант не выглядит выполнимым в вашем случае, потому что вам придется помечать все задачи, присутствующие в главном файле, чтобы заставить вас все работать.
Итак, как мы обсуждали в комментариях, лучше передать фиктивную переменную в этот включаемый файл и запускать задачи условно. Но вы также можете использовать теги в случае, если ваша постановка задачи установлена в соответствии с тем, что мы обсуждали выше.
Примечание: Теги все еще могут быть полезны при работе с ролями / включениями. Если вы хотите не запускать некоторые задачи, которые могут присутствовать в основном сборнике воспроизведения или в прикрепленной роли / include, теги идеально подходят в этом случае (для достижения этой цели мы используем —skip-tags при запуске ansible-playbook).
Заключительное замечание: Основная цель использования тегов — иметь динамический контроль над тем, какие задачи должны выполняться в этом конкретном запуске. Если вы будете жестко кодировать тег (передавая его в include), тогда цель будет потеряна.