Ada banyak alasan mengapa seseorang bisa digantung di pengumpulan fakta, tetapi sebelum melangkah lebih jauh, inilah ujian pertama yang harus Anda lakukan dalam situasi seperti itu:
ansible -m ping <hostname>
Tes ini hanya terhubung ke host, dan mengeksekusi kode yang cukup untuk kembali:
<hostname> | SUCCESS => {
"changed": false,
"ping": "pong"
}
Jika ini berhasil, Anda dapat menyingkirkan masalah pengaturan atau konektivitas, karena ini membuktikan bahwa Anda dapat menyelesaikan nama host target, membuka koneksi, mengautentikasi, dan menjalankan modul yang memungkinkan dengan interpreter python jarak jauh.
Sekarang, berikut adalah daftar (tidak lengkap) hal-hal yang bisa salah di awal buku pedoman:
Perintah yang dijalankan oleh ansible sedang menunggu input interaktif
Saya dapat mengingat ini terjadi pada versi yang lebih lama, di mana perintah akan menunggu input interaktif yang tidak akan pernah datang, seperti kata sandi sudo (ketika Anda lupa -K
switch), atau penerimaan sidik jari host ssh baru (untuk target baru tuan rumah).
Versi modern dari kemungkinan menangani kedua kasus ini dengan anggun dan segera meningkatkan kesalahan untuk penggunaan normal, jadi kecuali Anda melakukan hal-hal seperti memanggil ssh atau sudo sendiri, Anda seharusnya tidak memiliki masalah seperti ini. Dan bahkan jika Anda melakukannya, itu akan terjadi setelah pengumpulan fakta.
Koneksi master ssh mati
Ada beberapa opsi yang sangat menarik diteruskan ke klien ssh, di log debug yang diberikan di sini:
ControlMaster=auto
ControlPersist=60s
ControlPath=/home/vagrant/.ansible/cp/ansible-ssh-%h-%p-%r
Opsi-opsi ini didokumentasikan dalam man ssh_config .
Secara default, ansible akan mencoba dan pandai mengenai penggunaan koneksi ssh-nya. Untuk host tertentu, alih-alih membuat koneksi baru untuk masing-masing dan setiap tugas dalam permainan, itu akan membukanya sekali, dan membuatnya tetap terbuka untuk seluruh playbook (dan bahkan di seluruh playbook).
Itu bagus, karena membuat koneksi baru jauh lebih lambat dan intensif komputasi daripada menggunakan yang sudah ada.
Dalam praktiknya, setiap koneksi ssh akan memeriksa keberadaan soket di ~/.ansible/cp/some-host-specific-path
. Koneksi pertama tidak dapat menemukannya, sehingga terhubung secara normal, dan kemudian membuatnya. Setiap koneksi selanjutnya hanya akan menggunakan soket ini untuk pergi melalui koneksi yang sudah ada.
Bahkan jika koneksi yang terbentuk akhirnya mati dan menutup setelah tidak digunakan cukup lama, soketnya juga tertutup, dan kami kembali ke titik awal.
Sejauh ini bagus.
Namun kadang-kadang, koneksi benar-benar mati, tetapi klien ssh masih menganggapnya telah dibuat. Ini biasanya terjadi ketika Anda menjalankan playbook dari laptop Anda, dan Anda kehilangan koneksi WiFi Anda (atau beralih dari WiFi ke Ethernet, dll ...)
Contoh terakhir ini adalah situasi yang mengerikan: Anda dapat ssh ke mesin target dengan konfigurasi ssh default, tetapi selama koneksi Anda sebelumnya masih dianggap aktif, mungkin tidak akan mencoba membuat yang baru.
Pada titik ini, kami hanya ingin menyingkirkan soket lama ini, dan cara paling sederhana untuk melakukannya adalah menghapusnya:
# 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>
Ini sempurna untuk perbaikan sekali pakai, tetapi jika itu terjadi terlalu sering, Anda mungkin perlu mencari perbaikan jangka panjang. Berikut adalah beberapa petunjuk yang dapat membantu mencapai tujuan ini:
- Mulai playbook dari server (dengan cara koneksi jaringan yang lebih stabil daripada laptop Anda)
- Gunakan konfigurasi yang memungkinkan , atau langsung ssh konfigurasi klien untuk menonaktifkan berbagi koneksi
- Gunakan sumber daya yang sama, tetapi untuk menyempurnakan timeout, sehingga koneksi master crash lebih cepat habis
Harap perhatikan bahwa pada saat penulisan, beberapa opsi telah berubah (misalnya, jangka terakhir saya memberi saya ControlPath=/home/toadjaune/.ansible/cp/871b533295
), tetapi gagasan umum masih valid.
Pengumpulan fakta sebenarnya membutuhkan terlalu banyak waktu
Di awal setiap permainan, anonim mengumpulkan banyak informasi tentang sistem target, dan memasukkannya ke dalam Fakta . Ini adalah variabel yang dapat Anda gunakan di playbook Anda, dan biasanya sangat berguna, tetapi kadang-kadang, mendapatkan info ini bisa sangat lama (titik pemasangan yang buruk, disk dengan i / o tinggi, beban tinggi ...)
Dikatakan bahwa, Anda tidak benar - benar membutuhkan fakta untuk menjalankan buku pedoman, dan hampir pasti tidak semuanya, jadi mari kita coba nonaktifkan apa yang tidak kita butuhkan. Beberapa opsi untuk itu:
Untuk keperluan debugging, sangat mudah untuk memanggil modul pengaturan langsung dari baris perintah:
ansible -m setup <hostname>
Perintah terakhir ini harus digantung seperti halnya buku pedoman Anda, dan akhirnya batas waktu (atau berhasil). Sekarang, mari kita jalankan modul lagi, menonaktifkan semua yang kita bisa:
ansible -m setup -a gather_subset='!all' <hostname>
Jika ini masih hang, Anda selalu dapat mencoba dan menonaktifkan sepenuhnya modul dalam permainan Anda, tetapi kemungkinan besar masalah Anda ada di tempat lain.
Namun, jika berfungsi dengan baik (dan cepat), lihat dokumentasi modul . Anda memiliki dua opsi:
- Batasi pengumpulan fakta untuk subset, mengecualikan apa yang tidak Anda butuhkan (lihat nilai yang mungkin untuk
gather_subset
)
gather_timeout
juga dapat membantu Anda memperbaiki masalah Anda, dengan memberikan lebih banyak waktu (meskipun itu akan memperbaiki kesalahan batas waktu, bukan hang)
Masalah lain
Jelas, hal-hal lain bisa salah. Beberapa petunjuk untuk membantu debugging:
- Gunakan tingkat verbositas maksimum yang dimungkinkan (
-vvvv
), karena akan menampilkan setiap perintah yang dijalankan
- Gunakan
ping
dan setup
modul langsung dari baris perintah seperti yang dijelaskan di atas
- Cobalah ssh secara manual jika
ansible -m ping
tidak berhasil
vagrant ssh
dan menyelidiki selama hang untuk melihat apakah ada sesuatu yang berguna di dalamps
dannetstat
? Juga, salah satu tersangka pertama di hang adalah DNS - periksa apakah DNS menyelesaikan dari dalam mesin virtual.