Comment puis-je avoir une boucle imbriquée avec un motif fileglob?

13

J'essaie de créer un ensemble de clés SSH autorisées pour un ensemble d'utilisateurs dans Ansible. J'ai une usersvariable configurée comme ceci:

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

Dans le même rôle, j'ai également un ensemble de fichiers de clés autorisés dans un files/public_keysrépertoire, un fichier par clé autorisée:

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

Je veux copier chaque clé publique pour chaque utilisateur.

J'ai essayé d'utiliser la tâche suivante:

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

Cependant, item.1contient la chaîne littérale "lookup('fileglob', 'public_keys/*')", pas chaque chemin de fichier sous files/public_keys.

Existe-t-il un moyen d'obtenir une liste du files/public_keysrépertoire et de copier chaque clé publique pour chaque utilisateur?

mipadi
la source

Réponses:

8

L'astuce consiste à transformer la valeur de retour fileglob en une liste via la splitfonction, afin que vous puissiez parcourir les valeurs:

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

Notez que l'utilisation de variables nues, sans {{et }}, pour with_itemsest déconseillée dans Ansible v2.

conorsch
la source
Cela devrait être accepté réponse
Beyers
0

Vous devrez peut-être réécrire considérablement votre commande, mais il est possible de boucler sur les fichiers

de l'exemple:

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

D'autres options prometteuses sont la boucle sur les sous-éléments, qui est en fait illustrée par les clés SSH

Tom O'Connor
la source
3
Je sais que vous pouvez parcourir les globes de fichiers en utilisant with_fileglob; Je ne sais juste pas comment utiliser cela en conjonction avec une boucle imbriquée. La boucle sur les sous - éléments pourrait fonctionner, mais j'espère que je n'aurai pas à spécifier manuellement la liste complète des clés que je veux copier, car je devrais simplement pouvoir l'obtenir sous forme de liste (en utilisant with_fileglob).
mipadi
Je ne suis pas sûr non plus. La meilleure suggestion suivante consiste à sauter dans #ansiblele irc.freenode.netet voir si les gourous là - bas ont des idées brillantes.
Tom O'Connor