Как я могу создать многократно используемые «функции», состоящие из задач, которые можно вызывать несколько раз в playbooks с разными аргументами/переменными?

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

Скажем, у меня есть набор из трех задач, которые нужно выполнить по порядку несколько раз, но с другим аргументом или переменной. Задачи для первой переменной должны быть завершены до того, как можно будет запустить задачи для второй переменной и так далее. Что-то вроде этого:

# Run three tasks for Var 1
- name: Task 1 for Var 1
  shell: |
    <Do something here>
- name: Task 2 for Var 1
  shell: |
    <Do something here>
- name: Task 3 for Var 1
  shell: |
    <Do something here>

# Do the same tasks again for Var 2
- name: Task 1 for Var 2
  shell: |
    <Do something here>
- name: Task 2 for Var 2
  shell: |
    <Do something here>
- name: Task 3 for Var 2
  shell: |
    <Do something here>

Как я могу объединить набор из трех задач в функциональную вещь, которую можно вызывать несколько раз с разными аргументами или переменными?

Это лучше всего достигается с помощью ролей, которые я вызываю через include_role?

Похоже, что import_role — неправильное решение для этого, поскольку оно анализируется при запуске playbook, верно?

Введение в Ansible Roles
Введение в Ansible Roles
Ansible - это отличный инструмент управления конфигурацией, который можно использовать для автоматизации настройки или развертывания на большом...
1
0
453
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать include_role для вызова общей функции и vars для передачи аргументов общей роли. При желании вы можете использовать условие when для вызова функции, если это необходимо. Также, чтобы открыть регистры, созданные в рамках задачи, для дальнейшего выполнения плейбука, вы можете использовать public: yes при включении роли.

Ниже приведен один пример вызова роли с именем common_role, которая принимает два аргумента argument_1 и argument_2, которые будут вызываться всегда (true), а регистры будут отображаться на протяжении всей игры.

- name: "Calling Common Role"
   include_role:
     name: common_role
     public: yes
   vars:
     argument_1: "foo"
     argument_2: "bar"
   when: True

Теперь та же роль (common_role) может быть вызвана снова с другим набором аргументов.

- name: "Calling Common Role"
   include_role:
     name: common_role
     public: yes
   vars:
     argument_1: "hey"
     argument_2: "there"
   when: True

Подробнее: Официальная документация Ansible

Спасибо за ответ. Одна часть, которую я не уверен, что понимаю, - это часть об использовании public для раскрытия «регистров». Я не знаком с термином «регистры» в этом контексте. Относятся ли «регистры» к набору переменных, доступных для роли? Являются ли они частными для роли по умолчанию, чтобы параметр vars не влиял на включенную роль, если только public не установлено значение «да»?

Vorticity 18.12.2020 21:07

вы правильно поняли, регистры похожи на переменные. По умолчанию, если вы храните что-то в регистрах, их область действия ограничивается только этой ролью. Теперь, если вы попытаетесь получить доступ к этим переменным/регистрам в следующей роли или в оставшейся части игры, они будут недоступны. Вот где public: true появляется на картинке.

P.... 18.12.2020 21:11

Подробнее можно прочитать в официальной документации, расположенной по адресу docs.ansible.com/ansible/latest/collections/ansible/builtin/‌​…

P.... 18.12.2020 21:11

Другие вопросы по теме