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.
- 583 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Fenti példa "list of dicts" ami pont erre van (kivéve a szóköz hiba utolsó sorban és a "groups" mert az foglalt szó Ansible-n belül így errort fog dobni).
Olvasd el ezt a könyvet: Ansible for DevOps.
- A hozzászóláshoz be kell jelentkezni
Köszönöm. A link eltört picit, ezért rákerestem. Erre gondoltál?
- A hozzászóláshoz be kell jelentkezni
Egy darabig jó volt a link, aztán lett két link és a végén rossz lett az egész valami miatt.
plt, a linked rossz, ez a jó link: https://leanpub.com/ansible-for-devops.
- A hozzászóláshoz be kell jelentkezni
A videó leírásában van olyan link ahonnan legálisan, ingyen letölthető.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
hát megvannak a grouppok az ftp.passwd fájlban :D
- A hozzászóláshoz be kell jelentkezni
A kérdés, hogy lehetnek-e még egyéb csoporttagságok is a primary groupon kívül.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
nem kell központi inventory, az inventoryd lehet dinamikus is a változókat is felolvashatod külső forrásból pl az ftp.passwd fileból.
Ha jól értem ismerkedik az ansible, szóval nem feltétlenül kell legyen értelme annak amit csinál ha a tanulás az igazi cél.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
---
- 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
- A hozzászóláshoz be kell jelentkezni
Ez a greptől lefelé elég nagy hülyeségnek tűnik, lineinfie-al egy lépésben megkeresheted és cserélheted az adott groupot.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni