Wie kann ich eine verschachtelte Schleife mit einem Fileglob-Muster erstellen?

13

Ich versuche, eine Reihe von autorisierten SSH-Schlüsseln für eine Reihe von Benutzern in Ansible zu erstellen. Ich habe eine usersVariable wie folgt eingerichtet:

users:
  - { username: root, name: 'root' }
  - { username: user, name: 'User' }

In der gleichen Rolle habe ich auch einen Satz autorisierter Schlüsseldateien in einem files/public_keysVerzeichnis, eine Datei pro autorisiertem Schlüssel:

roles/common/files/public_keys/home
roles/common/files/public_keys/work

Ich möchte jeden öffentlichen Schlüssel für jeden Benutzer kopieren.

Ich habe versucht, die folgende Aufgabe zu verwenden:

- name: copy authorized keys
  authorized_key: user={{ item.0.username }} key={{ item.1 }}
  with_nested:
    - users
    - lookup('fileglob', 'public_keys/*')

Allerdings item.1enthält die Zeichenkette "lookup('fileglob', 'public_keys/*')", nicht jeder Dateipfad unter files/public_keys.

Gibt es eine Möglichkeit, das files/public_keysVerzeichnis aufzulisten und jeden öffentlichen Schlüssel für jeden Benutzer zu kopieren?

mipadi
quelle

Antworten:

8

Der Trick besteht darin, den Rückgabewert von fileglob über die splitFunktion in eine Liste umzuwandeln , sodass Sie die Werte durchlaufen können:

- name: copy authorized keys
  authorized_key: 
    user: "{{ item.0.username }}"
    key: "{{ lookup('file', item.1) }}"
  with_nested:
    - "{{ users }}"
    - "{{ lookup('fileglob', 'public_keys/*').split(',') }}"

Beachten Sie, dass die Verwendung von leeren Variablen ohne {{und }}für with_itemsin Ansible v2 veraltet war.

conorsch
quelle
Dies sollte als Antwort akzeptiert werden
Beyers
0

Möglicherweise müssen Sie Ihren Befehl erheblich umschreiben, aber es gibt Vorkehrungen für das Durchlaufen von Fileglobs

aus dem Beispiel:

- copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600
  with_fileglob:
    - /playbooks/files/fooapp/*

Weitere vielversprechende Optionen sind Schleifen über Unterelemente, was durch SSH-Schlüssel veranschaulicht wird

Tom O'Connor
quelle
3
Ich weiß, dass Sie Datei-Globs durchlaufen können, indem Sie with_fileglob; Ich bin nur nicht sicher, wie ich das in Verbindung mit einer verschachtelten Schleife verwenden soll. Looping über Subelemente könnte funktionieren, aber ich hoffe , ich muss nicht manuell die gesamte Liste der Schlüssel angeben ich kopieren wollen, da ich sollte nur in der Lage sein , dass als eine Liste zu erhalten (mit with_fileglob).
mipadi
Ich bin mir auch nicht sicher. Der nächste beste Vorschlag ist in Pop #ansibleauf irc.freenode.netund sehen , ob die Gurus es irgendwelche gute Ideen haben.
Tom O'Connor