Mam dziwne problemy z moją skrzynką odbiorczą (włóczęgą).
Wszystko działało wczoraj, a mój podręcznik działał dobrze.
Dzisiaj ansible opiera się na „zbieraniu faktów”?
Oto pełne wyjście:
<5.xxx.xxx.xxx> ESTABLISH CONNECTION FOR USER: deploy
<5.xxx.xxx.xxx> REMOTE_MODULE setup
<5.xxx.xxx.xxx> EXEC ['ssh', '-C', '-tt', '-vvv', '-o', 'ControlMaster=auto', '-
o', 'ControlPersist=60s', '-o', 'ControlPath=/home/vagrant/.ansible/cp/ansible-s
sh-%h-%p-%r', '-o', 'Port=2221', '-o', 'KbdInteractiveAuthentication=no', '-o',
'PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey', '-o
', 'PasswordAuthentication=no', '-o', 'User=deploy', '-o', 'ConnectTimeout=10',
'5.xxx.xxx.xxx', "/bin/sh -c 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1411372677
.18-251130781588968 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1411372677.18-2
51130781588968 && echo $HOME/.ansible/tmp/ansible-tmp-1411372677.18-251130781588
968'"]
vagrant ssh
sprawdzić podczas zawieszenia, czy jest coś przydatnego wps
inetstat
? Ponadto jednym z pierwszych podejrzanych w zawieszaniu jest DNS - sprawdź, czy DNS jest rozpoznawany z poziomu maszyny wirtualnej.Odpowiedzi:
Miałem podobny problem z Ansible ping na Vagrant, po prostu nagle utknął bez powodu i wcześniej działał absolutnie dobrze. W przeciwieństwie do innych problemów, takich jak ssh lub problem z łącznością, po prostu na zawsze umrze bez limitu czasu.
Jedną rzeczą, którą zrobiłem, aby rozwiązać ten problem, jest wyczyszczenie
~/.ansible
katalogu i po prostu działa ponownie. Nie mogę się dowiedzieć dlaczego, ale problem został rozwiązany.Jeśli masz zmiany, aby mieć to ponownie, spróbuj wyczyścić
~/.ansible
folder przed odświeżeniem Vagrant.źródło
rm -rf ~/.ansible
nie działa mi na El CaptitanDla mnie moduł modułu konfiguracji utknął na martwym mocowaniu NFS.
Jeśli zrobisz „df” na swoim komputerze i nic się nie dzieje, możesz być w tej samej sprawie.
PS: jeśli nie możesz umountować udziału / punktu montowania NFS, rozważ użycie złego „umount -l”
źródło
gather_facts
na,False
ale ta wskazówka naprawdę uratowała ten dzień, ponieważ to był mój problem.Ansible może zawiesić się z kilku powodów, zwykle z powodu problemu z połączeniem lub z powodu zawieszenia modułu instalacyjnego. Oto jak zawęzić problem, abyś mógł go rozwiązać.
Ansible nie może połączyć się z hostem docelowym
Problemy z kluczem hosta (znane_hosty)
1) W starszych wersjach Ansible (2.1 lub starszych) Ansible nie zawsze powiedziałby ci, czy klucz hosta dla miejsca docelowego nie istnieje w źródle, czy też występuje niezgodność.
Rozwiązanie: spróbuj otworzyć połączenie SSH z tymi samymi parametrami do tego miejsca docelowego. Możesz znaleźć błędy SSH, które musisz rozwiązać, a wtedy polecenie będzie działać.
2) Czasami Ansible wyświetla komunikat połączenia SSH pośród innych statusów, powodując, że Ansible „zawiesza się” w tym zadaniu:
W takim przypadku po prostu wpisanie „tak” dla tylu pytań SSH, jakie zostały zadane, pozwoli na kontynuowanie gry. Następnie możesz naprawić problemy związane z rootami znane_hosty.
Problemy z uwierzytelnianiem klucza prywatnego
Jeśli używasz uwierzytelniania opartego na kluczu zamiast hasła, inne problemy obejmują:
Rozwiązanie: spróbuj uruchomić
ansible -m ping <destination> -k
host z problemami - jeśli to nie zadziała, wypróbuj powyższe rozwiązania problemów z kluczowymi problemami hosta .Ansible nie może szybko zebrać faktów
setup
Moduł (gdy uruchomi się automatycznie na początku wansible-playbook
biegu, lub gdy prowadzony ręcznieansible -m setup <host>
) często może zawiesić podczas zbierania faktów sprzętowych (np jeśli uzyskanie informacji na dysku z gospodarzami z wysokim I / O, złych osadzone są wpisy, etc.).Rozwiązanie: spróbuj uruchomić
ansible -m setup -a gather_subset=!all <destination>
. Jeśli to zadziała, powinieneś rozważyć ustawienie tej linii w pliku ansible.cfg:źródło
ssh-keygen -R
polecenie, aby usunąć naruszający klucz. Raz uruchomiłem ssh, żeby dodać klucz, ale drugi bieg się zawiesił. Kiedy ponownie uruchomiłem ssh, otrzymałem monit o potwierdzenie klucza, który był nieoczekiwany. Uświadomiłem sobie, że istnieje obraźliwy klucz, który musiał zostać usunięty, więc po usunięciu go i ponownym uruchomieniu ssh dostałemWarning: Permanently added the ECDSA host key ...
wiadomość, a następnie kontynuowałem tylko zbieranie faktów.Miałem podobny problem z Ansible wisi na zebraniu faktów. Sprowadziłem skrypt do monitu, bez zadań i ról, i nadal się zawiesił.
Na mojej liście procesów znalazłem 12 zawieszonych procesów odpowiadających, które zgromadziły się w ciągu dnia.
Kiedy je zabiłem, znów zaczęło działać.
źródło
Istnieje wiele powodów, dla których ansible może zawiesić się podczas zbierania faktów, ale zanim przejdziemy dalej, oto pierwszy test, który powinieneś zrobić w takiej sytuacji:
Ten test po prostu łączy się z hostem i wykonuje wystarczającą ilość kodu, aby zwrócić:
Jeśli to zadziała, możesz praktycznie wykluczyć wszelkie problemy z konfiguracją lub łącznością, ponieważ dowodzi to, że możesz rozwiązać docelową nazwę hosta, otworzyć połączenie, uwierzytelnić się i uruchomić moduł odpowiadający za pomocą zdalnego interpretera python.
Oto (niewyczerpująca) lista rzeczy, które mogą się nie udać na początku podręcznika:
Polecenie wykonane przez ansible czeka na interaktywne wejście
Pamiętam, że działo się to w starszych wersjach ansible, gdzie polecenie czekałoby na interaktywne wejście, które nigdy nie nadejdzie, takie jak hasło sudo (gdy zapomnisz
-K
przełącznika) lub akceptacja nowego odcisku palca hosta ssh (dla nowego celu gospodarz).Nowoczesne wersje ansible obsługują oba te przypadki z wdziękiem i natychmiast zgłaszają błąd w normalnych przypadkach użycia, więc jeśli nie robisz rzeczy takich jak wywołanie ssh lub sudo, nie powinieneś mieć tego rodzaju problemu. A nawet gdyby tak było, byłoby to po zebraniu faktów.
Dead master ssh connection
Istnieje kilka bardzo interesujących opcji przekazanych klientowi ssh w podanym tutaj dzienniku debugowania:
ControlMaster=auto
ControlPersist=60s
ControlPath=/home/vagrant/.ansible/cp/ansible-ssh-%h-%p-%r
Opcje te są udokumentowane w man ssh_config .
Domyślnie ansible będzie sprytnie pod względem korzystania z połączenia ssh. Dla danego hosta zamiast tworzyć nowe połączenie dla każdego zadania w grze, otworzy je raz i pozostanie otwarte dla całego podręcznika (a nawet wszystkich podręczników).
To dobrze, ponieważ ustanowienie nowego połączenia jest znacznie wolniejsze i wymaga intensywniejszych obliczeń niż korzystanie z już istniejącego.
W praktyce każde połączenie ssh sprawdzi istnienie gniazda w
~/.ansible/cp/some-host-specific-path
. Pierwsze połączenie nie może go znaleźć, więc łączy się normalnie, a następnie tworzy je. Każde kolejne połączenie będzie wtedy używać tego gniazda do przejścia przez już ustanowione połączenie.Nawet jeśli ustanowione połączenie w końcu skończy się i zamyka po nieużywaniu przez wystarczająco długi czas, gniazdo jest również zamknięte, a my wracamy do punktu wyjścia.
Na razie w porządku.
Czasami jednak połączenie faktycznie zanika, ale klient ssh nadal uważa, że zostało ustanowione. Zazwyczaj dzieje się tak, gdy uruchamiasz podręcznik z laptopa i tracisz połączenie Wi-Fi (lub przełączasz się z Wi-Fi na Ethernet itp.)
Ten ostatni przykład jest straszna sytuacja: ty może ssh do urządzenia docelowego za pomocą domyślnej konfiguracji ssh, ale tak długo jak poprzednia gra jest nadal uważane za aktywne, ansibl nie będzie nawet próbować ustanowienie nowego.
W tym momencie chcemy po prostu pozbyć się tego starego gniazda, a najprostszym sposobem na to jest jego usunięcie:
Jest to idealne rozwiązanie dla jednorazowej poprawki, ale jeśli zdarza się to zbyt często, może być konieczne znalezienie rozwiązania długoterminowego. Oto kilka wskazówek, które mogą pomóc w osiągnięciu tego celu:
Należy pamiętać, że w momencie pisania zmieniło się kilka opcji (na przykład moja ostatnia seria dała mi
ControlPath=/home/toadjaune/.ansible/cp/871b533295
), ale ogólny pomysł jest nadal aktualny.Zbieranie faktów zajmuje zbyt wiele czasu
Na początku każdej gry ansible zbiera wiele informacji o systemie docelowym i umieszcza je w faktach . Są to zmienne, których możesz użyć w swoim poradniku i są one zwykle bardzo przydatne, ale czasami uzyskanie tych informacji może być bardzo długie (złe punkty montowania, dyski z wysokim we / wy, duże obciążenie…)
Mówiąc to, nie bezwzględnie potrzebują faktów uruchomić playbook, a prawie na pewno nie wszystkie z nich, więc spróbujmy i wyłączyć, czego nie potrzebujesz. Kilka opcji:
Do celów debugowania bardzo wygodnie jest wywołać moduł instalacyjny bezpośrednio z wiersza poleceń:
To ostatnie polecenie powinno się zawiesić, podobnie jak twój poradnik, i ostatecznie przekroczyć limit czasu (lub zakończyć się sukcesem). Teraz uruchommy ponownie moduł, wyłączając wszystko, co możemy:
Jeśli nadal się zawiesza, zawsze możesz spróbować całkowicie wyłączyć moduł w swojej grze, ale jest bardzo prawdopodobne, że twój problem jest gdzie indziej.
Jeśli jednak działa dobrze (i szybko), zajrzyj do dokumentacji modułu . Masz dwie opcje:
gather_subset
)gather_timeout
może również pomóc w rozwiązaniu problemu, dając więcej czasu (chociaż byłoby to naprawienie błędu przekroczenia limitu czasu, a nie zawieszenie się)Inne sprawy
Oczywiście inne rzeczy mogą pójść nie tak. Kilka wskazówek ułatwiających debugowanie:
-vvvv
), ponieważ pokaże ci każde wykonane polecenieping
isetup
modułów bezpośrednio z wiersza polecenia, jak wyjaśniono powyżejansible -m ping
nie działaźródło
Dmytro ma coś do roboty!
Ansible używa nazwy FQDN hosta. Jeśli twój host nie jest rozpoznawalny przez DNS i nie masz odwzorowania w
/etc/hosts
ansible, poczeka na przekroczenie limitu czasu DNS.Dodając
::1 <fqdn>
plik hosta maszyn, z którymi się łączysz, Ansible natychmiast otrzyma nazwę FQDN bez przechodzenia przez DNS.Zauważ, że host powinien wyszukiwać hosty
/etc/hosts
, jest to ustawienie domyślne dla większości, jeśli nie wszystkich, systemów Linux, ale jeśli Twoja edycja/etc/nsswitch.conf
również może być problemem.źródło
Miałem ten sam problem. Nie otrzymałem żadnych użytecznych informacji od uruchomienia ansible w trybie pełnym.
Serwer został ponownie przygotowany przed uruchomieniem playbooka.
Usunięcie serwera ze znanej listy hostów naprawiło to za pomocą poniższego polecenia.
Uwaga: musisz usunąć zarówno nazwę hosta, jak i adres IP
źródło
Nie wiem, czy używasz podręcznika sudo - ale ja tak było i wisiało na nim hasło sudo.
Z dokumentacji - możesz to zabić, a następnie użyć
-K
również.Powodzenia.
źródło
Być może zmienił się odcisk palca systemu docelowego, na przykład podczas ponownej instalacji systemu operacyjnego serwera. Musisz usunąć wpisy w znane_hostach , ansible nie powiadomi, że problemem jest niezaufany wpis, po prostu zacina się dokładnie tak, jak to opisano.
źródło
Wygląda na to, że ansible nie może się uwierzytelnić ... więc użyj -k, aby pozwolić ansible poprosić o hasło serwera .... jak pokazano poniżej:
źródło
Niezgodność nazwy FQDN i nazwy hosta może również powodować hangout z odpowiedzią. Użyłem nazwy FQDN z domeną inną niż domena hosta. Po wyrównaniu obu , ansible działa doskonale. Prawdopodobnie ansible porównuje FQDN i nazwę hosta przed wykonaniem zadań na zdalnym hoście. Mam nadzieję, że to pomoże!
źródło
Rozwiązałem ten problem, resetując włóczęgę
źródło
W moim przypadku ansible przestał działać w trakcie zadania. Powodem było to, że mój ssh-agent przestał działać (
ssh-add -l
nic nie zwracał). Zrestartowałem wszystko i znów zadziałało. Sprawdź więc, czy Twój agent ssh działa poprawnie (ssh-add -l
nie powinien się zacinać).źródło
Samo
~/.ansible
usunięcie nie zrobiło tego dla mnie. Aby sprawdzić, co jest w tym katalogu, właśnie wykonałem ctrl-z (uśpienie procesu) i sprawdziłem, a następnie kontynuowałem proces ansible za pośrednictwemfg
. W tym przypadku nic nie usunąłem. ale potem to trwało. Właśnie wypróbowałem ctrl-z->fg
sam i zadziałało. Czujesz się jak taniec deszczu, ale jeśli ktoś utknął, spróbuj również tego.źródło
Rozwiązałem przyczynę tego problemu, postępując zgodnie ze wskazówkami z Dlaczego mój podręcznik ansible wisi w „Zbieranie faktów”? post na blogu.
Można to uprościć:
Ustaw,
DEFAULT_KEEP_REMOTE_FILES=yes
aby zachować polecenia i włączyć-vvvv
Uruchom ponownie podręcznik.
Gdy gra utknie, skopiuj ostatnie wydrukowane polecenie powłoki (część po
/bin/sh -c
)Zaloguj się do serwera za pośrednictwem
ssh
.Użyj,
strace
aby odtworzyć ostatni krok gry. Komenda step jest kopiowana z-vvv
wyjścia. Na przykład:strace -f /bin/sh -c "echo BECOME-SUCCESS-ltxvshvezrnmumzdprccoiekhjheuwxt; /usr/bin/python /home/user/.ansible/tmp/ansible-tmp-1527099315.31-224479822965785/setup.py"
Sprawdź, które połączenie utknęło i utknął krok :)
W moim przypadku był to niedostępny dysk sieciowy ...
źródło
Problem stanowi hasło Sudo. Upewnij się, że (1) możesz wydać polecenie „sudo cokolwiek ” na nowo otwartym terminalu (gdzie hasło nie jest buforowane) bez podawania jednego (2), że marionetka nie cofnęła wcześniejszych zmian instrukcji „sudoers”.
źródło