Ansible utknął na zbieraniu faktów

52

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'"]
Bj Błażkowicz
źródło
1
Wisi przez ile czasu? Czy próbowałeś vagrant sshsprawdzić podczas zawieszenia, czy jest coś przydatnego w psi netstat? Ponadto jednym z pierwszych podejrzanych w zawieszaniu jest DNS - sprawdź, czy DNS jest rozpoznawany z poziomu maszyny wirtualnej.
Antonis Christofides,
1
Dziękuję za komentarz. Rozwiązanie było proste, włóczęga zniszczyć i włóczęgować się ... Nadal myślę, że to dziwne, że właśnie przestał działać?
Bj Blazkowicz
1
Miałem problem z przeciąganiem się Ansible, jeśli są niedostępne (cifs-) wierzchowce.
rektide
1
Po prostu tak się stało, że przyczyną był przestarzały klucz hosta w pliku znane_hosty. Dziwne, że połączenie nie zakończyło się niepowodzeniem, jak zwykle w tym przypadku.
GnP
Czy możesz sprawdzić dzienniki sshd w polu włóczęgi? Może być konieczne ustawienie „LogLevel DEBUG” w / etc / ssh / sshd_config, ale może to dostarczyć więcej informacji o tym, co się dzieje.
Pablo Martinez,

Odpowiedzi:

31

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 ~/.ansiblekatalogu 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ć ~/.ansiblefolder przed odświeżeniem Vagrant.

yikaus
źródło
3
rm -rf ~/.ansiblenie działa mi na El Captitan
Quanlong
8
rm -rf ~ / .ansible / cp wystarczy
melihovv
20

Dla 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”

Sebastien DA ROCHA
źródło
tak, to było to!
Saurabh Nanda
Rozwiązałem ten problem na początku, ustawiając gather_factsna, Falseale ta wskazówka naprawdę uratowała ten dzień, ponieważ to był mój problem.
pkaramol
18

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:

Warning: the ECDSA host key for 'myhost' differs from the key for the IP address '10.10.1.10'
Offending key for IP in /etc/ssh/ssh_known_hosts:246
Matching host key in /etc/ssh/ssh_known_hosts:477
Are you sure you want to continue connecting (yes/no)?

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ą:

  • Klucz prywatny może być nieprawidłowo skonfigurowany w miejscu docelowym
  • Klucz prywatny może mieć nieprawidłowe uprawnienia lokalnie (powinien być czytelny tylko dla użytkownika uruchamiającego zadanie Ansible)

Rozwiązanie: spróbuj uruchomić ansible -m ping <destination> -khost 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

setupModuł (gdy uruchomi się automatycznie na początku w ansible-playbookbiegu, lub gdy prowadzony ręcznie ansible -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:

gather_subset=!hardware
Jordan Anderson
źródło
1
Przekazywanie do „gather_subset =! Hardware” do instalacji działało dla konkretnej maszyny wirtualnej, która nie odpowiadała.
JamesP
2
Naprawiono dla mnie. Chyba dziwne punkty montowania. Miałem maszynę wirtualną, której użyłem do obsługi ansible, i działała do momentu dodania nowego udziału NFS. Teraz tak nie jest, dopóki nie dodałem powyższego.
David Boshton,
W moim przypadku okazał się kluczowym problemem hosta. Host został ponownie zobrazowany, więc moje pierwsze uruchomienie nie powiodło się i uruchomiłem sugerowane ssh-keygen -Rpolecenie, 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łem Warning: Permanently added the ECDSA host key ...wiadomość, a następnie kontynuowałem tylko zbieranie faktów.
haridsv
Mogę potwierdzić obserwację z @DavidBoshton. Miał ten problem na maszynie Wirtualnej, która miała zamontowane katalogi NFS, które nie były dostępne (problem z serwerem NFS). Po naprawieniu serwera NFS działało
tschale
7

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.

/usr/bin/python /tmp/ansible_Jfv4PA/ansible_module_setup.py
/usr/bin/python /tmp/ansible_M2T10L/ansible_module_setup.py

Kiedy je zabiłem, znów zaczęło działać.

Tim Moses
źródło
5

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:

ansible -m ping <hostname>

Ten test po prostu łączy się z hostem i wykonuje wystarczającą ilość kodu, aby zwrócić:

<hostname> | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

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 -Kprzełą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:

# Delete all the current sockets (may disrupt currently running playbooks)
rm -r ~/.ansible/cp
# Delete only the affected socket (requires to know which one it is)
rm ~/.ansible/cp/<replace-by-your-socket>

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:

  • Uruchamiaj poradniki z serwera (połączenie sieciowe jest znacznie bardziej stabilne niż w laptopie)
  • Użyj konfiguracji ansible lub bezpośrednio konfiguracji klienta ssh, aby wyłączyć udostępnianie połączenia
  • Korzystaj z tych samych zasobów, ale dostrajaj limity czasu, aby awaria połączenia nadrzędnego faktycznie upływała szybciej

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ń:

ansible -m setup <hostname>

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:

ansible -m setup -a gather_subset='!all' <hostname>

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:

  • Ogranicz zbieranie faktów do podzbioru, wyłączając to, czego nie potrzebujesz (zobacz możliwe wartości dla 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:

  • Użyj ansible maximum verbosity level ( -vvvv), ponieważ pokaże ci każde wykonane polecenie
  • Użyj pingi setupmodułów bezpośrednio z wiersza polecenia, jak wyjaśniono powyżej
  • Spróbuj ssh ręcznie, jeśli ansible -m pingnie działa
toadjaune
źródło
4

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/hostsansible, 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.confrównież może być problemem.

użytkownik56781
źródło
2

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.

$ ssh-keygen -f "~/.ssh/known_hosts" -R <hostname>
$ ssh-keygen -f "~/.ssh/known_hosts" -R <ip_address>

Uwaga: musisz usunąć zarówno nazwę hosta, jak i adres IP

Rleon
źródło
W moim przypadku ponownie użyłem adresu IP. Stąd dwa klucze hosta były obecne w pliku znane_hosty
Karthik
1

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ć -Krównież.

Powodzenia.

Rcynic
źródło
1

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.

Schroeffu
źródło
1

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:

ansible-playbook  -K -i hosts playbook.yml -vvvv
0x3bfc
źródło
0

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!

Dmytro Ozarkiv
źródło
0

Rozwiązałem ten problem, resetując włóczęgę

vagrant destroy
vagrant up
Quanlong
źródło
0

W moim przypadku ansible przestał działać w trakcie zadania. Powodem było to, że mój ssh-agent przestał działać ( ssh-add -lnic nie zwracał). Zrestartowałem wszystko i znów zadziałało. Sprawdź więc, czy Twój agent ssh działa poprawnie ( ssh-add -lnie powinien się zacinać).

Vasco
źródło
0

Samo ~/.ansibleusunię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średnictwem fg. W tym przypadku nic nie usunąłem. ale potem to trwało. Właśnie wypróbowałem ctrl-z-> fgsam i zadziałało. Czujesz się jak taniec deszczu, ale jeśli ktoś utknął, spróbuj również tego.

erikbwork
źródło
0

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ć:

  1. Ustaw, DEFAULT_KEEP_REMOTE_FILES=yesaby zachować polecenia i włączyć-vvvv

  2. Uruchom ponownie podręcznik.

  3. Gdy gra utknie, skopiuj ostatnie wydrukowane polecenie powłoki (część po /bin/sh -c)

  4. Zaloguj się do serwera za pośrednictwem ssh.

  5. Użyj, straceaby odtworzyć ostatni krok gry. Komenda step jest kopiowana z -vvvwyjś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"

  6. Sprawdź, które połączenie utknęło i utknął krok :)

W moim przypadku był to niedostępny dysk sieciowy ...

Jurij
źródło
-1

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”.

witkacy26
źródło
1
Marionetka? Jaka marionetka? To jest odpowiedź na pytanie.
Deer Hunter
Tak, wiem. Niektórzy ludzie mogą mieć zainstalowaną marionetkę na tej samej maszynie, na której używany jest ansible (tak było kiedyś w moim przypadku)
witkacy26,