Ansible'ın gerçekleri bir araya toplamanın neden pek çok nedeni var, ancak daha ileri gitmeden önce, böyle bir durumda yapmanız gereken ilk test:
ansible -m ping <hostname>
Bu test sadece ana bilgisayara bağlanır ve geri dönmek için yeterli kodu çalıştırır:
<hostname> | SUCCESS => {
"changed": false,
"ping": "pong"
}
Bu işe yararsa, hedef ana bilgisayar adını çözebileceğiniz, bir bağlantı açabileceğinizi, kimliğinizi doğrulayabildiğinizi ve uzak bir python yorumlayıcısıyla uyumlu bir modül çalıştırabileceğini kanıtladığından, herhangi bir kurulum veya bağlantı sorununu hemen hemen göz ardı edebilirsiniz.
Şimdi, işte bir oyun kitabının başında yanlış gidebilecek şeylerin (ayrıntılı olmayan) bir listesi:
Ansible tarafından yürütülen komut etkileşimli bir girişi bekliyor
Bunun, bir sudo şifresi (bir -K
anahtarı unuttuğunuzda ) veya asla yeni bir ssh ana bilgisayarı parmak izi kabul etmeden etkileşimli bir giriş için bekleyeceği bir komutun bekleyeceği daha eski sürümlerde olduğunu hatırlıyorum. ) ev sahipliği yapar.
Ansible'ın modern versiyonları bu davaların her ikisini de incelikle ele alır ve normal kullanımlar için hemen bir hataya neden olur, bu yüzden ssh veya sudo gibi şeyler yapmadığınız sürece, bu tür bir sorun yaşamamalısınız. Öyle yapsanız bile, gerçeklerin toplanmasından sonra olur.
Ölü ssh ana bağlantısı
Burada verilen hata ayıklama günlüğünde ssh istemcisine iletilen bazı ilginç seçenekler var:
ControlMaster=auto
ControlPersist=60s
ControlPath=/home/vagrant/.ansible/cp/ansible-ssh-%h-%p-%r
Bu seçenekler man ssh_config dosyasında belgelenmiştir .
Varsayılan olarak, ansible, ssh bağlantısı kullanımı konusunda akıllı olmaya çalışır. Belirli bir ana bilgisayar için, oyundaki her bir görev için yeni bir bağlantı oluşturmak yerine, bir kez açılacak ve tüm oyun kitabı (ve hatta oyun kitaplarında bile) için açık kalacaktır.
Yeni bir bağlantı kurmak zaten mevcut olanı kullanmaktan çok daha yavaş ve hesaplama yoğun olduğu için bu iyi.
Uygulamada, her ssh bağlantısı adresinde bir soketin varlığını kontrol edecektir ~/.ansible/cp/some-host-specific-path
. İlk bağlantı bulamıyor, bu yüzden normal bağlanır ve sonra onu oluşturur. Daha sonra yapılan her bağlantı, daha önce kurulmuş olan bağlantıdan geçmek için bu soketi kullanacaktır.
Kurulan bağlantı nihayet zaman aşımına uğradıysa ve yeterince uzun süre kullanılmadığında kapansa bile, soket de kapalıdır ve tekrar kare bağlantıya geçiyoruz.
Çok uzak çok iyi.
Ancak bazen, bağlantı gerçekte ölür, ancak ssh istemcisi hala kurmuş olduğunu düşünür. Bu, genellikle oyun kitabını dizüstü bilgisayarınızdan çalıştırdığınızda olur ve WiFi bağlantınızı kaybederseniz (ya da WiFi’ten Ethernet’e vb.
Bu son örnek, çok kötü bir durum: Eğer yapabilirsiniz varsayılan ssh yapılandırma ile hedef makineye ssh ancak bu süre önceki bağlantı hala etkin olarak kabul edileceği için yanıtlayıcı 'bile yenisini kuran denemez.
Bu noktada, biz sadece bu eski soketten kurtulmak istiyoruz, ve bunu yapmanın en basit yolu onu çıkarmaktır:
# 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>
Bu tek seferlik bir düzeltme için mükemmeldir, ancak çok sık gerçekleşirse daha uzun vadeli bir düzeltme yapmanız gerekebilir. İşte bu hedefe yardımcı olabilecek bazı öneriler:
- Bir kitapçıdan oyun kitaplarını başlatın (ağ bağlantınız dizüstü bilgisayarınızınkinden daha kararlı)
- Kullanım yanıtlayıcı 'yapılandırmayı veya doğrudan ssh istemci yapılandırma bağlantı paylaşımını devre dışı bırakmak
- Aynı kaynakları kullanın, ancak zaman aşımına uğrayan ince ayarları yapmak için ana bağlantı çökmesinin gerçekte daha hızlı zaman aşımına uğraması
Lütfen, yazı yazarken, birkaç seçeneğin değiştiğini (örneğin, en son çalıştırmam bana verdi ControlPath=/home/toadjaune/.ansible/cp/871b533295
), ancak genel fikrin hala geçerli olduğunu unutmayın.
Bilgi toplama aslında çok fazla zaman alıyor
Her oyunun başında, ansible hedef sistem hakkında çok fazla bilgi toplar ve bunları Gerçeklere koyar . Bunlar daha sonra oynatma kitabınızda kullanabileceğiniz değişkenlerdir ve genellikle gerçekten kullanışlıdır, ancak bazen bu bilgiyi almak çok uzun olabilir (kötü montaj noktaları, yüksek giriş / çıkışlı diskler, yüksek yük ...)
Bu söyleniyor, kesinlikle bir oyun kitabı çalıştırmak için gerçeklere ihtiyacınız yok ve neredeyse hepsi değil, o yüzden hadi ihtiyacımız olanı etkisizleştirelim. Bunun için çeşitli seçenekler:
- Kurulum modülünü tamamen devre dışı bırakın
- Kurulum modülünün yapılandırmasını, yalnızca belirli parçalarını içerecek şekilde değiştirin.
Hata ayıklama amacıyla, kurulum modülünü doğrudan komut satırından çağırmak gerçekten uygundur:
ansible -m setup <hostname>
Bu son komut, oynatma kitabınızın yanı sıra askıda kalmalı ve sonunda zaman aşımına uğrama (veya başarılı) olmalıdır. Şimdi, modülü tekrar çalıştıralım, yapabileceğimiz her şeyi devre dışı bırakalım:
ansible -m setup -a gather_subset='!all' <hostname>
Bu hala askıda kalırsa, oyununuzdaki modülü tamamen tamamen deneyebilir ve devre dışı bırakabilirsiniz, ancak probleminizin başka bir yerde olması muhtemeldir.
Ancak, iyi çalışıyorsa (ve hızlı bir şekilde çalışıyorsa), modül belgelerine bir göz atın . İki seçeneğiniz var:
- Gereksinim duymadığınız şeyleri hariç olmak üzere, bir altküme toplama özelliğini sınırlandırın (olası değerleri görün
gather_subset
)
gather_timeout
Ayrıca, daha fazla zaman tanıyarak da sorununuzu çözmenize yardımcı olabilir (bu bir takma zaman aşımı hatasını düzeltmek olsa da)
Diğer sorunlar
Açıkçası, başka şeyler yanlış gidebilir. Hata ayıklamaya yardımcı olacak birkaç işaretçi:
- Yürütülen
-vvvv
her komutu size göstereceğinden, ansible maximum verbosity level ( ) kullanın.
- Kullanım
ping
ve setup
yukarıda açıklandığı gibi komut satırından doğrudan modüller
- Eğer elle ssha deneyin
ansible -m ping
çalışmıyor
vagrant ssh
faydalıdır şey olup olmadığını görmek için bekleme sırasında ve araştırmakps
venetstat
? Ayrıca, askıda olan ilk şüphelilerden biri DNS'tir - DNS'nin sanal makinenin içinden çözülüp çözülmediğini kontrol edin.