Ansible: Füllen Sie in jedem Element einer Liste neue Felder auf

Ansible: Füllen Sie in jedem Element einer Liste neue Felder auf

Ich bin ein absoluter Ansible- und Python-Anfänger. Ich habe eine Liste:

my_items:
- name: item1
  unix_user: unixuser1
  homedir: /home/unixuser2
- name: item2
  unix_user: unixuser2
  homedir: /home/unixuser2

Ich möchte für jedes meiner „my_items“ einen virtuellen Pureftpd-Benutzer erstellen.

Die Rolle erwartet eine Variable wie diese:

my_items:
- name: item1
  unix_user: unixuser1
  homedir: /home/unixuser2
  uid: 1001
  guid: 1001
- name: item2
  unix_user: unixuser2
  homedir: /home/unixuser2
  uid: 1002
  guid: 1002

Ich weiß, wie man die UID/GUID abruft (mit getent). Ich schaffe es, jedem Element die neuen Schlüssel/Werte hinzuzufügen:

- name: "Populate UID and GID in my_items"
  set_fact:
    item: "{{ item | combine( { 'uid': getent_passwd[item.unix_user][1], 'gid': getent_passwd[item.unix_user][2] }) }}"
  with_items: "{{ my_items }}"

Aber natürlich wird die „globale“ my_items-Variable nicht aktualisiert.

Ich habe versucht, ein neues „Wörterbuch“ zu erstellen, aber ich kann so viele Konzepte gleichzeitig nicht verstehen.

Jede Hilfe wäre willkommen!

Antwort1

Ich habe es endlich geschafft, es zum Laufen zu bringen.

- name: "getent variables"
  getent:
    database: passwd
    
- name: Create Dictionary for FTP accounts
  set_fact:
    ftp_accounts: >
       {{ ftp_accounts | default([]) + [{
           'name': item.unix_user,
           'password': item.ftp_password,
           'homedir': item.path,
           'uid': getent_passwd[item.unix_user][1],
           'guid': getent_passwd[item.unix_user][2]
          } ] }}
  with_items:
    "{{ my_items }}"

Dann kann ich mein brandneues Wörterbuch an meine Rolle senden:

- name: gcoop-libre.pure-ftpd
  vars:
    pureftpd_virtual_users: "{{ ftp_accounts }}"

Seien Sie vorsichtig, ich habe auf dem lokalen Host gearbeitet, aber die Unix-Benutzer werden (offensichtlich) nur auf dem Remote-Computer erstellt, daher war getent_passwd[item.unix_user] nicht definiert, was zu einer kryptischen Fehlermeldung führte (Konvertierung auf Unicode: Zeichenfolge oder Puffer erforderlich, Liste gefunden).

verwandte Informationen