Korzystam z Ansible do prostych zadań zarządzania użytkownikami na małej grupie komputerów. Obecnie mam ustawione playbooki, hosts: all
a plik hostów to tylko jedna grupa z wymienionymi wszystkimi komputerami:
# file: hosts
[office]
imac-1.local
imac-2.local
imac-3.local
Często musiałem atakować jedną maszynę. ansible-playbook
Granica polecenie może odgrywa tak:
ansible-playbook --limit imac-2.local user.yml
Ale wydaje się to dość kruche, zwłaszcza w przypadku potencjalnie destrukcyjnego podręcznika. Pozostawienie limit
flagi oznacza, że podręcznik będzie można uruchomić wszędzie. Ponieważ narzędzia te są używane tylko od czasu do czasu, warto podjąć kroki w celu niezawodnego odtwarzania, aby przypadkowo nie nękać za kilka miesięcy.
Czy istnieje najlepsza praktyka ograniczania uruchomień Playbook do jednego komputera? Idealnie byłoby, gdyby podręczniki były nieszkodliwe, gdyby pominięto jakiś ważny szczegół.
źródło
--limit office[0]
'{{ target }}'
- według docs.ansible.com/…run_once
może nadal być destrukcyjne, więc nie jest to dobry pomysł.-e
to odpowiednik--extra-vars
hosts: "{{ target | default('no_hosts')}}"
Jest też urocza sztuczka, która pozwala określić jednego hosta w linii poleceń (lub, jak sądzę, wielu hostów), bez pośredniego spisu:
Zwróć uwagę na przecinek ( , ) na końcu; oznacza to, że jest to lista, a nie plik.
To nie ochroni Cię, jeśli przypadkowo przekażesz prawdziwy plik inwentarza, więc może nie być to dobre rozwiązanie tego konkretnego problemu. Ale to przydatna sztuczka!
źródło
skipping: no hosts matched
. Być może ta sztuczka już nie działa, ponieważ--limit
działa?$ ansible-playbook -kK --limit=myhost1 myplaybook.yml
. Zobacz odpowiedź Marwana.all
w sztuce - zajęło mi to trochę czasu, aby dowiedzieć się ...To podejście zakończy się, jeśli więcej niż jeden host zostanie zapewniony przez sprawdzenie zmiennej play_hosts . Moduł nie jest używany do wyjścia, gdy pojedynczy warunek gospodarz nie jest spełniony. Poniższe przykłady używają pliku hosts z dwoma hostami alice i bob.
user.yml (podręcznik)
Uruchom poradnik bez filtrów hosta
Uruchom poradnik na jednym hoście
źródło
--limit
jest drogaplay_hosts
jest przestarzałe w Ansible 2.2 i zastąpione przezansible_play_hosts
. Aby uruchomić na jednym hoście bez konieczności--limit
, możesz użyćwhen: inventory_hostname == ansible_play_hosts[0]
.[WARNING]: conditional statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{ play_hosts|length }} == ''
na Ansible 2.8.4.Jest IMHO wygodniejszy sposób. Rzeczywiście możesz interaktywnie poprosić użytkownika o maszynę, do której chce zastosować podręcznik, dzięki
vars_prompt
:źródło
--extra-vars
normalnym var w{{ hosts }}
jest sprawdzane przed wprowadzeniem wartości - czy jest jakiś specjalny trik?Aby rozwinąć odpowiedź Joemailera, jeśli chcesz mieć możliwość dopasowywania wzorców, aby dopasować dowolny podzbiór zdalnych maszyn (podobnie jak
ansible
polecenie), ale nadal chcesz bardzo utrudnić przypadkowe uruchomienie podręcznika na wszystkich maszynach, jest to co wymyśliłem:Taki sam poradnik jak w innej odpowiedzi:
Miejmy następujące hosty:
Teraz, aby uruchomić polecenie na wszystkich urządzeniach, musisz w sposób oczywisty ustawić zmienną docelową na „wszystkie”
Aby ograniczyć go do określonego wzoru, możesz ustawić
target=pattern_here
lub alternatywnie możesz zostawić
target=all
i dołączyć--limit
argument, np .:to znaczy.
ansible-playbook user.yml --extra-vars "target=all" --limit imac-1* --list-hosts
Co skutkuje w:
źródło
Naprawdę nie rozumiem, jak wszystkie odpowiedzi są tak skomplikowane, sposobem na to jest po prostu:
check
Tryb pozwala na uruchamianie w trybie na sucho, bez dokonywania jakichkolwiek zmian.źródło
--check
, więc myślę, że nadal jest to przydatne pod względem dokumentacji, ponieważ to pytanie może być bardzo zrozumiałeUżytkownicy AWS korzystający z zewnętrznego skryptu inwentaryzacyjnego EC2 mogą po prostu filtrować według identyfikatora instancji:
Działa to, ponieważ skrypt spisu tworzy grupy domyślne .
źródło
Mamy kilka ogólnych poradników, z których korzysta wiele zespołów. Posiadamy również pliki ekwipunku specyficzne dla środowiska, które zawierają wiele deklaracji grupowych.
Aby zmusić osobę dzwoniącą do playbooka do określenia grupy, z którą chcesz biegać, umieszczamy fikcyjny wpis na górze playbooka:
Następnie uwzględniamy następujące sprawdzenie jako pierwszy krok we wspólnym podręczniku:
Jeśli serwer-atrapa pojawi się na liście hostów, dla których zaplanowano uruchomienie tego playbooka (ansible_play_batch), wówczas osoba dzwoniąca nie określiła grupy i wykonanie playbooka zakończy się niepowodzeniem.
źródło
ansible_play_batch
wyświetla tylko bieżącą partię, więc podczas korzystania z grupowania jest to nadal niebezpieczne. Lepiej użyćansible_play_hosts
zamiast tego.Od wersji 1.7 ansible ma opcję run_once . Sekcja zawiera także omówienie różnych innych technik.
źródło
To pokazuje, jak uruchomić podręczniki na samym serwerze docelowym.
Jest to nieco trudniejsze, jeśli chcesz korzystać z połączenia lokalnego. Ale powinno to być OK, jeśli użyjesz zmiennej dla ustawienia hosts i w pliku hosts utworzysz specjalny wpis dla localhost.
We (wszystkich) podręcznikach ustawiono linię hosts: na:
W pliku hostów zasobów reklamowych dodaj wpis dla hosta lokalnego, który ustawia połączenie na lokalne:
Następnie w wierszu poleceń uruchom polecenia jawnie ustawiając cel - na przykład:
Będzie to również działać, gdy używasz ansible-pull:
Jeśli zapomnisz ustawić zmienną w wierszu polecenia, polecenie będzie bezpiecznie błąd (dopóki nie utworzysz grupy hostów o nazwie „no_hosts”!) Z ostrzeżeniem:
Jak wspomniano powyżej, możesz kierować reklamy na jedną maszynę (o ile znajduje się ona w pliku hosts) za pomocą:
lub grupa z czymś takim jak:
źródło
Mam skrypt otoki o nazwie zaopatrzenie zmusza cię do wybrania celu, więc nie muszę się nim zajmować gdzie indziej.
Dla tych, którzy są ciekawi, używam zmiennych ENV dla opcji, które wykorzystuje mój plik Vagrantfile (dodając odpowiedni ansible arg dla systemów chmurowych) i pozwalam przejść resztę ansible args. Gdy tworzę i udostępniam więcej niż 10 serwerów jednocześnie, włączam automatyczne ponawianie na serwerach, które uległy awarii (dopóki robione są postępy - zauważyłem, że tworząc 100 lub więcej serwerów naraz, kilka z nich zawiedzie za pierwszym razem ).
źródło
Nieco innym rozwiązaniem jest użycie specjalnej zmiennej,
ansible_limit
która jest zawartością--limit
opcji CLI do bieżącego wykonywania Ansible.Nie musisz tutaj definiować dodatkowej zmiennej, po prostu uruchom podręcznik z
--limit
flagą.źródło