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?

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.


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.