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/.

Josh Unger
quelle
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.

Seva Poliakov
quelle
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.

Cray
quelle
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?

Bruce P.
quelle
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.

Andrew Rothstein
quelle
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

hyt
quelle
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