yourlabs.remember
yourlabs.remember
`````````````````
Meta-rola dla architektów automatyzacji Ansible.
Ta rola zapewnia magiczne ulepszenia w procesach roboczych Ansible:
- ogromne przyspieszenie: wymagaj rolę zależności Raz I Tylko Raz
- brak inwentarza: zapamiętuj zmienne wstrzyknięte z CLI na hoście
- interaktywne pytania CLI: zadawaj użytkownikowi pytania o fakty
.. uwaga:: Ta rola nie pobiera automatycznie ról zależności: to
zadanie komendy bigsudo <https://pypi.org/project/bigsudo/>_ .
Demo
Najłatwiejszy sposób, aby to wypróbować::
pip install --user bigsudo ~/.local/bin/bigsudo yourlabs.fqdn user@somehost
Lub jeśli czujesz się odważny (pomiń nazwę hosta, aby zastosować na localhost)
~/.local/bin/bigsudo yourlabs.traefik
Oczywiście możesz również użyć komend ansible, ale wtedy będzie więcej
komend i opcji. Inspirujemy się praktyką kubectl, dla małych serwerów,
niskodostępnych usług i zespołów pizzowych. Mimo to ja osobiście
wciąż użyłbym bigsudo yourlabs.k8s do konfigurowania instancji k8s, gdybym
musiała to zrobić...
Użycie
Ta rola umożliwia zdefiniowanie, jakie zmienne są potrzebne w Twojej własnej roli, razem z takimi rzeczami jak opis, który będzie wyświetlany użytkownikowi, wartości domyślne, walidacja regexp itp.
Wstrzykiwanie ról zależności OAOO
Podam przykład tego, co się dzieje z yourlabs.traefik (ładowarka oparta na dockerze),
która wymaga yourlabs.docker, która z kolei po prostu instaluje dockera.
Jednak dla przykładu, użyję your.parent i your.child
do przedstawienia przypadku użycia yourlabs.docker i
yourlabs.traefik odpowiednio.
W your.child/requirements.yml::
- your.parent
W your.parent/requirements.yml::
- yourlabs.remember
W ten sposób your.child zależy od your.parent, a your.parent
zależy od yourlabs.remember.
.. uwaga:: bigsudo zapewnia, że wymagania są instalowane
rekurencyjnie, gdy uruchomisz bigsudo your.child.
Bez roli remember zazwyczaj włączyłbyś rolę your.parent
tak jak to jest na szczycie your.child/tasks/main.yml::
- name: Zainstaluj your.parent przed uruchomieniem naszych zadań include_role: name=your.parent
Jednak ta rola będzie uruchamiana za każdym razem, co wydłuża czas wykonania. Jeśli
nie chcesz czekać, aż your.parent zakończy działanie za każdym razem, gdy
uruchamiasz your.child, możesz przekształcić powyższe zadanie tak na szczycie
your.child/tasks/main.yml:
.. kod:: yaml
- name: Zainstaluj your.parent, jeśli nigdy nie było zrobione na tym hoście include_role: name=your.parent when: ansible_facts['ansible_local']['your_parent']['state']|default('') != 'success'
Aby to działało, musisz dodać to, co następuje na końcu
your.parent/tasks/main.yml:
.. kod:: yaml
- include_role: name=yourlabs.remember tasks_from=success
W ten sposób uruchomienie bigsudo your.parent (działa również z ansible) utworzy
/etc/ansible/facts.d/your_parent.fact z następującą zawartością::
#!/bin/sh echo '{ "state": "success" }'
Tak możesz pominąć uwzględnienie roli następnym razem.
Czytaj dalej, aby dodać swoje własne trwałe zmienne roli z interaktywną konfiguracją.
Interaktywna konfiguracja roli
W your.parent/vars/main.yml zdefiniuj remember_fact, który będzie
przestrzenią nazw dla zmiennej w tej roli oraz zmienne, od których zależy Twoja rola, tak jak poniżej::
remember_fact: your_parent remember:
- name: email_enable question: Włączyć niestandardowy email? default: false type: bool
- name: email question: Jaki email użyć? type: email default: '{{ lookup("env", "USER") }}@{{ inventory_hostname }}' when: email_enable
Następnie, w your.parent/tasks/main.yml, możesz uwzględnić yourlabs.remember
i załaduje to zmienne oraz zapyta użytkownika o nowe zmienne
interaktywnie, szybko dzięki wtyczce Action::
- include_role: name=yourlabs.remember
Możesz zrobić więcej, odwołuj się do test.yml playbooka, który uruchamiam z
ansible-playbook -c local -i localhost, test.yml -v --become:
.. include:: test.yml
Wielokrotne wdrożenia: przestrzenne nazewnictwo zmiennych
Aby umożliwić wielokrotne wdrożenia roli na tym samym hoście, tj. umożliwić
eXtreme DevOps, potrzeba, aby Twoje remember_fact zależało od zmiennej.
Na przykład, chcesz wdrożyć docker-compose w różnych katalogach na
Twoim hoście. W ten sposób będziesz potrzebować zmiennej home:
.. kod:: yaml
remember:
- name: home
question: Do jakiego katalogu domowego wdrożyć? (musi zaczynać się od /home dla przykładu regexp)
default: /home/test
type: path
regexp: /home.*
To oznacza, że jeśli użytkownik nie przekaże zmiennej home w linii poleceń (czyli z
-e home=/home/bar), pojawi się pytanie o katalog domowy.
Teraz, wszystko co musimy zrobić, to ponownie użyć tej zmiennej home w remember_fact,
aby zasięg zmiennych był określony według katalogu domowego:
.. kod:: yaml
remember_fact: your_role_j2((home))
Jak widzisz, używamy j2(( )) zamiast {{ }}, to zapobiega
Ansible przed renderowaniem tego przed uzyskaniem wartości dla zmiennej home. Właściwie,
wtyczka akcji remember:
- spróbuje renderować
remember_fact, aby załadować istniejące zmienne, jeśli takie istnieją, - łapie wyjątki
AnsibleUndefinedVariable, - znajduje definicje dla niezdefiniowanych zmiennych, których potrzebuje w
remember, - pyta o nie bez zapisywania,
- ładuje istniejące zmienne,
- i pyta o nowe zmienne.
Podsumowanie
W końcu dochodzimy do punktu, w którym mamy czytelny i stosunkowo prosty sposób na:
- dynamiczne wstrzykiwanie ról zależności, aby przyspieszyć kolejne wykonania roli, skutecznie zapobiegając niepotrzebne podwójne wykonanie ról zależności (takich jak docker, load balancery, niższej automatyzacji ...)
- tłumienie inwentarza ponieważ każdy serwer przechowuje swoje zmienne, jest to również DRY, co oznacza, że to jeszcze jedno repo, o które musisz się martwić!
- interaktywne pytania o fakty nie ma potrzeby czytania dokumentacji przed wykonaniem roli, którą znalazłeś w internecie jako root!
Podziękowania
Dzięki totakoko z beta.gouv.fr za długie dyskusje i za pokazanie, że mój
inwentarz był przesadzony i że można to zrobić bez ;)
Dzięki #ansible@irc.freenode.net, jeden z najlepszych kanałów IRC, w tym:
- agaffney
- mackerman
- jborean93
I dziękuję Tobie za przeczytanie mojej małej przygody!
ansible-galaxy install yourlabs.remember