¿Variable que tiene la ruta al ansible-playbook actual que se está ejecutando?

109

¿Existe una variable ansible que tenga la ruta absoluta al libro de jugadas ansible actual que se está ejecutando?

algo de contexto: estoy ejecutando / creando un script ansible en contra localhostde configurar una ventana acoplable mysql y deseo montar el volumen de datos en relación con el script ansible.

Por ejemplo, digamos que he retirado un repositorio ~/branch1/y luego ejecuto ansible-playbook dev.ymlque estaba pensando que debería guardar el volumen en ~/branch1/.docker_volume/. Si lo ejecuté desde ~/branch2entonces debería configurar el volumen en ~/branch2/.docker_volume/.

Josh Unger
fuente
2
Una pregunta interesante, en la que nunca pensé. Sin embargo, el hecho de que lo esté preguntando es un indicador de que puede estar haciendo algo de una manera muy incorrecta.
Antonis Christofides
Estoy de acuerdo, elaboraré @AntonisChristofides
Josh Unger

Respuestas:

192

Puede utilizar playbook_dirvariable.

Seva Poliakov
fuente
2
Estaba enfrentando un problema similar y su respuesta lo resolvió. Gracias. Sin embargo, no pude encontrar ningún lugar donde playbook_dirse documente la variable. ¿Podría indicarme la documentación, por favor? O, ¿podría explicar cómo llegó a conocer esta variable?
slayedbylucifer
3
Lo encuentro en el código ansible: github.com/ansible/ansible/blob/…
Seva Poliakov
2
TAMBIÉN, hay un repositorio interesante github.com/lorin/ansible-quickref con todas las variables.
Seva Poliakov
46

No parece haber una variable que contenga exactamente lo que desea.

Sin embargo, citando los documentos :

También está disponible inventory_direl nombre de ruta del directorio que contiene el archivo de host de inventario de Ansible, inventory_filees el nombre de ruta y el nombre de archivo que apunta al archivo de host de inventario de Ansible.

playbook_dir contiene el directorio base del libro de jugadas.

Y finalmente, role_pathdevolverá el nombre de ruta del rol actual (desde 1.8). Esto solo funcionará dentro de un rol.

Dependiendo de su configuración, esas o la $ pwdsolución basada pueden ser suficientes.

Cray
fuente
2

Desafortunadamente no lo hay. De hecho, la ruta absoluta carece de sentido (y es potencialmente confusa) en el contexto de cómo se ejecuta Ansible. En pocas palabras, cuando invoca un libro de jugadas, para cada tarea, Ansible copia físicamente el módulo asociado con la tarea a un directorio temporal en la máquina de destino y luego invoca el módulo con los parámetros necesarios. Entonces, la ruta absoluta en la máquina de destino es solo un directorio temporal que solo contiene algunos archivos temporales, y ni siquiera incluye el libro de jugadas completo. Además, conocer una ruta completa de un archivo en el servidor Ansible es prácticamente inútil en una máquina de destino a menos que esté replicando todo su árbol de directorios de Ansible en los destinos.

Para ver todas las variables definidas por Ansible, simplemente puede ejecutar el siguiente comando :

$ ansible -m setup hostname

¿Cuál es la razón por la que cree que necesita conocer el camino absoluto al libro de jugadas?

Bruce P
fuente
Gracias Bruce, modifiqué mi pregunta para dar más detalles sobre lo que estaba tratando de hacer.
Josh Unger
6
El camino local absoluto no carece de sentido en absoluto. Por ejemplo, podría usarse para ejecutar cualquier comando local y / o consultar otros archivos o servicios locales que no podrían incluirse directamente en la configuración ansible. El mero hecho de que ansible tenga el local_actionmódulo significa que existen casos de uso legítimos para esto.
Cray
1

Estaba usando un libro de jugadas como este para probar mis roles localmente:

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

pero esto dejó de funcionar con Ansible v2.2.

Depuré la solución antes mencionada de

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

y produjo mi directorio de inicio y no el "directorio de trabajo actual"

Me conformé con

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

según la solución anterior.

Andrew Rothstein
fuente
1

No hay una variable incorporada para este propósito, pero siempre puede averiguar la ruta absoluta del libro de jugadas con el comando "pwd" y registrar su salida en una variable.

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

Ahora la ruta está disponible en la variable playbook_path_output.stdout

hyt
fuente
7
En este caso pwd, no devuelve la ruta de la secuencia de comandos del libro de jugadas. Devuelve el directorio actual del proceso (normalmente ansible-playbook). Los dos no tienen que ser iguales y dependen de la forma exacta en que se invocó ansible.
Cray
5
@Cray es correcto. Independientemente, solo quería mencionar que Ansible ya prepara esta variable para usted: debug: var=ansible_env.PWD(esto me da el directorio desde el cual ejecuté ansible-playbooken mi máquina local y el directorio de inicio en servidores remotos)
NS du Toit
4
Alternativamente, el directorio actual se puede encontrar con:{{ lookup('env','PWD') }}
isedwards