Є багато причин, за якими відповідальні можуть повіситись на збори, але перш ніж йти далі, ось перший тест, який ви повинні зробити в будь-якій такій ситуації:
ansible -m ping <hostname>
Цей тест просто підключається до хоста та виконує достатній код для повернення:
<hostname> | SUCCESS => {
"changed": false,
"ping": "pong"
}
Якщо це працює, ви можете значною мірою виключити будь-які проблеми з налаштуванням або підключенням, оскільки це доводить, що ви могли вирішити цільове ім'я хоста, відкрити з'єднання, перевірити автентифікацію та виконати модуль ансибілізації за допомогою віддаленого інтерпретатора python.
Тепер ось (не вичерпний) список речей, які можуть піти не так на початку ігрової книги:
Команда, виконана ansible, чекає інтерактивного введення
Я пам’ятаю, як це відбувалося в старих версіях ansible, де команда чекала б інтерактивного вводу, який ніколи не з’явиться, наприклад пароля sudo (коли ви забули -K
перемикач) або прийняття нового відбитка пальця хости ssh (для нової цілі господар).
Сучасні версії ansible вирішують обидва ці випадки витончено і негайно викликають помилку для звичайних випадків використання, тому, якщо ви не робите такі речі, як виклик ssh або sudo самостійно, у вас не повинно виникати подібних проблем. І навіть якби ви це зробили, це було б після факту збору.
Мертве з'єднання ssh master
У журналі налагодження, наведеному тут, є кілька дуже цікавих параметрів, переданих клієнту ssh:
ControlMaster=auto
ControlPersist=60s
ControlPath=/home/vagrant/.ansible/cp/ansible-ssh-%h-%p-%r
Ці параметри задокументовані у man ssh_config .
За замовчуванням ansible намагатиметься бути розумним щодо використання свого ssh-з'єднання. Для даного хоста, замість того, щоб створити нове з'єднання для кожної задачі в п’єсі, вона відкриється один раз і триматиме її відкритою для всієї книги (і навіть для всіх ігор).
Це добре, оскільки встановлення нового з'єднання набагато повільніше та обчислювальне, ніж використання вже наявного.
На практиці кожне ssh-з'єднання перевірятиме наявність сокета у ~/.ansible/cp/some-host-specific-path
. Перше з'єднання не може знайти його, тому він з'єднується нормально, а потім створює його. Кожне наступне з'єднання буде просто використовувати цей розетку для проходження вже встановленого з'єднання.
Навіть якщо встановлене з'єднання нарешті вичерпається та закривається після того, як не використовується досить довго, розетка також закрита, і ми повертаємося до квадратного.
Все йде нормально.
Однак іноді з'єднання насправді відмирає, але ssh-клієнт все ще вважає це встановленим. Зазвичай це відбувається, коли ви запускаєте книгу зі свого ноутбука, і ви втрачаєте WiFi-з'єднання (або переходите з WiFi на Ethernet тощо).
Цей останній приклад - жахлива ситуація: ви можете пришпилити до цільової машини за допомогою конфігурації ssh за замовчуванням, але поки ваше попереднє з'єднання все ще вважається активним, ansible навіть не намагатиметься встановити нове.
На даний момент ми просто хочемо позбутися цієї старої розетки, і найпростіший спосіб зробити це - видалити її:
# 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>
Це ідеально підходить для виправлення одним ударом, але якщо це трапляється занадто часто, можливо, вам доведеться шукати довгострокові виправлення. Ось кілька покажчиків, які можуть допомогти досягти цієї мети:
- Запустіть ігрові книжки з сервера (способом мережевого з’єднання стабільнішим, ніж у вашого ноутбука)
- Використовуйте конфігурацію ansible або безпосередньо ssh-конфігурацію клієнта, щоб відключити обмін з'єднаннями
- Використовуйте ті самі ресурси, але для точної настройки тайм-аутів, щоб фактично збій основного з'єднання швидше закінчувався
Зверніть увагу, що на момент написання тексту змінилося декілька варіантів (наприклад, мій останній запуск дав мені ControlPath=/home/toadjaune/.ansible/cp/871b533295
), але загальна ідея все ще діє.
Факти збирання фактично забирає занадто багато часу
На початку кожної п'єси ansible збирає багато інформації про цільову систему та вкладає її у Факти . Це змінні, які потім можна використовувати у вашій програмі, і зазвичай дуже зручні, але іноді отримання цієї інформації може бути дуже довгим (погані точки монтажу, диски з високим введенням / виводу, велике навантаження…)
Це , як кажуть, не строго потрібні факти , щоб запустити збірку п'єс, і майже напевно не всі з них, так що давайте спробуємо відключити то , що нам не потрібно. Для цього кілька варіантів:
Для налагодження дійсно зручно викликати модуль настройки безпосередньо з командного рядка:
ansible -m setup <hostname>
Ця остання команда повинна висіти, як і ваша книжка, і, врешті-решт, закінчиться тайм-аутом (або успіхом). Тепер давайте виконаємо модуль ще раз, відключивши все, що ми можемо:
ansible -m setup -a gather_subset='!all' <hostname>
Якщо це все ще висить, ви завжди можете спробувати відключити модуль у вашій грі, але це, ймовірно, ваша проблема десь в іншому місці.
Якщо ж це працює добре (і швидко), то ознайомтеся з документацією модуля . У вас є два варіанти:
- Обмежте збір фактів підмножиною, виключаючи те, що вам не потрібно (див. Можливі значення для
gather_subset
)
gather_timeout
також може допомогти вам виправити свою проблему, надаючи більше часу (хоча це могло б виправити помилку очікування, а не повісити)
Інші питання
Очевидно, що інші речі можуть піти не так. Кілька покажчиків, які допоможуть налагодити:
- Скористайтеся максимальним рівнем багатослівності (
-vvvv
), оскільки він покаже вам кожну виконану команду
- Використовуйте
ping
та setup
модулі безпосередньо з командного рядка, як пояснено вище
- Спробуйте ssh вручну, якщо
ansible -m ping
не працює
vagrant ssh
і розслідували під час повірки, щоб побачити, чи є щось корисне вps
іnetstat
? Також одним із перших підозрюваних у зависанні є DNS - перевірте, чи DNS вирішується всередині віртуальної машини.