Variable qui a le chemin vers le livre de lecture ansible en cours d'exécution?

109

Y a-t-il une variable ansible qui a le chemin absolu vers le livre de jeu ansible actuel en cours d'exécution?

un certain contexte: j'exécute / crée un script ansible contre localhostpour configurer un docker mysql et je veux monter le volume de données par rapport au script ansible.

Par exemple, disons que j'ai récupéré un référentiel dans ~/branch1/, puis que je lance, ansible-playbook dev.ymlje pensais qu'il devrait enregistrer le volume dans ~/branch1/.docker_volume/. Si je l'ai exécuté à partir de ~/branch2là, il devrait configurer le volume sur ~/branch2/.docker_volume/.

Josh Unger
la source
2
Une question intéressante, à laquelle je n'ai jamais pensé. Cependant, le fait que vous le posiez est un indicateur que vous faites peut-être quelque chose de très mal.
Antonis Christofides
Je suis d'accord, je vais élaborer @AntonisChristofides
Josh Unger

Réponses:

192

Vous pouvez utiliser la playbook_dirvariable.

Seva Poliakov
la source
2
J'étais confronté à un problème similaire et votre réponse l'a résolu. Merci. Cependant, je n'ai trouvé aucun endroit où la playbook_dirvariable est documentée. Pourriez-vous m'indiquer la documentation s'il vous plaît. OU, pourriez-vous expliquer comment avez-vous appris l'existence de cette variable?
slayedbylucifer
3
Je le trouve en code ansible: github.com/ansible/ansible/blob/…
Seva Poliakov
2
AUSSI, il y a un repo intéressant github.com/lorin/ansible-quickref avec toutes les variables.
Seva Poliakov
46

Il ne semble pas y avoir de variable qui contienne exactement ce que vous voulez.

Cependant, en citant les documents :

Le inventory_dirchemin du répertoire contenant le fichier hôte d'inventaire d'Ansible est également disponible, inventory_filele chemin et le nom de fichier pointant vers le fichier hôte d'inventaire d'Ansible.

playbook_dir contient le répertoire de base du playbook.

Et enfin, role_pathretournera le chemin d'accès du rôle actuel (depuis 1.8). Cela ne fonctionnera que dans un rôle.

En fonction de votre configuration, ceux-ci ou la $ pwdsolution basée peuvent suffire.

Cray
la source
2

Malheureusement, il n'y en a pas. En fait, le chemin absolu est un peu dénué de sens (et potentiellement déroutant) dans le contexte du fonctionnement d'Ansible. En un mot, lorsque vous invoquez un playbook, pour chaque tâche, Ansible copie physiquement le module associé à la tâche dans un répertoire temporaire sur la machine cible, puis appelle le module avec les paramètres nécessaires. Ainsi, le chemin absolu sur la machine cible n'est qu'un répertoire temporaire qui ne contient que quelques fichiers temporaires, et il n'inclut même pas le livre de lecture complet. De plus, connaître le chemin complet d'un fichier sur le serveur Ansible est pratiquement inutile sur une machine cible, sauf si vous répliquez toute votre arborescence de répertoires Ansible sur les cibles.

Pour voir toutes les variables définies par Ansible, vous pouvez simplement exécuter la commande suivante :

$ ansible -m setup hostname

Quelle est la raison pour laquelle vous pensez avoir besoin de connaître le chemin absolu vers le livre de jeu?

Bruce P
la source
Merci Bruce, j'ai modifié ma question pour préciser ce que j'essayais de faire.
Josh Unger
6
Le chemin local absolu n'est pas du tout dénué de sens. Par exemple, il pourrait être utilisé pour exécuter des commandes locales et / ou interroger d'autres fichiers ou services locaux qui ne pourraient pas être inclus directement dans la configuration ansible. Le simple fait qu'ansible possède le local_actionmodule signifie qu'il existe des cas d'utilisation légitimes pour cela.
Cray
1

J'utilisais un playbook comme celui-ci pour tester mes rôles localement:

---
- hosts: localhost
  roles:
     - role: .

mais cela a cessé de fonctionner avec Ansible v2.2.

J'ai débogué la solution susmentionnée de

---
- hosts: all
  tasks:
    - name: Find out playbooks path
      shell: pwd
      register: playbook_path_output
    - debug: var=playbook_path_output.stdout

et il a produit mon répertoire personnel et non le "répertoire de travail actuel"

Je me suis installé avec

---
- hosts: all
  roles:
    - role: '{{playbook_dir}}'

par la solution ci-dessus.

Andrew Rothstein
la source
1

Il n'y a pas de variable intégrée à cet effet, mais vous pouvez toujours trouver le chemin absolu du playbook avec la commande "pwd" et enregistrer sa sortie dans une variable.

- name: Find out playbook's path
  shell: pwd
  register: playbook_path_output
- debug: var=playbook_path_output.stdout

Le chemin est désormais disponible dans la variable playbook_path_output.stdout

hyt
la source
7
Dans ce cas, pwdne renvoie pas le chemin du script de playbook. Il retourne le répertoire courant du processus (normalement ansible-playbook). Les deux n'ont pas besoin d'être identiques et dépendent de la manière exacte dont ansible a été invoqué.
Cray
5
@Cray est correct. Indépendamment, je voulais juste mentionner qu'Ansible prépare déjà cette variable pour vous: debug: var=ansible_env.PWD(cela me donne le répertoire à partir duquel j'ai exécuté ansible-playbooksur ma machine locale et le répertoire home sur les serveurs distants)
NS du Toit
4
Alternativement, le répertoire actuel peut être trouvé avec:{{ lookup('env','PWD') }}
isedwards