Korzystam z Ansible 2.2, ale mogę zaktualizować, jeśli to pomoże.
Widziałem to i byłem bardzo podekscytowany, ale wydaje się, że nie ma go w tej (lub żadnej) wersji dokumentacji Ansible.
Problem, który próbuję rozwiązać, to 1000 użytkowników, którymi muszę zarządzać na urządzeniu Centos.
Wykonanie tego zadania zajmuje dużo czasu. A nawet bardziej irytujące, wszystko pokazuje się jako zmienione, ponieważ polecenie „wygasa” w module użytkownika zawsze oznacza to jako zmienione.
wyglądało to również obiecująco, ale uruchomienie każdej komendy w pętli with_items zajęło tyle samo czasu i nie przyspieszyło (nigdy nie zadałem sobie trudu, by czekać wystarczająco długo, aby dojść do końca).
Pomijanie zadań jest teraz szybkie (dużo szybsze niż w Ansible 2.0), jeśli nie będę w stanie wymyślić, jak to zrobić równolegle, myślę, że wrócę i wymyślę, jak pomijać niepotrzebne zadania, a jeśli wszystko inaczej zawiedzie, napiszę własny moduł. Ale wydaje się, że powinienem być w stanie zrobić to wszystko szybciej w Ansible.
To, co chcę uruchomić równolegle, host_authorizations
to lista nazw użytkowników i innych danych.
- name: Create/modify OS user accounts
user: name={{ item.username }} group=sshusers shell=/bin/bash home="/home/selinux-modules/{{ item.username }}" state=present expires={{item.expiredate|default(omit)}}
with_items: "{{ host_authorizations }}"
tags: full_maintenance
Odpowiedzi:
Jak wspomniano @webKnja, jest to możliwe w
async
trybie. Niedawno go odkryłem i nauczyłem się, że możesz go używać na 3 różne sposoby, w zależności od potrzeb.Wykonaj i odpytaj wyniki, zwróć uwagę
poll:5
, Spowoduje to odpytanie wyników co 5 sekund. Dzięki tej metodzie możesz zaoszczędzić trochę czasu.Strzelaj i zapominaj
poll: 0
, jest to bardzo szybka opcja, ponieważ Ansible to po prostu strzelanie do tych zadań. Minusem jest to, że nie wiemy, jaki był wynik zadania, tjchanged: True/False
. Oczywiście jest to minus, jeśli zależy ci na opiniach;).Odpal i zapomnij
async_status
, składnia zadania jest taka sama jak w przykładzie 2, jednak będzie wymagała dodatkowego zadaniaasync_status
. To jest mój ulubiony, ponieważ jest to stosunkowo szybko (szybciej niż normalny lub pętliexecute and poll
) i pozwala uchwycić zwrotne chociaż będzie musiał radzić sobie z nowąregister
dla twojegoasync_task
.retries: 20
- ile prób przed niepowodzeniem.delay: 2
- ile sekund trzeba czekać między ankietami.Uwaga , w zależności od zadania, możesz nie móc skorzystać z tej
async
opcji. Miałem przykłady interakcji z systemem, który nie był w stanie obsłużyć wielu żądań dotyczących tego samego zasobu. Znalazłemasync
opcję najlepiej działającą, jeśli muszę wykonać to samo zadanie na wielu hostach. Właśnie tam mogłem „zaoszczędzić” najwięcej czasu.Ponieważ w pytaniu zamieściłeś link do dokumentacji Ansible, nie zamierzam tego robić.
źródło
poll
wartość na 0 w przykładzie 3. To niesamowite wyjaśnienie !! Dziękujęasync_status
wymagajid
, nieid
.Aby odpowiedzieć na twoje pytanie: Nie, na razie Ansible nie może równolegle uruchamiać pętli.
Użyłbym
newusers
zamiast tego, który jest przeznaczony do masowego tworzenia użytkowników. Utwórz plik ze wszystkimi użytkownikami w nim, skopiuj go nad do hosta i uruchomićnewusers /path/to/user/list
wcommand
zadaniu.źródło
Można to osiągnąć za pomocą
async
trybu. Poniżej znajdują się odniesienia do tego, jak to zrobić.Refs:
źródło