Variable, die den Pfad zum aktuellen Ansible-Playbook hat, das ausgeführt wird?


108

Gibt es eine ansible-Variable, die den absoluten Pfad zum aktuellen ansible-Playbook hat, das ausgeführt wird?

Kontext: Ich führe / erstelle ein ansible-Skript localhost, um einen MySQL-Docker zu konfigurieren, und möchte das Datenvolumen relativ zum ansible-Skript bereitstellen.

Nehmen wir zum Beispiel an, ich habe ein Repository ausgecheckt ~/branch1/und dann ausgeführt. ansible-playbook dev.ymlIch dachte, es sollte das Volume speichern ~/branch1/.docker_volume/. Wenn ich es ausgeführt ~/branch2habe, sollte es das Volume auf konfigurieren ~/branch2/.docker_volume/.


2
Eine interessante Frage, über die ich nie nachgedacht habe. Die Tatsache, dass Sie danach fragen, ist jedoch ein Indikator dafür, dass Sie möglicherweise etwas sehr Falsches tun.
Antonis Christofides

Ich stimme zu, ich werde @AntonisChristofides
Josh Unger

Antworten:


192

Sie können eine playbook_dirVariable verwenden.


2
Ich hatte ein ähnliches Problem und Ihre Antwort hat es gelöst. Vielen Dank. Ich konnte jedoch keinen Ort finden, an dem eine playbook_dirVariable dokumentiert ist. Könnten Sie mich bitte auf die Dokumentation verweisen? ODER können Sie erklären, wie Sie von dieser Variablen erfahren haben?
Slayedbylucifer

3
Ich finde es in ansible Code: github.com/ansible/ansible/blob/…
Seva Poliakov

2
AUCH gibt es interessantes Repo github.com/lorin/ansible-quickref mit allen Variablen.
Seva Poliakov

46

Es scheint keine Variable zu geben, die genau das enthält, was Sie wollen.

Zitieren Sie jedoch die Dokumente :

Ebenfalls verfügbar inventory_dirist der Pfadname des Verzeichnisses, in dem sich die Inventar-Hostdatei von Ansible inventory_filebefindet, der Pfadname und der Dateiname, die auf die Inventar- Hostdatei von Ansible verweisen.

playbook_dir enthält das Playbook-Basisverzeichnis.

Und schließlich role_pathwird der Pfadname der aktuellen Rolle zurückgegeben (seit 1.8). Dies funktioniert nur innerhalb einer Rolle.

Abhängig von Ihrem Setup können diese oder die $ pwdbasierte Lösung ausreichen.


2

Leider nicht. Tatsächlich ist der absolute Pfad im Zusammenhang mit der Ausführung von Ansible etwas bedeutungslos (und möglicherweise verwirrend). Kurz gesagt, wenn Sie ein Playbook aufrufen, kopiert Ansible für jede Aufgabe das mit der Aufgabe verknüpfte Modul physisch in ein temporäres Verzeichnis auf dem Zielcomputer und ruft dann das Modul mit den erforderlichen Parametern auf. Der absolute Pfad auf dem Zielcomputer ist also nur ein temporäres Verzeichnis, das nur wenige temporäre Dateien enthält und nicht einmal das vollständige Playbook enthält. Außerdem ist es auf einem Zielcomputer praktisch nutzlos, einen vollständigen Pfad einer Datei auf dem Ansible-Server zu kennen, es sei denn, Sie replizieren Ihren gesamten Ansible-Verzeichnisbaum auf den Zielen.

Um alle von Ansible definierten Variablen anzuzeigen, können Sie einfach den folgenden Befehl ausführen :

$ ansible -m setup hostname

Was ist der Grund, warum Sie denken, dass Sie den absoluten Weg zum Spielbuch kennen müssen?


Danke Bruce, ich habe meine Frage geändert, um näher zu erläutern, was ich versucht habe.
Josh Unger

6
Der absolute lokale Pfad ist überhaupt nicht bedeutungslos. Zum Beispiel könnte es verwendet werden, um lokale Befehle auszuführen und / oder andere lokale Dateien oder Dienste abzufragen, die nicht direkt in der ansible-Konfiguration enthalten sein könnten. Die bloße Tatsache, dass ansible das local_actionModul hat, bedeutet, dass es dafür legitime Anwendungsfälle gibt.
Cray

1

Ich habe ein solches Spielbuch verwendet, um meine Rollen lokal zu testen:

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

Dies funktionierte jedoch nicht mehr mit Ansible v2.2.

Ich habe die oben genannte Lösung von getestet

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

und es produzierte mein Home-Verzeichnis und nicht das "aktuelle Arbeitsverzeichnis"

Ich habe mich mit abgefunden

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

gemäß der obigen Lösung.


1

Zu diesem Zweck gibt es keine eingebaute Variable, aber Sie können den absoluten Pfad des Playbooks jederzeit mit dem Befehl "pwd" ermitteln und seine Ausgabe in einer Variablen registrieren.

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

Jetzt ist der Pfad in der Variablen playbook_path_output.stdout verfügbar


7
In diesem Fall pwdwird der Pfad des Playbook-Skripts nicht zurückgegeben. Es gibt (normalerweise ansible-playbook) das aktuelle Verzeichnis des Prozesses zurück . Die beiden müssen nicht gleich sein und hängen davon ab, wie genau ansible aufgerufen wurde.
Cray

5
@Cray ist richtig. Unabhängig davon wollte ich nur erwähnen, dass Ansible diese Variable bereits für Sie vorbereitet: debug: var=ansible_env.PWD(Dies gibt mir das Verzeichnis, aus dem ich ansible-playbookauf meinem lokalen Computer ausgeführt habe, und das Home-Verzeichnis auf Remote-Servern)
NS du Toit

4
Alternativ kann das aktuelle Verzeichnis gefunden werden mit:{{ lookup('env','PWD') }}
isedwards
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.