Podczas tworzenia nowej roli Ansible szablon tworzy zarówno katalog, jak vars
i defaults
katalog z pustym main.yml
plikiem. Definiując swoją rolę, mogę umieścić definicje zmiennych w dowolnej z nich, a będą one dostępne w moich zadaniach.
Jaka jest różnica między umieszczaniem definicji w defaults
a vars
? W co powinno się wejść defaults
i w co należy vars
? Czy sensowne jest używanie obu dla tych samych danych?
Wiem, że istnieje różnica w pierwszeństwie / priorytecie między nimi, ale chciałbym zrozumieć, co powinno się udać.
Powiedzmy, że moja rola utworzyłaby listę katalogów w systemie docelowym. Chciałbym podać listę domyślnych katalogów, które mają zostać utworzone, ale chciałbym, aby użytkownik mógł je zastąpić podczas korzystania z roli.
Oto jak to by wyglądało:
---
- directories:
- foo
- bar
- baz
Mógłbym umieścić to albo w, defaults/main.yml
albo w vars/main.yml
, z perspektywy wykonania, nie miałoby to żadnego znaczenia - ale gdzie to powinno iść?
defaults
a covars
dalej.Zmienne ról zdefiniowane w programie
var
mają bardzo wysoki priorytet - można je nadpisać tylko poprzez przekazanie ich w wierszu poleceń, w określonym zadaniu lub w bloku. Dlatego prawie wszystkie zmienne powinny być zdefiniowane wdefaults
.W artykule „ Variable Precedence - Where To Put Your Role Vars ” autor podaje jeden przykład tego, co należy wprowadzić
vars
: stałe specyficzne dla systemu, które niewiele się zmieniają. Więc można miećvars/debian.yml
ivars/centos.yml
z tymi samymi nazwami zmiennych, ale różne wartości i uwzględnić je warunkowo.źródło
IMHO to jest niepraktyczne i nie rozsądne, że takie miejsca ansibl wysoki priorytet od konfiguracji w Vars z ról . Konfiguracja w
vars/main.yml
idefaults/main.yml
powinna być niska i prawdopodobnie ten sam priorytet.Czy są jakieś przykłady z życia, w których chcemy tego typu zachowania?
Są przykłady, że tego nie chcemy.
Należy tutaj
defaults/main.yml
zauważyć, że konfiguracja w programie nie może być dynamiczna. Konfiguracja wvars/main.yml
kan. Na przykład możesz dynamicznie dołączyć konfigurację dla określonego systemu operacyjnego i wersji, jak pokazano w geerlingguy.postgresqlAle ponieważ pierwszeństwo jest tak dziwne i niepraktyczne w Ansible, geerlingguy musi wprowadzić pseudozmienne, jak można zobaczyć w zmiennych.yml
To jest konkretny przykład z życia, który pokazuje, że pierwszeństwo jest niepraktyczne.
Inną kwestią, którą należy tu podkreślić, jest to, że chcemy, aby role były konfigurowalne. Role mogą być zewnętrzne, zarządzane przez kogoś innego. Zgodnie z ogólną zasadą nie chcesz, aby konfiguracja w rolach miała wysoki priorytet.
źródło
Zasadniczo wszystko, co trafia do „role defaults” (folder defaults wewnątrz roli) jest najbardziej plastyczne i łatwe do zastąpienia. Cokolwiek w katalogu vars roli zastępuje poprzednie wersje tej zmiennej w przestrzeni nazw. Ideą, którą należy naśladować, jest to, że im bardziej wyraźny jest zakres, tym większe pierwszeństwo ma linia poleceń -e extra vars zawsze wygrywa. Zmienne hosta i / lub zapasów mogą przejmować wartości domyślne ról, ale nie obejmują jawnych elementów, takich jak katalog vars lub zadanie include_vars. doc
źródło
Zmienne i wartości domyślne idą w parze. oto przykład
w swoim domyślnym pliku miałbyś coś takiego:
To, co zrobi ansibl, to pobierze wartość
package_version
i umieści ją obok nazwy pakietu, aby odczytać gdzieś jako:W ten sposób zainstaluje się,
xyz123
a niexyz123.4
lub cokolwiek jest w wielkim repozytorium xyz.Na końcu to wystarczy
yum install -y xyz123
Więc w zasadzie wartościami domyślnymi są obecne wartości, jeśli nie ustawisz określonej wartości dla zmiennych, spraw, że przestrzeń nie może pozostać pusta.
źródło
defaults
są używane, gdy nie mavars
zdefiniowanej, ale odpowiedź nie wyjaśnia, dlaczego zdefiniowałbyś wartość jako jedną lub drugą, o co pytał PO. Porównaj z wyjaśnieniem poniżej.