вызов сборника воспроизведения ansible с тегом и параметром

#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), тогда цель будет потеряна.