Recherche du nom du fichier dans la section des fichiers du rôle Ansible actuel
Je suis assez nouveau à l'Ansible et je suis en train de créer un rôle qui copie un fichier sur un serveur distant. Le fichier local peut avoir un nom différent à chaque fois que je suis sur la playbook, mais il doit être copié dans le même nom à distance, quelque chose comme ceci:
- name: copy file
copy:
src=*.txt
dest=/path/to/fixedname.txt
Ansible n'autorise pas les caractères génériques, alors quand j'ai écrit un simple playbook avec les tâches de la principale playbook que je pouvais faire:
- name: find the filename
connection: local
shell: "ls -1 files/*.txt"
register: myfile
- name: copy file
copy:
src="files/{{ item }}"
dest=/path/to/fixedname.txt
with_items:
- myfile.stdout_lines
Cependant, quand j'ai déménagé les tâches à un rôle, la première action ne fonctionne pas plus, parce que le chemin d'accès relatif est relative au rôle tandis que le playbook s'exécute dans le répertoire racine de la "rôles" de répertoire. Je pourrais ajouter le chemin vers le rôle de fichiers dir, mais est-il une façon plus élégante?
source d'informationauteur hepabolu
Vous devez vous connecter pour publier un commentaire.
Il semble que vous devez avoir accès à une tâche de recherche d'information localement, puis l'utilise comme entrée pour le module de copie.
Il y a deux façons d'obtenir de l'information locale.
utilisation
local_action:
. C'est un raccourci pour l'exécution de la tâche contre 127.0.0.1, plus d'info ici. (c'est ce que vous avez utilisé)utiliser un
lookup
. C'est un système de plugin spécialement conçu pour obtenir de l'information à l'échelle locale. Plus d'infos ici.Dans votre cas, je pencherais pour la deuxième méthode, à l'aide de
lookup
. Vous pouvez l'installer comme ceci exemple:Ou, plus directement:
En ce qui concerne les chemins de
la recherche de plugin est exécuté à partir du contexte de la tâche (playbook vs rôle). Cela signifie qu'il se comporte différemment selon l'endroit où il est utilisé.
Dans la configuration ci-dessus, les tâches sont exécutées directement à partir d'une tablette playbook, de sorte que le travail dir seront:
/path/to/project
-- c'est le dossier où votre playbook.Si l'endroit où vous pouvez ajouter la tâche à un rôle, le travail dir serait:
/path/to/project/roles/role_name/tasks
En outre, la
file
etpipe
plugins exécuté à partir de l' rôle/fichiers dossier si il existe:/path/to/project/roles/role_name/files
-- cela signifie que votre commande estls -1 *.txt
mise en garde:
Le plugin est appelé à chaque fois que vous accéder à la variable. Cela signifie que vous ne pouvez faire confiance à débogage de la variable dans votre playbook, puis en s'appuyant sur les variables ont la même valeur lorsqu'ils sont utilisés plus tard dans un rôle!
Je me demande si, à propos du cas d'utilisation d'un fichier qui se trouve à l'intérieur d'un projet ansible dossiers, mais dont le nom n'est pas connu à l'avance. D'où vient un tel fichier à venir? N'est-il pas possible d'ajouter une couche entre la génération du fichier et l'utiliser dans Ansible... ou d'avoir un local fixe de chemin comme une variable? Juste curieux 😉
Juste envie de le jeter dans une autre réponse... j'ai le même problème que vous, où je construire un ansible bundle à la volée et copie des artefacts (rpm) dans un rôle de dossier de fichiers, et mon rpm ont de version dans le nom de fichier.
Quand je lance l'ansible jouer, je le veux pour installer tous les paquets rpm, peu importe les noms de fichiers.
J'ai résolu ce problème en utilisant le
with_fileglob
mécanisme ansible:Je trouve ça un peu plus propre que le mécanisme de recherche.