W zależności od wartości (True / False) zmiennej zdefiniowanej w group_vars Próbuję zdefiniować niektóre zmienne w pliku vars. Ich wartość zależy od wartości grupy var.
Mój aktualny plik var wygląda następująco:
{% if my_group_var %}
test:
var1: value
var2: value
...
varn: value
{% else %}
test:
var1: other_value
var2: other_value
...
varn: other_value
{% endif %}
Do każdej z moich ról używam zmiennej zdefiniowanej w tym pliku.
Mój testowy podręcznik wygląda następująco:
- name: blabla
hosts: blabla
vars_files:
- <path>/test_vars.yml
roles: blabla
Błąd, który otrzymuję po uruchomieniu playbooka to:
{% if my_group_var %}
^ here
exception type: <class 'yaml.scanner.ScannerError'>
exception: while scanning for the next token
found character that cannot start any token
in "<unicode string>"
Czy robię tu coś głupiego, czy to nawet nie jest obsługiwane? Próbowałem znaleźć inny sposób na zdefiniowanie tych zmiennych (mam ich wiele), ale nie udało mi się uzyskać tutaj czegoś funkcjonalnego. Jakieś sugestie?
ansible
automation
jinja
pandoJohn
źródło
źródło
template
wywołania modułu.test
jest zależny od grupy, powinien zostać umieszczony w zmiennym group_vars.Odpowiedzi:
Nie sądzę, że możesz, zwykle tworzę osobne pliki do przechowywania kolekcji zmiennych warunkowych i używam
when
klauzuli, aby uwzględnić je pod określonym warunkiem:źródło
Ansible pozwala warunkowo zdefiniować zmienną jedną z następujących form:
Łącząc powyższą składnię z wyszukiwaniem zmiennych, możemy załadować złożone zmienne (w tym przypadku podaj listę):
Istnieje inny sposób wykonywania warunkowego ładowania drzewa za pomocą funkcji vars. Jest to przydatne, gdy potrzebujesz zaimplementować logikę wielkości liter (tzn. Zmienna warunku ma więcej niż dwie możliwe wartości):
źródło
Mimo, że byłoby miło, obawiam się, że twoja droga nie jest możliwa (lub nie jestem świadomy właściwej drogi).
Proponuję najpierw przygotować plik vars z szablonu jinja, a następnie dołączyć go do pliku include_vars. Zobacz przykładowy podręcznik:
Zawartość przykładowego szablonu jinja /tmp/vars.yaml.j2 to:
źródło
- debug: var=test
, widzę, że istnieją zarówno wartości oczekiwane, jaktest.var1
itest.var2
oczekiwane. Dlatego powinieneś być w stanie używać tych zmiennych w innych zadaniach podręcznika.AFAIK, ta {} rzecz, której próbujesz, dotyczy szablonów Jinja2, a nie plików yml. Z dokumentacji :
Możesz przygotować osobny plik .yml ze sztuką, która konfiguruje zmienne, których potrzebujesz, używając klauzul when, a następnie importując je (lub włączając) do głównego podręcznika. W ten sposób możesz warunkowo zdefiniować wszystkie zmienne w jednym pliku.
LUB: Użyj ról. Myślę, że role są najbardziej odpowiednim podejściem do rozwiązania twojego problemu.
źródło
Ostatecznie zrobiłem 2 osobne pliki var - nazwijmy je
type_a.yml
itype_b.yml
- i zdefiniowałem zmienną grupową, która wskazuje, którego pliku użyć - coś podobnegotype_of_file: a
. Tak teraz wygląda mój poradnik:Dziękuję za wszystkie odpowiedzi. Uważam je za bardzo pomocne.
źródło
Mam nadzieję, że następujący fragment (wzięty z Ansible Documentation ) może być wartościowym dodatkiem do przydatnych wkładów innych osób powyżej.
źródło