2015-06-11 14 views
49

Czy istnieje ansibli zmienna, która ma bezwzględną ścieżkę do bieżącego ansibli-playbook, który wykonuje?Zmienna, która ma ścieżkę do aktualnie wykonywanego ansibli-playbacka?

Niektóre zmiany ...

Co do cholery mam zrobić? Uruchamiam/tworzę skrypt ansibli na localhost, aby skonfigurować okno dokowane mysql i chcę zamontować wolumin danych względem skryptu ansibli.

Na przykład, powiedzmy, że mam kasy repozytorium do ~/branch1/ a następnie uruchomić ansible-playbook dev.yml Myślałam powinien zapisać objętości ~/branch1/.docker_volume/. Jeśli uruchomiłem go z poziomu ~/branch2, powinien on skonfigurować wolumin do ~/branch2/.docker_volume/.

Wciąż jestem nowy w Ansible. Czy istnieje lepszy sposób?

+2

Interesujące pytanie, o którym nigdy nie myślałem. Jednak fakt, że o to pytasz, jest wskaźnikiem, że możesz robić coś w bardzo zły sposób. –

+0

Zgadzam się, opracuję @AntonisChristofides –

Odpowiedz

83

Można użyć zmiennej playbook_dir.

+2

Miałem do czynienia z podobnym problemem, a twoja odpowiedź go rozwiązała. Dzięki. Jednak nie mogłem znaleźć żadnego miejsca, w którym udokumentowano zmienną 'playbook_dir'. Czy mógłbyś wskazać mi dokumentację? LUB, czy mógłbyś wyjaśnić, skąd dowiedziałeś się o tej zmiennej? – slayedbylucifer

+2

Znajduję to w ansible kodu: https://github.com/ansible/ansible/blob/a183972477de03c8f924525135908d4db258d44f/lib/ansible/vars/hostvars.py#L31 – ctrlok

+14

Przesłano łatkę do dokumentu: https://github.com/ansible/ansible/pull/16166 –

1

Niestety nie ma. W rzeczywistości bezwzględna ścieżka jest trochę bez znaczenia (i potencjalnie myląca) w kontekście działania Ansible. W skrócie, gdy przywołujesz książkę do czytania, dla każdego zadania Odpowiedz fizycznie kopiuje moduł powiązany z zadaniem do katalogu tymczasowego na komputerze docelowym, a następnie wywołuje moduł z niezbędnymi parametrami. Tak więc bezwzględna ścieżka na maszynie docelowej jest po prostu katalogiem tymczasowym, który zawiera tylko kilka plików tymczasowych i nie zawiera nawet pełnego zestawu zabawek. Ponadto znajomość pełnej ścieżki pliku na serwerze Ansible jest praktycznie bezużyteczna na komputerze docelowym, chyba że replikujesz całe drzewo katalogów Ansaly na celach.

Aby zobaczyć wszystkie zmienne, które są zdefiniowane przez ansibl można po prostu uruchomić the following command:

$ ansible -m setup hostname 

Jaki jest powód, że trzeba znać bezwzględną ścieżkę do Playbook?

+0

Dzięki Bruce, zmodyfikowałem moje pytanie, aby rozwinąć to, co próbowałem zrobić. –

+2

Absolutna lokalna ścieżka nie jest w ogóle bez znaczenia. Na przykład może być używany do uruchamiania dowolnych poleceń lokalnych i/lub zapytania do innych lokalnych plików lub usług, które nie mogą być zawarte bezpośrednio w config ansibli. Sam fakt, że ansible ma moduł 'local_action', oznacza, że ​​istnieją uzasadnione przypadki użycia. – Cray

1

Nie ma w tym celu wbudowanej zmiennej, ale zawsze można znaleźć bezwzględną ścieżkę instrukcji za pomocą komendy "pwd" i zarejestrować jej wynik na zmiennej.

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

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

+4

W tym przypadku 'pwd' nie zwraca ścieżki skryptu skryptu. Zwraca bieżący katalog procesu (zwykle 'ansible-playbook'). Te dwa nie muszą być takie same i zależą od dokładnego sposobu wywołania ansibli. – Cray

+3

@Cray jest poprawna. Bez względu na to, chciałem tylko wspomnieć, że Ansible przygotowuje już dla ciebie tę zmienną: 'debug: var = ansible_env.PWD' (to daje mi katalog, z którego wykonałem' ansible-playbook' na moim komputerze lokalnym i katalog domowy na zdalnym komputerze serwery) –

+1

Alternatywnie obecny katalog można znaleźć w: '{{lookup ('env', 'PWD')}}' – isedwards

18

Tam nie wydaje się być zmienną, która posiada dokładnie, co chcesz.

jednak przytoczyć the docs:

dostępny także inventory_dir jest ścieżka katalogu trzyma plik hosta inwentaryzacji ansibl, w inventory_file jest ścieżka i filename wskazując pliku hosta inwentaryzacji w ansibl użytkownika.

Playbook_dir zawiera podstawowy katalog zeszytów.

Na koniec role_path zwróci bieżącą nazwę ścieżki roli (od 1.8). To zadziała tylko wewnątrz roli.

W zależności od konfiguracji te lub rozwiązanie oparte na $ pwd może wystarczyć.

2

używałem playbook tak, aby przetestować swoje role lokalnie:

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

ale przestał działać z ansibl v2.2.

I debugowany ww rozwiązanie

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

i wyprodukowany mój katalog domowy, a nie "bieżący katalog roboczy"

I rozliczane z

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

na powyższym roztworze.

Powiązane problemy