Pytanie Jaka jest różnica między wartościami domyślnymi a zmiennymi w roli "Odpowiedzialny"?


Podczas tworzenia nowej roli odpowiedzi, szablon tworzy zarówno a vars i a defaults katalog z pustym main.yml plik. Definiując moją rolę, mogę umieścić definicje zmiennych w jednym z nich i będą one dostępne w moich zadaniach.

Jaka jest różnica między umieszczaniem definicji w defaults i vars? Do czego powinno dojść defaultsi do czego powinno się włożyć vars? Czy ma sens stosowanie obu tych samych danych?

Wiem, że istnieje różnica w pierwszeństwie / priorytecie między tymi dwoma, ale chciałbym zrozumieć, co powinno być gdzie.

Załóżmy, ż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ł nadpisać je podczas używania roli.

Oto, jak to wyglądałoby:

---
- directories:
  - foo
  - bar
  - baz

Mógłbym umieścić to albo w defaults/main.yml lub w vars/main.yml, z punktu widzenia realizacji, nie zrobiłoby to żadnej różnicy - ale gdzie powinien iść?


99
2018-03-18 16:31


pochodzenie




Odpowiedzi:


Dokumentacja Ansaly na zmienny priorytet podsumowuje tę nicelę:

Jeśli wiele zmiennych o tej samej nazwie jest zdefiniowanych w różnych miejscach, wygrywa w określonej kolejności, czyli:

  • dodatkowe vars (-e w linii poleceń) zawsze wygrywają
  • następnie przychodzi zmienne połączenia zdefiniowane w ekwipunku (ansible_ssh_user, itp.)
  • następnie przychodzi "większość wszystkiego" (przełączniki wiersza poleceń, vars in play, vars, vars, itp.)
  • następnie pojawia się reszta zmiennych zdefiniowanych w ekwipunku
  • następnie pojawiają się fakty odkryte na temat systemu
  • następnie "domyślne ustawienia roli", które są najbardziej "wadliwe" i tracą pierwszeństwo przed wszystkim.

Załóżmy więc, że masz rolę "tomcat", której używasz do zainstalowania Tomcata na kilku hostach internetowych, ale potrzebujesz kilku wersji tomcat na kilku hostach, musisz go uruchomić jako inny użytkownik w innych przypadkach itp. defaults/main.yml plik może wyglądać mniej więcej tak:

tomcat_version: 7.0.56
tomcat_user: tomcat

Ponieważ są to tylko wartości domyślne, oznacza to, że będą używane, jeśli zmienne te nie są zdefiniowane nigdzie indziej dla danego hosta. Można je zastąpić za pomocą dodatkowych zmiennych, poprzez fakty w pliku inwentarza itp., Aby określić różne wartości dla tych zmiennych.

Edycja: Zwróć uwagę, że powyższa lista jest dla Answa 1.x. W Ansible 2.x lista została rozszerzona. Jak zawsze Dokumentacja bezpieczna dostarcza szczegółowy opis zmiennego pierwszeństwa dla 2.x.


72
2018-03-18 16:55



Dzięki, to wspaniała strona - tego właśnie szukałem. Wchodzę w dużo więcej szczegółów na temat tego, co włożyć defaults i co w vars dalej w dół. - nwinkler
warto podkreślić: role vars mają pierwszeństwo zła. z mojego doświadczenia wynika, że ​​są one wyższe niż vars, co jest naprawdę denerwujące. - tedder42


Zmienne ról zdefiniowane w var mają bardzo wysoki priorytet - można je tylko zastąpić, przekazując je w linii poleceń, w określonym zadaniu lub w bloku. Dlatego prawie wszystkie zmienne powinny być zdefiniowane w defaults.

W artykule "Variable Precedence - Gdzie umieścić swoje role Vars"autor podaje jeden przykład tego, co należy umieścić vars: Stałe specyficzne dla systemu, które nie zmieniają się znacznie. Więc możesz mieć vars/debian.yml i vars/centos.ymlz tymi samymi nazwami zmiennych, ale o różnych wartościach i uwzględnij je warunkowo.


16
2018-02-08 09:17





Zmienne i domyślne idą w parze. oto przykład

-name: install package
 yum: name=xyz{{package_version}} state=present

w twoim pliku defaults masz coś takiego:

package_version: 123

To, co ansibla zrobi, będzie miało wartość package_version i umieść go obok nazwy pakietu, aby odczytywał gdzieś:

-name: install package
 yum: name=xyz123 state=present

W ten sposób zostanie zainstalowany xyz123 i nie xyz123.4 lub cokolwiek jest w wielkim repozytorium Xyz's.

Na końcu to zrobi yum install -y xyz123

Zasadniczo wartości domyślne są obecne, jeśli nie ustawisz konkretnej wartości dla zmiennych, ponieważ ta przestrzeń nie może pozostać pusta.


-2
2018-05-10 11:44



Kwota przegłosowana, ponieważ nie dotyczy tego pytania. Oczywiście defaults są używane, gdy nie ma vars zdefiniowane, ale odpowiedź nie wyjaśnia, czemu zdefiniowałbyś wartość jako jedną lub drugą, o co prosił OP. Porównaj z poniższym wyjaśnieniem. - Thomas Hirsch