Ansible group fájl kezelése szépen

Fórumok

Ismerkedem az ansible programmal. Szép megoldást keresek egy group fájl egy sorának az előállítására ansible segítségével.

Adott egy szabványos password fájl, ami nem az /etc/passwd fájl, hanem egy ftp program virtuális felhasználóinak adatai.

Ebből a fájlból szeretném a GID mező alapján generáltatni a hozzá tartozó group fájl sorát.

Péládul az ftpd.passwd fájl tartalma:

ftpuser1:***:111:111::/home/user1/dir1:/bin/false
ftpuser2:***:111:111::/home/user1/dir2:/bin/false
ftpuser3:***:112:112::/home/user3:/bin/false

Ebben a fájlban mondjuk épp az ftpuser2 sorát hoztam létre, tehát ehhez kellene előállítanom az ftpd.group fájl megfelelő sorát:

user1:x:111:ftpuser1,ftpuser2

Bonyolult megoldásokat el tudok képzelni, de biztos van valamilyen szép lehetőség is, amivel ez elérhető.

Ha van ötletetek, azt örömmel olvasnám.

Hozzászólások

Maga a groupok elvárt tartalma megvan valamilyen adatszerkezetben?

Pl.

groups:
  - name: user1
    gid: 111
    users:
      - ftpuser1
      - ftpuser2
   - name: userxxx
     .
     .
     .

Ebből egy loop és lineinfile comboval már simán generálható a group file.

Egyelőre ez csak játék, hogy megtanuljam, milyen szemléletet kell ehhez használnom. Igazából az van meg, amit csak akarok. De úgy képzelem, hogy egy feladat például erről szól:

- Hozz létre egy ftp usert, a GRP csoportban, akinek a neve ftpuser3, jelszava ***, és a data3 mappához fér hozzá.

Ebben az esetben az ansible scriptnek kellene kigyűjtenie, hogy kik vannak a GRP csoportban, és megfelelően módosítani a konfigurációt.

Ha meglennének külön adatszerkezetben a user és group adatai, akkor - úgy érzem - duplán kellene nyilvántartani az adatokat, és ez talán nem szép.

Ha ki kell gyűjteni a groupokat, akkor az is egy loop a passwd fileban, és a fentihez hasonló adatszerkezetbe set_facts-al be tudná nyalni. Végül is a passwd-ből csinálsz group fájlt. A csapda ott van, hogy a group neve ebből nem jön ki (akkor azt nem akarod módosítani), és egy user csak egy groupban lehet.

Az Ansible jeletős részben arról szól, hogy van valami központi inventory-d, amiben benne van, hogy a rendszereidnek milyen konfigot szeretnél és aztán az Ansible ezeket a konfigurációkat elvégzi.

A központi inventory előnye (a te példád esetében), hogy ha később eszedbe jut, hogy ugyanezen user-eknek valami más jogot is akarsz adni (ssh/sql/stb.), akkor tudsz abból dolgozni.

Ha csak egy rendszeren akarod beállítani az ftp user-eket, vagy máshol nincs szükséged a userek struktúrált listájára, akkor felesleges az Ansible-lel mókolni.

Ha nem akarod, hogy az Ansible inventory-d legyen "az igazság forrása", arra is van lehetőség, de akkor tényleg minden alkalommal fel kell dolgoznod (kigyűjtened) a rendszereid aktuális konfigurációját.

Amikor valaki éles környezetben ansible programot használ, és valamit változtatni kell, például felvenni egy új user-t, akkor valóban az történik, hogy a központi inventory-ban felveszik az új user-t, és utána lefuttatják a teljes rendszert leíró forgatókönyvet minden gépen?

Ez még az én kis teszt playbook-jaimnál is eltarthat percekig. Összetett rendszereknél gondolom akár órás nagyságrend is lehet.

Attol fugg. Ansible alapvetoen parhuzamositasban eros, vagyis ha 1 gepen futtatsz le 5 taskot, az valoszinuleg tovabb tart, mintha 5 gepen futtatod le ugyanazt az egy taskot.

Ha 1-1 gepbol allo dolgaid vannak, akkor igen, az ansible nem lesz gyors, ha mindent meg kell csinalnia 0-rol. Csereben ha van mondjuk 10-20 rendszer, amiket ugyanugy kell telepiteni, akkor parhuzamosan tudja csinalni, es nem novekszik az ido jelentosen (default azt hiszem 5 hostot csinal parhuzamosan, de konfiguralhato).

Ha rendesen idempotensen van megirva, akkor tobbedik futtatasra mar a taskok nagyreszet siman at fogja ugrani, es nagysagrendekkel gyorsabb lesz (pl. ha httpd install van, akkor elso alkalommal telepiti, kesobb mar csak akkor, ha van frissites es nincs lockolva a verzio).

Ha meg sok usered es sok geped van, remelhetoleg nem fogsz minden gepre minden usert kulon felvenni, hanem csoportokkal operalsz, sot lehetoseg szerint valamilyen kozponti user management rendszerrel (LDAP, AD, stb.), es adott gepek/gepcsoportok eseten csak egy-egy csoportnak allitasz jogosultsagokat.

---
- name: Update group file
  hosts: localhost
  connection=local
  gather_facts: false

  tasks:
    - name: Read passwd file
      shell: "cat /etc/passwd"
      register: passwd_output

    - name: Parse passwd file
      set_fact:
        passwd_entries: "{{ passwd_output.stdout_lines }}"

    - name: Generate group lines
      set_fact:
        group_lines: "{{ group_lines | default([]) + [group_line] }}"
      loop: "{{ passwd_entries }}"
      vars:
        passwd_fields: "{{ item.split(':') }}"
        group_line: "{{ passwd_fields[0] }}:x:{{ passwd_fields[3] }}:"

    - name: Find matching entries in group file
      shell: "grep -E '^{{ item }}:' /etc/group"
      register: matching_entries
      changed_when: false
      loop: "{{ group_lines | map(attribute='group_line') | list }}"
      until: matching_entries is not search('')

    - name: Extract existing user list from matching entries
      set_fact:
        existing_users: "{{ existing_users | default([]) + [existing_user] }}"
      loop: "{{ matching_entries.results }}"
      vars:
        existing_user: "{{ item.stdout.split(':')[3] }}"

    - name: Update group file
      lineinfile:
        path: /etc/group
        line: "{{ item.group_line }}{{ existing_users | join(',') }}"
      loop: "{{ group_lines }}"

chatgptvel generáltattam, telóról vagyok így tesztelni nem tudom, meglepne ha működne, de első ránézésre vannak benne jó ötletek

Jól értem h. az a cél h. struktúrált adatok (userek, azok tulajdonságai) alapján előállíts egy fájlt?

Nézd meg sztem a template modult, az jinja2 template-ből létrehoz bármit. Pl. egy dict alapján lehet ezt a fájlt frissítgetni, a dict-et meg az adott host host_vars fájljában kezeled, mint "single source of truth".

 

https://docs.ansible.com/ansible/latest/collections/ansible/builtin/tem…

 

ps: a jinja2 elég utálatos, de meg lehet szokni