(Związane z wywołaniami zwrotnymi lub przechwytywaniem i serią zadań wielokrotnego użytku, w rolach Ansible ):
Czy istnieje lepszy sposób na dołączenie do listy lub dodanie klucza do słownika w Ansible niż (ab) przy użyciu wyrażenia szablonu jina2?
Wiem, że możesz zrobić coś takiego:
- name: this is a hack
shell: echo "{% originalvar.append('x') %}New value of originalvar is {{originalvar}}"
ale czy naprawdę nie ma w tym rodzaju meta zadania lub pomocnika?
Jest delikatny, wydaje się nieudokumentowany i opiera się na wielu założeniach dotyczących działania zmiennych w Ansible.
Mój przypadek użycia to wiele ról (rozszerzenia serwera bazy danych), z których każda musi dostarczyć pewną konfigurację do roli podstawowej (serwer bazy danych). Nie jest to tak proste, jak dodanie linii do pliku konfiguracyjnego serwera db; każda zmiana dotyczy tej samej linii , np. rozszerzeń bdr
i pg_stat_statements
muszą pojawiać się w linii docelowej:
shared_preload_libaries = 'bdr, pg_stat_statements'
Czy Ansible to zrobić, aby po prostu przetworzyć plik konfiguracyjny wiele razy (raz na rozszerzenie) za pomocą wyrażenia regularnego, które wyodrębnia bieżącą wartość, analizuje ją, a następnie przepisuje? Jeśli tak, to jak sprawić, by ten idempotent występował w wielu przebiegach?
Co jeśli konfiguracja jest trudniejsza do przeanalizowania i nie jest tak prosta jak dodanie innej wartości oddzielonej przecinkami? Pomyśl o plikach konfiguracyjnych XML.
Odpowiedzi:
Możesz scalić dwie listy w zmiennej z
+
. Załóżmy, że maszgroup_vars
plik o tej treści:I jest używany w szablonie
pgsql.conf.j2
takim jak:Następnie możesz dołączyć rozszerzenia do testujących serwerów baz danych w następujący sposób:
Po uruchomieniu roli na dowolnym serwerze testowym zostaną dodane dodatkowe rozszerzenia.
Nie jestem pewien, czy to działa również w przypadku słowników, a także bądź ostrożny ze spacjami i pozostawiając wiszący przecinek na końcu linii.
źródło
group_vars
, role nie mogą zająć się szczegółami konfigurowania samych rozszerzeń. Dołączyłem zmienne z ról , których szczególnie szukam, więc jedną rolę można dołączyć do zmiennej ujawnionej przez inną rolę.with_items
wyroku.Od Ansible v2.x możesz to zrobić:
wszystkie powyższe są udokumentowane w: http://docs.ansible.com/ansible/playbooks_filters.html
źródło
u'(': u\"'\"}"
2.4.x
(NAPRAWIONO)set_fact: my_dict_var: '{{my_dict_var|default({})|combine({item[0]: item[1]})}}'
. Nieokreślony błąd pojawia się, gdy używane jest filtrowanie lub nie zarejestrowano żadnych wyników.musisz podzielić pętlę na 2
i addhost.yml
źródło
Nie jestem pewien, kiedy to dodali, ale przynajmniej dla słowników / skrótów (NIE list / tablic), możesz ustawić zmienną hash_behaviour , na przykład:
hash_behaviour = merge
w swoimansible.cfg
.Zajęło mi kilka godzin, aby przypadkowo natknąć się na to ustawienie: S.
źródło
Prawie wszystkie odpowiedzi tutaj wymagają zmian w zadaniach, ale musiałem dynamicznie łączyć słowniki w definicji zmiennych, a nie podczas uruchamiania.
Np. Chcę zdefiniować niektóre wspólne zmienne w,
all
group_vars
a następnie chcę je rozszerzyć w innymgroup
lubhost_vars
. Bardzo przydatne podczas pracy dla ról.Jeśli spróbujesz użyć
combine
lubunion
filtrów nadpisujących oryginalną zmienną w plikach var, skończysz w nieskończonej pętli podczas tworzenia szablonów, więc stworzyłem to obejście (to nie jest rozwiązanie).Możesz zdefiniować wiele zmiennych na podstawie pewnego wzorca nazwy, a następnie automatycznie załadować je w roli.
group_vars/all.yml
group_vars/group1.yml
fragment kodu roli
do_some_stuff.yml
To tylko fragment, ale powinieneś dowiedzieć się, jak to działa. Uwaga: wyszukiwanie („varnames”, „”) jest dostępne od wersji 2.8
Wydaje mi się, że byłoby możliwe scalenie wszystkich zmiennych
dictionary_of_bla.*
w jednym słowniku podczas działania przy użyciu tego samego wyszukiwania.Zaletą tego podejścia jest to, że nie trzeba ustawiać dokładnych list nazw zmiennych, ale tylko wzorzec i użytkownik może ustawić je dynamicznie.
źródło
Ansible
jest systemem automatyzacji i jeśli chodzi o zarządzanie plikami konfiguracyjnymi, nie różni się bardzo odapt
. Powodem, dla którego coraz więcej oprogramowania oferuje funkcję odczytu fragmentów konfiguracji zconf.d
katalogu, jest umożliwienie takim systemom automatyzacji, aby różne pakiety / role dodawały konfigurację do oprogramowania. Uważam, że filozofią nie jestAnsible
robienie tego, co masz na myśli, ale stosowanie tejconf.d
sztuczki. Jeśli konfigurowane oprogramowanie nie oferuje tej funkcji, możesz mieć problemy.Ponieważ wspominasz o plikach konfiguracyjnych XML, korzystam z okazji, by narzekać. Istnieje powód tradycji uniksowej korzystania z plików konfiguracyjnych w postaci zwykłego tekstu. Binarne pliki konfiguracyjne nie nadają się dobrze do automatyzacji systemu, więc każdy rodzaj formatu binarnego sprawi ci kłopotów i prawdopodobnie będzie wymagać utworzenia programu do obsługi konfiguracji. (Jeśli ktoś uważa, że XML jest zwykłym formatem tekstowym, powinien przejść badanie mózgu).
Teraz na twój konkretny
PostgreSQL
problem.PostgreSQL
obsługujeconf.d
lewę. Najpierw sprawdziłbym, czyshared_preload_libraries
można to określić wiele razy. W dokumentacji nie znalazłem żadnej wskazówki, ale może i tak spróbuję. Jeśli nie można go podać wiele razy, wyjaśnię mój problemPostgreSQL
chłopakom na wypadek, gdyby mieli pomysły; to jestPostgreSQL
problem, a nieAnsible
problem. Jeśli nie ma rozwiązania i naprawdę nie mogłem scalić różnych ról w jedną, zaimplementowałbym system do kompilacji konfiguracji na zarządzanym hoście. W tym przypadku, prawdopodobnie utworzyć skrypt,/usr/local/sbin/update_postgresql_config
który będzie kompilować/etc/postgresql/postgresql.conf.jinja
w/etc/postgresql/9.x/main/postgresql.conf
. Skrypt odczyta współdzielone biblioteki wstępnego ładowania z/etc/postgresql/shared_preload_libraries.txt
jednej biblioteki na linię i dostarczy je do jinja.Często zdarza się, że systemy automatyki to robią. Przykładem jest
exim4
pakiet Debian .źródło
conf.d
mechanizm dołączania i na szczęście używa plików tekstowych. Istnieją jednak opcje konfiguracji, w których wiele rozszerzeń może mieć na ten temat opinie - np. „Zwiększ max_wal_senders o 10 w stosunku do tego, co było wcześniej”.