Saya mengalami beberapa masalah aneh dengan kotak saya (gelandangan).
Semuanya bekerja kemarin dan playbook saya berfungsi dengan baik.
Hari ini, apakah mungkin untuk "mengumpulkan fakta"?
Berikut ini adalah keluaran verbose:
<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
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.Jawaban:
Saya memiliki masalah yang sama dengan Ping kemungkinan pada Vagrant, itu tiba-tiba macet tanpa alasan dan sebelumnya bekerja dengan sangat baik. Tidak seperti masalah lain seperti ssh atau masalah ikat, itu selamanya mati tanpa batas waktu.
Satu hal yang saya lakukan untuk mengatasi masalah ini adalah membersihkan
~/.ansible
direktori dan hanya berfungsi lagi. Saya tidak bisa mencari tahu mengapa, tetapi itu bisa diselesaikan.Jika Anda ingin mengubahnya lagi, coba bersihkan
~/.ansible
foldernya sebelum Anda menyegarkan kembali Vagrant Anda.sumber
rm -rf ~/.ansible
tidak bekerja untuk saya di El CaptitanBagi saya modul pengaturan modul macet di mount NFS mati.
Jika Anda melakukan "df" pada mesin Anda dan tidak ada yang terjadi, Anda mungkin berada pada kasus yang sama.
PS: jika Anda tidak dapat melakukan umount share / mountpoint NFS, pertimbangkan untuk menggunakan "umount -l" yang salah
sumber
gather_facts
untukFalse
tetapi tip ini benar-benar menyelamatkan hari karena itu masalah saya juga.Kemungkinan dapat menggantung seperti ini karena sejumlah alasan, biasanya karena masalah koneksi atau karena modul pengaturan hang. Inilah cara mempersempit masalah sehingga Anda bisa menyelesaikannya.
Kemungkinan tidak dapat terhubung ke host tujuan
Masalah Host Key (known_hosts)
1) Pada versi Ansible yang lebih lama (2.1 atau lebih tua), Ansible tidak akan selalu memberi tahu Anda jika kunci host untuk tujuan tidak ada pada sumbernya, atau jika ada ketidakcocokan.
Solusi: coba buka koneksi SSH dengan parameter yang sama ke tujuan itu. Anda mungkin menemukan kesalahan SSH yang perlu Anda selesaikan, dan kemudian perintah itu akan berfungsi.
2) Terkadang Ansible menampilkan pesan koneksi SSH kepada Anda di tengah-tengah status lainnya, menyebabkan Ansible untuk "membeku" pada tugas itu:
Dalam hal ini, cukup mengetik "ya" untuk sebanyak mungkin pertanyaan SSH yang Anda minta akan memungkinkan permainan berlanjut. Setelah itu, Anda dapat memperbaiki masalah root known_hosts.
Masalah Otentikasi Kunci Pribadi
Jika menggunakan otentikasi berbasis kata kunci vs kata sandi, masalah lain termasuk:
Solusi: coba jalankan
ansible -m ping <destination> -k
melawan host masalah - jika itu tidak berhasil, coba solusi Masalah Kunci Host di atas.Ansible tidak bisa dengan cepat mengumpulkan fakta
The
setup
modul (ketika dijalankan secara otomatis pada awal suatuansible-playbook
run, atau ketika dijalankan secara manual sebagaiansible -m setup <host>
) sering dapat hang ketika mengumpulkan fakta hardware (misalnya jika mendapatkan informasi disk dari host dengan i tinggi / o, buruk me-mount entri, dll).Solusi: coba jalankan
ansible -m setup -a gather_subset=!all <destination>
. Jika ini berhasil, Anda harus mempertimbangkan pengaturan baris ini di ansible.cfg Anda:sumber
ssh-keygen -R
perintah yang disarankan untuk menghapus kunci yang menyinggung. Saya berlari ssh sekali untuk mendapatkan kunci ditambahkan, tetapi menjalankan kedua tergantung. Ketika saya menjalankan ssh lagi, saya mendapatkan prompt konfirmasi kunci yang tidak terduga. Saya menyadari bahwa ada kunci yang menyinggung yang perlu dihapus, jadi setelah menghapus itu dan menjalankan kembali ssh, saya mendapatWarning: Permanently added the ECDSA host key ...
pesan dan kemudian hanya pengumpulan fakta berlanjut.Saya memiliki masalah serupa dengan Ansible hang di Gathering Facts. Saya memangkas skrip saya ke prompt tanpa tugas atau peran dan itu masih menggantung.
Saya menemukan 12 proses yang tergantung pada daftar proses saya yang telah terakumulasi sepanjang hari.
Begitu saya membunuh itu, mulai bekerja lagi.
sumber
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:
Tes ini hanya terhubung ke host, dan mengeksekusi kode yang cukup untuk kembali:
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:
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:
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:
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:
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:
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:
-vvvv
), karena akan menampilkan setiap perintah yang dijalankanping
dansetup
modul langsung dari baris perintah seperti yang dijelaskan di atasansible -m ping
tidak berhasilsumber
Dmytro melakukan sesuatu!
Ansible menggunakan FQDN host. Jika host Anda bukan DNS yang dapat diselesaikan dan Anda tidak memiliki pemetaan yang tidak
/etc/hosts
memungkinkan, DNS akan habis.Dengan menambahkan
::1 <fqdn>
file host dari mesin yang Anda sambungkan, Ansible akan segera mendapatkan FQDN tanpa melalui DNS.Perhatikan bahwa host harus mencari host dari
/etc/hosts
, ini adalah default untuk sebagian besar, jika tidak semua, sistem linux tetapi jika pengeditan Anda/etc/nsswitch.conf
juga yang mungkin menjadi masalah.sumber
Saya memiliki masalah yang sama. Tidak mendapat informasi berguna dari menjalankan ansible dalam mode verbose.
Server disediakan kembali sebelum menjalankan playbook.
Menghapus server dari daftar host yang dikenal memperbaikinya menggunakan perintah di bawah ini.
Catatan: Anda harus menghapus nama host dan alamat ip
sumber
Saya tidak tahu apakah Anda menggunakan sudo playbook - tetapi saya tahu, dan itu tergantung pada kata sandi sudo.
Dari dokumentasi - Anda dapat mematikannya, dan kemudian menggunakannya
-K
juga.Semoga berhasil.
sumber
Mungkin Sidik Jari sistem target Anda telah berubah, misalnya ketika Anda menginstal ulang OS server. Anda harus menghapus entri di known_hosts , ansible tidak akan memberi tahu bahwa entri yang tidak tepercaya adalah masalahnya, itu hanya akan macet persis seperti yang Anda jelaskan.
sumber
Kedengarannya tidak mungkin untuk mengotentikasi ... jadi gunakan -k untuk memungkinkan meminta kata sandi server .... seperti yang ditunjukkan di bawah ini:
sumber
Ketidakcocokan FQDN dan hostname juga dapat menyebabkan hangout yang mungkin terjadi. Saya telah menggunakan FQDN dengan domain berbeda dari domain hostname. Setelah membuat keduanya sama , ansible bekerja dengan sempurna. Kemungkinan memungkinkan membandingkan FQDN dan nama host sebelum menjalankan tugas pada host jarak jauh. Semoga ini bisa membantu!
sumber
Saya memecahkan masalah ini dengan mereset kotak gelandangan
sumber
Dalam kasus saya, mungkin berhenti bekerja di tengah-tengah tugas. Alasannya adalah karena agen ssh saya berhenti bekerja (
ssh-add -l
tidak mengembalikan apa pun). Saya me-restart semuanya dan berhasil lagi. Jadi periksa apakah ssh-agent Anda berfungsi dengan baik (ssh-add -l
tidak boleh macet).sumber
Menghapus
~/.ansible
saja tidak melakukannya untuk saya. Jadi untuk memeriksa apa yang ada di direktori itu, saya hanya melakukan ctrl-z (meletakkan proses untuk tidur) dan memeriksa, dan kemudian melanjutkan proses yang dimungkinkan melaluifg
. Saya tidak menghapus apa pun dalam kasus itu. tapi setelah itu baru dilanjutkan. Jadi saya hanya mencoba ctrl-z->fg
sendirian dan itu juga berhasil. Rasanya seperti menari hujan, tetapi jika orang lain macet, silakan juga coba itu.sumber
Saya telah memperbaiki penyebab masalah ini dengan mengikuti saran dari Mengapa playbook saya yang hangus tergantung pada “Mengumpulkan fakta”? posting blog.
Ini dapat disederhanakan untuk:
Atur
DEFAULT_KEEP_REMOTE_FILES=yes
untuk mempertahankan perintah dan mengaktifkan-vvvv
Jalankan playbook lagi.
Ketika drama berhenti menyalin perintah shell terakhir dicetak (bagian setelah
/bin/sh -c
)Log on server via
ssh
.Gunakan
strace
untuk memutar ulang langkah terakhir dari permainan. Perintah langkah disalin dari-vvv
output. Sebagai contoh:strace -f /bin/sh -c "echo BECOME-SUCCESS-ltxvshvezrnmumzdprccoiekhjheuwxt; /usr/bin/python /home/user/.ansible/tmp/ansible-tmp-1527099315.31-224479822965785/setup.py"
Periksa panggilan mana yang langkah "straced" macet dan perbaiki :)
Dalam kasus saya itu adalah drive jaringan yang tidak dapat diakses ...
sumber
Kata sandi Sudo adalah masalahnya. Pastikan bahwa (1) Anda dapat mengeluarkan 'sudo apapun ' pada terminal yang baru dibuka (di mana kata sandi tidak di-cache) tanpa memberikan satu (2) boneka yang tidak membalikkan perubahan 'sudoers' manual sebelumnya.
sumber