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

151

Podczas tworzenia nowej roli Ansible szablon tworzy zarówno katalog, jak varsi defaultskatalog z pustym main.ymlplikiem. 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 defaultsa vars? W co powinno się wejść defaultsi 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.ymlalbo w vars/main.yml, z perspektywy wykonania, nie miałoby to żadnego znaczenia - ale gdzie to powinno iść?

nwinkler
źródło

Odpowiedzi:

113

Dokumentacja Ansible na temat pierwszeństwa zmiennych podsumowuje to:

Jeśli w różnych miejscach zdefiniowano wiele zmiennych o tej samej nazwie, wygrywają one w określonej kolejności, czyli:

  • dodatkowe vars (-e w linii poleceń) zawsze wygrywają
  • potem pojawiają się zmienne połączenia zdefiniowane w ekwipunku (ansible_ssh_user itp.)
  • potem pojawia się „prawie wszystko inne” (przełączniki wiersza poleceń, zmienne w grze, zmienne zawarte, zmienne ról itp.)
  • potem pojawia się reszta zmiennych zdefiniowanych w inwentarzu
  • potem pojawiają się fakty dotyczące systemu
  • wtedy „role domyślne”, które są najbardziej „wadliwe” i tracą pierwszeństwo we wszystkim.

Więc załóżmy, że masz rolę „tomcat”, której używasz do instalowania Tomcata na kilku hostach internetowych, ale potrzebujesz różnych wersji tomcat na kilku hostach, potrzebujesz go, aby działał jako różni użytkownicy w innych przypadkach itd. defaults/main.ymlPlik może wyglądać coś takiego:

tomcat_version: 7.0.56
tomcat_user: tomcat

Ponieważ są to tylko wartości domyślne, oznacza to, że zostaną użyte, jeśli te zmienne nie są zdefiniowane nigdzie indziej dla danego hosta. Możesz je zastąpić za pomocą dodatkowych zmiennych, faktów w pliku zasobów itp., Aby określić różne wartości tych zmiennych.

Edycja: Zwróć uwagę, że powyższa lista dotyczy Ansible 1.x. W Ansible 2.x lista została rozszerzona. Jak zawsze dokumentacja Ansible zawiera szczegółowy opis pierwszeństwa zmiennych w wersji 2.x.

Bruce P
źródło
4
Dzięki, to świetna strona - właśnie tego szukałem. Bardziej szczegółowo omawiam, co należy umieścić, defaultsa co varsdalej.
nwinkler
42
Warto to podkreślić: vary ról mają wysoki priorytet . z mojego doświadczenia wynika, że ​​są one wyższe niż gry vars, co jest naprawdę denerwujące.
przetrząsacz 42
5 lat później, ale ... Zwykle patrzę na to w ten sposób: wartości domyślne ról to rzeczy, których gdzieś oczekuję od użytkownika roli w swoich zmiennych. Zmienne ról, OTOH, pozwalają mi uniknąć zakodowanych na stałe informacji w zadaniu, ale prawdopodobnie zostaną zastąpione tylko na potrzeby testowania i zmienione przez opiekuna roli. Na przykład początkowa nazwa użytkownika administratora byłaby domyślna, ale wersje zależności - vars.
ntwrkguru
41

Zmienne ról zdefiniowane w programie varmają 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 w defaults.

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.ymli vars/centos.ymlz tymi samymi nazwami zmiennych, ale różne wartości i uwzględnić je warunkowo.

chiborg
źródło
4

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.ymlidefaults/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.ymlzauważyć, że konfiguracja w programie nie może być dynamiczna. Konfiguracja w vars/main.ymlkan. Na przykład możesz dynamicznie dołączyć konfigurację dla określonego systemu operacyjnego i wersji, jak pokazano w geerlingguy.postgresql

Ale ponieważ pierwszeństwo jest tak dziwne i niepraktyczne w Ansible, geerlingguy musi wprowadzić pseudozmienne, jak można zobaczyć w zmiennych.yml

- name: Define postgresql_packages.
  set_fact:
    postgresql_packages: "{{ __postgresql_packages | list }}"
  when: postgresql_packages is not defined

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.

onknows
źródło
To powinien być komentarz, a nie odpowiedź.
ntwrkguru
3

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

pauljolsen
źródło
-4

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

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

w swoim domyślnym pliku miałbyś coś takiego:

package_version: 123

To, co zrobi ansibl, to pobierze wartość package_versioni umieści ją obok nazwy pakietu, aby odczytać gdzieś jako:

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

W ten sposób zainstaluje się, xyz123a nie xyz123.4lub 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.

qubsup
źródło
Negocjowany, ponieważ nie odpowiada na pytanie. Oczywiście defaultssą używane, gdy nie ma varszdefiniowanej, ale odpowiedź nie wyjaśnia, dlaczego zdefiniowałbyś wartość jako jedną lub drugą, o co pytał PO. Porównaj z wyjaśnieniem poniżej.
Thomas Hirsch