Odpowiedź: Uruchom 1 zadanie na 1 hoście pod kilkoma użytkownikami

0

Mam 1 maszynę wirtualną, jest na niej kilka aplikacji. Każda aplikacja działa pod własnym użytkownikiem.

host:
– host1
users:
– app1
– app2

Mają podobne pliki konfiguracyjne, różnica polega na nazwach i niektórych poufnych danych. Czy istnieje więc sposób na uruchomienie 1 zadania dla kilku użytkowników na 1 hoście z równoległym ansible.

coś takiego

Inwentarz:

[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

zadania / test.yml:

---
- hosts: webservers
  tasks:
  - name: Copy config
    become: true
    become_user: {{ app_user }}
    template: ....

Wywołanie zadania w ten sposób działa tylko z pierwszą aplikacją. Rozumiem, że mogę stworzyć podręcznik dla każdego użytkownika aplikacji lub napisać jeden podręcznik z sekwencją zadań dla każdego użytkownika aplikacji, ale czy istnieje sposób, jak zrobić to, co chcę?

igkuz
źródło

Odpowiedzi:

0

To nie zadziała, ponieważ:

W obrębie każdej sekcji przedefiniowanie var zastąpi poprzednie wystąpienie. Jeśli wiele grup ma tę samą zmienną, ostatnia załadowana wygrywa. Jeśli zdefiniujesz zmienną dwa razy w sekcji gry: sekcja, druga wygrywa.

Dokument Ansible: playbooks_variables

W moim rozumieniu dokumentacja app_userpod group_vars/app2/vars.ymlpowinna nadpisać app_userpod group_vars/app1/vars.yml.

Działa zadzwonić do każdej grupy hostów w osobnej grze:

---
- 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: ....

Również:

Nie jest wymagana ani dobra praktyka, aby w celu wykonania templatezadania skorzystać z funkcji replace_user . Użyj modułu szablonu w następujący sposób:

---
- hosts: app1
  tasks:
  - name: Copy config
    template:
      src: template.j2
      dest: /some/remote/path
      owner: "{{ app_user }}"
      group: "{{ app_user }}"
      mode: 0755
Henrik Pingel
źródło
hmm, nie myślałem w ten sposób))) dziękuję! Mogę umieścić wszystkie konfiguracje w katalogu głównym, a następnie zmienić właściciela na app_user. Dobry pomysł.
igkuz
0

Spróbowałbym utworzyć rolę i nazwać ją wiele razy, podając tam różne zmienne (użytkowników).

---

- hosts: serwery WWW
  role:
    - wspólny
    - {rola: foo_app_instance, reż: '/ opt / a', app_port: 5000}
    - {rola: foo_app_instance, reż: '/ opt / b', port_port: 5001}

Zabrano stąd . W ten sposób ponownie wykorzystasz swój kod (jeśli zadania są bardzo podobne).

Kalawan
źródło
tak, to także dobry pomysł. Ale nie będzie działał równolegle. Myślę, że skorzystam z rozwiązania w następnym komentarzu. Umieść konfiguracje w koncie root, następnie zmień uprawnienia dla każdego użytkownika, a następnie osobno uruchom polecenia restartu.
igkuz,