Oto fragment poradnika, którego używam ( server.yml
):
- name: Determine Remote User
hosts: web
gather_facts: false
roles:
- { role: remote-user, tags: [remote-user, always] }
Mój plik hosts zawiera różne grupy serwerów, np
[web]
x.x.x.x
[droplets]
x.x.x.x
Teraz chcę wykonać ansible-playbook -i hosts/<env> server.yml
i zastąpić hosts: web
z, server.yml
aby uruchomić ten podręcznik dla [droplets]
.
Czy mogę nadpisać jako jednorazową rzecz bez server.yml
bezpośredniej edycji ?
Dzięki.
ansible
ansible-playbook
luqo33
źródło
źródło
hosts: "{{ variable_host | default('web')}}"
ansible-playbook server.yml --extra-vars "variable_host=newtarget(s)"
group_vars/all
wydaje się być analizowany po tejhosts:
linii Playbook. Jednak zmienne wivars:
zmienne wvars_files:
są analizowane przedhosts:
wierszem? UWAGA ja nie pytając o pierwszeństwo.-e
zamiast--extra-vars
.Dla każdego, kto szuka rozwiązania.
Play Book
Inwentarz
Polecenie:
ansible-playbook deplyment.yml -i hosts --extra-vars "host=droplets"
Więc możesz określić nazwę grupy w extra-varsźródło
play_hosts
i nie otrzymując oczekiwanych wyników, ponieważ zapomniałem, żeplay_hosts
jest to wewnętrzna zmienna Ansible dla wszystkich hostów w bieżącej grze.To trochę późno, ale myślę, że przydałby się plik
--limit or -l
polecenia, aby ograniczyć wzorzec do bardziej konkretnych hostów. (wersja 2.3.2.0)Mogłeś
- hosts: all (or group) tasks: - some_task
a następnie
ansible-playbook playbook.yml -l some_more_strict_host_or_pattern
użyj--list-hosts
flagi, aby zobaczyć, na których hostach zostanie zastosowana ta konfiguracja.źródło
limit
o liście hostów, których to dotyczy, playbook może spowodować wiele szkód.--extra-vars "variable_host=newtarget(s)"
tak samo jak przyjętego rozwiązania jest równie niebezpieczne i bardziej skomplikowane. Używa domyślnych hostów,web
których można również użyć tutaj zamiastall
. Możesz użyć ścisłej grupy hostów jako domyślnej, aby uniknąć popełnienia błędu i użyć--list-hosts
flagi, aby dokładnie zrozumieć, na które hosty wpływasz.--limit
(w przeciwnym razie wpłynie to na wszystkie możliwe hosty, co może nie być zachowaniem, którego chcesz)Używamy prostego zadania niepowodzenia, aby zmusić użytkownika do określenia Ansible opcji limitu , aby nie wykonywać domyślnie / przypadkowo na wszystkich hostach.
Najłatwiejszy sposób, jaki znalazłem, jest następujący:
Teraz musimy użyć
-l
(=--limit
), gdy uruchamiamy playbook, npOgranicz dokumenty opcji :
źródło
Używam innego podejścia, które nie wymaga żadnych zapasów i działa z tym prostym poleceniem:
Aby to zrobić, potrzebujesz playbooka z dwoma odtworzeniami:
Działający przykład (skopiuj go i uruchom z poprzednim poleceniem):
źródło
Zmieniłem mój na domyślny na brak hosta i mam czek, aby go złapać. W ten sposób użytkownik lub cron jest zmuszony do podania pojedynczego hosta lub grupy itp. Podoba mi się logika z komentarza @wallydrag. Nie
empty_group
zawiera hostów w ekwipunku.Następnie dodaj zadania odprawy:
źródło
Właśnie natknąłem się na to googlowanie w poszukiwaniu rozwiązania. Właściwie w Ansible 2.5 jest jeden. Możesz określić plik zapasów za pomocą
--inventory
, na przykład:ansible --inventory configs/hosts --list-hosts all
źródło
-i INVENTORY, --inventory=INVENTORY, --inventory-file=INVENTORY specify inventory host path or comma separated host list. --inventory-file is deprecated
Jeśli chcesz uruchomić zadanie skojarzone z hostem, ale na innym hoście, powinieneś spróbować delegate_to .
W twoim przypadku powinieneś oddelegować do twojego lokalnego hosta (mastera ansible) i wywołać
ansible-playbook
polecenieźródło
Używam ansible 2.5 (dokładnie 2.5.3) i wygląda na to, że plik vars jest ładowany przed wykonaniem parametru hosts. Możesz więc ustawić hosta w pliku vars.yml i po prostu pisać
hosts: {{ host_var }}
w swoim playbookuNa przykład w moim playbook.yml:
A wewnątrz vars / project.yml:
źródło
Oto fajne rozwiązanie, które wymyśliłem, aby bezpiecznie określić hosty za pomocą
--limit
opcji. W tym przykładzie gra zakończy się, jeśli playbook został uruchomiony bez hostów określonych w--limit
opcji.Zostało to przetestowane na Ansible w wersji 2.7.10
źródło
Innym rozwiązaniem jest użycie specjalnej zmiennej,
ansible_limit
która jest zawartością--limit
opcji CLI dla bieżącego wykonania Ansible.Jeśli
--limit
opcja zostanie pominięta, Ansible wyświetla ostrzeżenie, ale nic nie robi, ponieważ żaden host nie został dopasowany.źródło