Zmienna zawierająca ścieżkę do aktualnie wykonywanego playbooka ansible?

109

Czy istnieje zmienna ansible, która ma bezwzględną ścieżkę do aktualnie wykonywanego playbooka ansible?

jakiś kontekst: uruchamiam / tworzę skrypt ansible, localhostaby skonfigurować docker mysql i chcę zamontować wolumin danych względem skryptu ansible.

Na przykład, powiedzmy, że wyewidencjonowałem repozytorium, ~/branch1/a potem uruchomiłem ansible-playbook dev.ymli pomyślałem, że powinien zapisać wolumin ~/branch1/.docker_volume/. Jeśli uruchomiłem go od ~/branch2tego momentu, powinien on skonfigurować wolumin na ~/branch2/.docker_volume/.

Josh Unger
źródło
2
Ciekawe pytanie, o którym nigdy nie myślałem. Jednak fakt, że o to pytasz, wskazuje, że możesz robić coś w bardzo zły sposób.
Antonis Christofides
Zgadzam się, opowiem o @AntonisChristofides
Josh Unger

Odpowiedzi:

192

Możesz użyć playbook_dirzmiennej.

Seva Poliakov
źródło
2
Miałem podobny problem i Twoja odpowiedź go rozwiązała. Dzięki. Jednak nie mogłem znaleźć miejsca, w którym playbook_dirudokumentowano zmienną. Czy mógłbyś wskazać mi dokumentację? LUB, czy mógłbyś wyjaśnić, w jaki sposób dowiedziałeś się o tej zmiennej?
zabity przez lucyfera
3
Znajduję to w kodzie ansibla
Seva Poliakov
2
RÓWNIEŻ istnieje interesujące repozytorium github.com/lorin/ansible-quickref ze wszystkimi zmiennymi.
Seva Poliakov
46

Wygląda na to, że nie ma zmiennej, która zawiera dokładnie to, czego chcesz.

Jednak cytując dokumenty :

Dostępna inventory_dirjest również ścieżka do katalogu, w którym znajduje się plik hosta spisu Ansible, inventory_filejest to nazwa ścieżki i nazwa pliku wskazująca na plik hosta spisu Ansible.

playbook_dir zawiera katalog podstawowy playbook.

Na koniec role_pathzwróci ścieżkę do bieżącej roli (od 1.8). Działa to tylko wewnątrz roli.

W zależności od konfiguracji te lub $ pwdrozwiązania bazowe mogą wystarczyć.

Cray
źródło
2

Niestety nie ma. W rzeczywistości ścieżka absolutna jest nieco bez znaczenia (i potencjalnie myląca) w kontekście sposobu działania Ansible. Krótko mówiąc, po wywołaniu elementu playbook, Ansible fizycznie kopiuje moduł powiązany z zadaniem do katalogu tymczasowego na komputerze docelowym dla każdego zadania, a następnie wywołuje moduł z niezbędnymi parametrami. Tak więc ścieżka bezwzględna na maszynie docelowej jest tylko katalogiem tymczasowym, który zawiera tylko kilka plików tymczasowych i nie zawiera nawet pełnego playbooka. Ponadto znajomość pełnej ścieżki pliku na serwerze Ansible jest prawie bezużyteczna na maszynie docelowej, chyba że replikujesz całe drzewo katalogów Ansible na cele.

Aby zobaczyć wszystkie zmienne zdefiniowane przez Ansible, możesz po prostu uruchomić następujące polecenie :

$ ansible -m setup hostname

Jaki jest powód, dla którego uważasz, że musisz znać absolutną ścieżkę do poradnika?

Bruce P
źródło
Dzięki Bruce, zmodyfikowałem moje pytanie, aby bardziej szczegółowo opisać to, co próbowałem zrobić.
Josh Unger
6
Absolutna ścieżka lokalna wcale nie jest bez znaczenia. Na przykład może być używany do uruchamiania dowolnych lokalnych poleceń i / lub wysyłania zapytań do innych lokalnych plików lub usług, które nie mogą być bezpośrednio zawarte w konfiguracji ansible. Sam fakt, że ansibl ma local_actionmoduł, oznacza, że ​​istnieją do tego uzasadnione przypadki użycia.
Cray
1

Używałem takiego podręcznika, aby przetestować swoje role lokalnie:

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

ale to przestało działać z Ansible v2.2.

Debugowałem wyżej wspomniane rozwiązanie

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

i utworzył mój katalog domowy, a nie „bieżący katalog roboczy”

Zgodziłem się z

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

zgodnie z powyższym rozwiązaniem.

Andrew Rothstein
źródło
1

Nie ma wbudowanej zmiennej do tego celu, ale zawsze możesz znaleźć bezwzględną ścieżkę playbooka za pomocą polecenia "pwd" i zarejestrować jego wyjście w zmiennej.

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

Teraz ścieżka jest dostępna w zmiennej playbook_path_output.stdout

hyt
źródło
7
W tym przypadku pwdnie zwraca ścieżki do skryptu playbook. Zwraca bieżący katalog procesu (normalnie ansible-playbook). Nie muszą być takie same i zależą od dokładnego sposobu, w jaki został wywołany ansibl.
Cray
5
@Cray jest poprawne. Bez względu na to, chciałem tylko wspomnieć, że Ansible już przygotowuje dla ciebie tę zmienną: debug: var=ansible_env.PWD(daje mi to katalog, z którego wykonałem ansible-playbookna moim komputerze lokalnym i katalog domowy na zdalnych serwerach)
NS du Toit
4
Alternatywnie aktualny katalog można znaleźć pod {{ lookup('env','PWD') }}
adresem