У меня есть несколько наборов задач, которые я часто повторяю в своих учебниках.
Скажем, у меня есть набор из трех задач, которые нужно выполнить по порядку несколько раз, но с другим аргументом или переменной. Задачи для первой переменной должны быть завершены до того, как можно будет запустить задачи для второй переменной и так далее. Что-то вроде этого:
# 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, верно?
Вы можете использовать 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: true
появляется на картинке.
Подробнее можно прочитать в официальной документации, расположенной по адресу docs.ansible.com/ansible/latest/collections/ansible/builtin/…
Спасибо за ответ. Одна часть, которую я не уверен, что понимаю, - это часть об использовании
public
для раскрытия «регистров». Я не знаком с термином «регистры» в этом контексте. Относятся ли «регистры» к набору переменных, доступных для роли? Являются ли они частными для роли по умолчанию, чтобы параметрvars
не влиял на включенную роль, если толькоpublic
не установлено значение «да»?