Variabile che ha il percorso del playbook ansible corrente che è in esecuzione?


109

Esiste una variabile ansible che ha il percorso assoluto del playbook ansible corrente in esecuzione?

un po 'di contesto: sto eseguendo / creando uno script ansible localhostper configurare un docker mysql e desidero montare il volume di dati relativo allo script ansible.

Ad esempio, diciamo che ho effettuato il checkout di un repository ~/branch1/e poi corro ansible-playbook dev.ymlpensando che dovrebbe salvare il volume in ~/branch1/.docker_volume/. Se l'ho eseguito da ~/branch2allora dovrebbe configurare il volume su ~/branch2/.docker_volume/.


2
Una domanda interessante, a cui non ho mai pensato. Tuttavia, il fatto che lo chiedi è un indicatore che potresti fare qualcosa in modo molto sbagliato.
Antonis Christofides

Sono d'accordo, elaborerò @AntonisChristofides
Josh Unger

Risposte:


192

Puoi usare playbook_dirvariable.


2
Stavo affrontando un problema simile e la tua risposta lo ha risolto. Grazie. Tuttavia, non sono riuscito a trovare alcun posto in cui la playbook_dirvariabile è documentata. Potresti indicarmi la documentazione per favore. O, potresti spiegare come sei venuto a conoscenza di questa variabile?
slayedbylucifer

3
Lo trovo in codice ansible: github.com/ansible/ansible/blob/…
Seva Poliakov

2
INOLTRE, c'è un repository interessante github.com/lorin/ansible-quickref con tutte le variabili.
Seva Poliakov

46

Non sembra esserci una variabile che contiene esattamente quello che vuoi.

Tuttavia, citando i documenti :

È inoltre disponibile inventory_diril percorso della directory che inventory_filecontiene il file host dell'inventario di Ansible, il nome del percorso e il nome del file che punta al file host dell'inventario di Ansible.

playbook_dir contiene la directory di base del playbook.

Infine, role_pathrestituirà il percorso del ruolo corrente (a partire dalla 1.8). Funzionerà solo all'interno di un ruolo.

A seconda della configurazione, quelli o la $ pwdsoluzione basata potrebbero essere sufficienti.


2

Purtroppo no. In effetti, il percorso assoluto è un po 'privo di significato (e potenzialmente confuso) nel contesto di come funziona Ansible. In poche parole, quando si richiama un playbook, per ogni attività Ansible copia fisicamente il modulo associato all'attività in una directory temporanea sulla macchina di destinazione e quindi richiama il modulo con i parametri necessari. Quindi il percorso assoluto sulla macchina di destinazione è solo una directory temporanea che contiene solo pochi file temporanei al suo interno e non include nemmeno il playbook completo. Inoltre, conoscere un percorso completo di un file sul server Ansible è praticamente inutile su una macchina di destinazione a meno che non si stia replicando l'intero albero di directory Ansible sulle destinazioni.

Per vedere tutte le variabili che sono definite da Ansible puoi semplicemente eseguire il seguente comando :

$ ansible -m setup hostname

Qual è il motivo per cui pensi di aver bisogno di conoscere il percorso assoluto per il playbook?


Grazie Bruce, ho modificato la mia domanda per approfondire quello che stavo cercando di fare.
Josh Unger,

6
Il percorso locale assoluto non è affatto privo di significato. Ad esempio, potrebbe essere utilizzato per eseguire qualsiasi comando locale e / o interrogare altri file o servizi locali che non potrebbero essere inclusi direttamente nella configurazione ansible. Il semplice fatto che ansible abbia il local_actionmodulo significa che ci sono casi d'uso legittimi per questo.
Cray

1

Stavo usando un playbook come questo per testare i miei ruoli a livello locale:

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

ma questo ha smesso di funzionare con Ansible v2.2.

Ho eseguito il debug della suddetta soluzione di

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

e ha prodotto la mia directory home e non la "directory di lavoro corrente"

Ho risolto con

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

per la soluzione sopra.


1

Non esiste una variabile incorporata per questo scopo, ma puoi sempre trovare il percorso assoluto del playbook con il comando "pwd" e registrare il suo output su una variabile.

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

Ora il percorso è disponibile nella variabile playbook_path_output.stdout


7
In questo caso pwdnon restituisce il percorso dello script del playbook. Restituisce la directory corrente del processo (normalmente ansible-playbook). I due non devono essere uguali e dipendono dal modo esatto in cui è stato invocato ansible.
Cray

5
@Cray è corretto. Indipendentemente da ciò, volevo solo menzionare che Ansible già prepara questa variabile per te: debug: var=ansible_env.PWD(questo mi dà la directory da cui ho eseguito ansible-playbooksulla mia macchina locale e la home directory sui server remoti)
NS du Toit

4
In alternativa la directory corrente può essere trovata con:{{ lookup('env','PWD') }}
entro
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.