Znaczników Ansible można używać do uruchamiania tylko podzbioru zadań / ról. Oznacza to, że domyślnie wszystkie zadania są wykonywane i możemy tylko uniemożliwić wykonanie niektórych zadań.
Czy możemy ograniczyć wykonanie zadania tylko wtedy, gdy podany jest tag „foo”? Czy możemy użyć bieżących tagów w when
sekcji zadania?
Odpowiedzi:
Ansible 2.5 jest wyposażony w specjalne tagi
never
ialways
. Tagnever
może być używany dokładnie w tym celu. Na przykład:W tym przykładzie zadanie zostanie uruchomione tylko wtedy, gdy znacznik
debug
(lubnever
) zostanie wyraźnie zażądany. [Odniesienie do ansible docs]źródło
Chociaż jest to rozwiązanie okrężne, działa.
Wewnątrz listy zadań zarejestruj zmienną, gdy uruchomione zostanie normalne wykonanie. Następnie dodaj warunek when, który sprawdza tę zmienną do oznaczonego zadania.
źródło
untagged
do tego:- set_fact: untagged_run=true
tags: untagged
Nie mam wystarczającej reputacji, aby głosować lub komentować odpowiedź sugerującą użycie zmiennych wiersza poleceń (
--extra-vars
), ale muszę to dodać:Można zapobiec niepowodzeniu odtwarzania w przypadku braku
--extra-vars
definicji, definiując wartość domyślną w samym podręczniku:Przesłanianie przez
--extra-vars
nadal będzie działać, ponieważ zmienne zdefiniowane w wierszu poleceń mają pierwszeństwo przed wszystkimi innymi definicjami.W rezultacie gra działa bezbłędnie, gdy
thorough
nie jest zmienianatrue
na w wierszu poleceń.źródło
thorough | default('no') | bool
.when: thorough is defined and thorough
jeśli wolisz tę składnięis defined and
składnia. więcej niż wiele rur, które nie uważam za intuicyjne.Możesz użyć warunkowego, aby zabezpieczyć się przed przypadkowo uruchomionymi zadaniami, które w innym przypadku zostałyby wykonane, jeśli nie podasz tagu. Zastrzeżeniem tej metody jest to, że gra będzie zawierać błędy i nie powiedzie się, jeśli nie zdefiniujesz tej dodatkowej zmiennej.
Za pomocą argumentu extra-vars możesz uruchomić warunek do wykonania.
Z ansible-playbook --help:
Przykład:
test.yaml:
źródło
thorough | default("false") | match("true")
. Domyślnie nie musi tak byćfalse
, po prostu wszystko co nie pasujetrue
, ale poprawia czytelność.Sprawdzanie zmiennej „tags” nie działa w Ansible 2.1.1.0. Test poniżej. Mam inny pomysł na wykonanie zadania tylko wtedy, gdy znacznik jest zdefiniowany, działając zarówno dla Ansible 1.9.X, jak i 2.XY:
Dzięki temu podczas uruchamiania playbooka bez tagu zmienna „foo” zostanie ustawiona na true, a następnie na false, więc nic nie zostanie wykonane. Jeśli dodasz znacznik „bar”, zastosowane zostanie tylko pierwsze ustawienie, więc zmienna „foo” będzie prawdziwa, a następnie twoje zadanie zostanie wykonane. Cieszyć się!
A oto test dotyczący zmiennej „tags” w Ansible 2.1.1.0:
Oto podręcznik:
A oto wynik:
źródło
Tak. Uruchomienie ansible-playbook z
--tags foo
flagą zapewni, że tylko zadania oznaczone tagiemfoo
zostaną wykonane. Załóżmy na przykład, że mamy podręcznik o nazwie example.yml:bieganie:
Upewni się, że wykonano tylko mniam zadanie.
Tak naprawdę tak naprawdę nie musisz używać tagów w sekcji, gdy warunkowo wykonujesz zadanie. Zauważ, że w zależności od złożoności twoich podręczników / ról może być konieczne użycie kombinacji --tags i --skip-tags, aby kontrolować, które zadania są wykonywane. Na przykład, jeśli zadania dołączania są oznaczone jako „foo”, a niektóre zadania w dołączonym podręczniku są oznaczone jako „pasek” i uruchomisz
Zadanie wewnętrzne (oznaczone tylko jako „pasek”) zostanie wykonane. Aby uniknąć wykonywania wszystkich zadań wewnętrznych oznaczonych jako „bar”, musisz wykonać następujące polecenie
źródło
ansible-playbook
opcji, ale myślę, że OP prosi o sposób na adnotację zadania, aby nie zostało ono wykonane, chyba że wansible-playbook
poleceniu zostanie wyraźnie dodany określony znacznik .Istnieje specjalny znacznik - „nigdy” , który uniemożliwi uruchomienie zadania, chyba że znacznik jest wyraźnie wymagany.
źródło
kiedy klauzula nie może ocenić obecności tagów. Aby obejść ten problem, używam zmiennych i tagów razem do uruchamiania zadań specyficznych dla tej zmiennej / tagu.
Przykład: Wyobraź sobie podręcznik i ekwipunek
Przy takim podejściu używasz znacznika, aby wybrać tylko zadania w uninstall.yml, ale musisz również ustawić zmienną „uninstall_links” na coś, aby ją włączyć. Jeśli więc uruchomisz playbook bez żadnych parametrów, domyślnie uruchomi się zadanie instalacji. Aby odinstalować, możesz ustawić znacznik „odinstaluj” w swoim playbooku (lub cmdline) i MUSISZ ustawić zmienną. Jeśli nie ustawisz tagu, uruchomi on wszystko (zainstaluje i odinstaluje) w tej kolejności, co jest dobre do przetestowania całego procesu.
Jak uruchomić wszystko (zainstaluje się i odinstaluje):
$
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true"
Jak uruchomić tylko tag „odinstaluj” w grupie programistów
$
ansible-playbook -i inventory site.yml -l dev -s -k -e "uninstall_links=true" -t uninstall
Dlatego zmienne i tagi mogą również znajdować się w plikach site.yml / inventory, umożliwiając zatwierdzenie w SCM i zarejestrowanie zamiaru.
źródło
nootal ma rację, moje podejście nie działa - zignoruj :( Teraz używam „kiedy: myvar jest zdefiniowany” i przełącznika wiersza poleceń „-e” myvar = X ”, aby wykonywać zadania tylko na wyraźne żądanie.
Jeszcze łatwiejsze (przynajmniej z ansible 2.1.1.0):
-> uruchomi się tylko wtedy, gdy tagi zostały dostarczone ORAZ tagi zawierają „foo”
źródło
On
Ansible 2.3.2.0
tu jest moje rozwiązanie problemu:Zaczyna się od ustawienia,
in_tag
abyTrue
było to ustawienie,set_fact
które włącza go ponownie,False
gdy nie określisz żadnegotags
zansible-playbook
.Gdy określisz tagi,
in_tag
pozostanieTrue
ifail
zadanie zostanie uruchomione.PS: możesz dodać logikę do dowolnych zadań
PS2: możesz również rozszerzyć logikę i kodować na stałe wszystkie tagi, które masz, i oczywiście
set_fact: in_tag_blah=True
w połączeniu z nimitags: ["blah"]
.źródło