Назад | Перейти на главную страницу

Ansible: запустить 1 задачу на 1 хосте под несколькими пользователями

У меня 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 }

Взято из Вот. Таким образом вы сможете повторно использовать свой код (если задачи действительно похожи).