У меня 1 ВМ, на ней несколько приложений. Каждое приложение работает под своим пользователем.
host:
– host1
users:
– app1
– app2
У них похожие файлы конфигурации, разница в именах и некоторых конфиденциальных данных. Итак, есть ли способ запустить 1 задачу для нескольких пользователей на 1 хосте с анзиблем параллельно.
что-то вроде этого.
инвентарь:
[webservers:children]
app1
app2
[app1]
127.0.0.1
[app2]
127.0.0.1
group_vars / app1 / vars.yml:
---
app_user: app1
var2: value
group_vars / app2 / vars.yml:
---
app_user: app2
var2: value
задачи / test.yml:
---
- hosts: webservers
tasks:
- name: Copy config
become: true
become_user: {{ app_user }}
template: ....
Таким образом, вызов задачи таким образом работает только с первым приложением. Я понимаю, что могу создать playbook для каждого app_user или написать одну playbook с последовательностью задач для каждого app_user, но есть ли способ сделать то, что я хочу?
Это не сработает, потому что:
В любом разделе переопределение переменной перезапишет предыдущий экземпляр. Если несколько групп имеют одну и ту же переменную, выигрывает последняя загруженная. Если вы дважды определите переменную в разделе play's vars :, победит вторая.
Ansible doc: playbooks_variables
В моем понимании документации app_user
под group_vars/app2/vars.yml
следует перезаписать app_user
под group_vars/app1/vars.yml
.
Что должно работать, так это вызов каждой группы хостов в отдельной игре:
---
- hosts: app1
tasks:
- name: Copy config
become: true
become_user: {{ app_user }}
template: ....
- hosts: app2
tasks:
- name: Copy config
become: true
become_user: {{ app_user }}
template: ....
Также:
Нет необходимости или хорошей практики использовать becom_user для template
задача. Используйте модуль шаблона следующим образом:
---
- hosts: app1
tasks:
- name: Copy config
template:
src: template.j2
dest: /some/remote/path
owner: "{{ app_user }}"
group: "{{ app_user }}"
mode: 0755
Я бы попытался создать роль и вызывать ее несколько раз, задавая разные переменные (пользователей).
--- - hosts: webservers roles: - common - { role: foo_app_instance, dir: '/opt/a', app_port: 5000 } - { role: foo_app_instance, dir: '/opt/b', app_port: 5001 }
Взято из Вот. Таким образом вы сможете повторно использовать свой код (если задачи действительно похожи).