Ansible: Açık portların telnet kontrolü için başka bir seçenek var mı?


15

Ansible'da yeniyim. İşte benim görevim ...

400'den fazla ana bilgisayarım var ve sonlarından web sunucumuza 5 farklı bağlantı noktasının açık olup olmadığını doğrulamam gerekiyor.

Bireysel olarak giriş yapıp çalıştırabilirim:

telnet mywebserver.com 443
telnet mywebserver.com 80
telnet mywebserver.com 8443

..ve bunun gibi..

Ansible'da hangi modül veya eklenti kullanılabilir, böylece bunu otomatikleştirebilirim ve sonuçları (açık veya kapalı portlar olsun) Ansible sunucuma geri bildirebilir miyim?

Yanıtlar:


28

Belirli bir TCP bağlantı noktasının açık olduğunu kontrol eden Ansible wait_for modülünü kullanabilirsiniz .

Bu durumda, tüm portlar zaten açık olması gerektiğinden, minimum bir no kullanabilirsiniz. Ağ sorunlarını kapsamak için yeterli olacaktır:

- name: Check all port numbers are accessible from current host
  wait_for:
    host: mywebserver.com
    port: "{{ item }}"
    state: started         # Port should be open
    delay: 0               # No wait before first check (sec)
    timeout: 3             # Stop checking after timeout (sec)
  ignore_errors: yes
  with_items:
    - 443
    - 80
    - 80443

Varsayılan olarak Ansible, saniyede bir kez ( sleepözniteliği kullanarak Ansible 2.3'te yapılandırılabilir ) kontrol eder, bu nedenle bağlantı noktası başına 3 kez kontrol edilir.

Bunu 400'den fazla ana makinenin envanterine karşı bir oyun kitabında çalıştır - Ansible tüm ana makinelerin mywebserver.combu bağlantı noktalarından erişebildiğini paralel olarak kontrol edecektir .

  • paralellik tabidir ayar çatal Gözlerinde farklı ansible.cfg.

Biz kullanan ignore_errors: yesherhangi bir hata kırmızı renkle işaretlenmiştir ama yürütme bitmiyor ki burada.

Açık bağlantı noktaları okçıkıştaki öğeler olarak ve kapalı bağlantı noktaları olarak bildirilir failed( bu çıkışı görmek için -vvbayrağı kullanmanız gerekir ansible-playbook).

İnce ayar çıkışı

Başarı ve başarısızlık durumları için daha spesifik bir çıktı istiyorsanız, ikinci bir görev ekleyerek kodun daha karmaşık olması gerekir:

  • wait_forgörev registerdeğişken olmalıdır
  • ikinci görev debug, başarı / başarısızlık durumuna göre çıktı üretir (örneğin, Jinja2 koşullu ifadesini kullanarak )
  • her iki görevi de bir içerme dosyasına ( with_itemsdöngü olmadan ) koymanız ve içerme dosyasını bağlantı noktası başına bir kez çağırmak için include... kullanan bir ana oynatma defteri görevi yazmanız gerekir with_items.

Önemlisi, ayarlamaları gerekirdi host: mywebserver.com.
Monica Cellio için Boycott SE

@XiongChiamiov - host: xgerekli değildir. Sadece yanıtlayıcı '2.3.1 ile yeniden test edilmiş ve hostöznitelik wait_forgeçerli sunucuya görevler varsayılan envanterinden işleniyor.
RichVel

Tam olarak, bu yüzden OP'nin bunu geçersiz kılması gerekiyor: tüm sunucularından başka bir web sunucusuna bağlantıyı test ediyorlar (soruyu yeniden okuyun).
Monica Cellio için Boycott SE

2
İyi bir nokta, cevabı hostsöznitelik ile güncelledik .
RichVel

Teşekkür ederim! Bu benim için çalışıyor ve üzerinde çalışmam için yeterli.
AWhitaker

2

AFAIK bu amaçla yerleşik bir modül yoktur, ancak shell+ kullanabilirsiniz nc:

---
- hosts: all
  tasks:
    - shell: nc -z -w 1 -G 1 my.hostname.com {{ item }} || echo "Port {{ item }} is closed"
      with_items: [80,443,8443]

2
Teşekkür ederim, bu da işe yarıyor, ancak oyunu daha fazla özelleştirmeme izin verdiği için ilk öneriyi seçtim.
AWhitaker

Ne -G 1ben adam sayfalarında bulamıyorum?
Lonix

0

Wait_for modülünü aynı için kullanabilirsiniz

belgelerden alıntılanan örnek:

- name: Wait 300 seconds for port 8000 of any IP to close active connections, don't start checking for 10 seconds
  wait_for:
    host: 0.0.0.0
    port: 8000
    delay: 10
    state: drained

Lütfen gönderinizi düzgün bir şekilde biçimlendirmeye çalışın, StackExchange ağındaki tüm siteler aynı işaretlemeye izin verir, biçimlendirme belgeleri burada
Tensibai

3
BTW Ben de bu cevabın neler eklediğini görüyorum ki bu zaten RichVel cevabında değil
Tensibai

0

Bu tür görevler için dda-serverspec aracımızı ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) kullanıyoruz. Beklentinizi tanımlayabilirsiniz

{:netcat [{:host "mywebserver.com" :port "443"} {:host "telnet mywebserver.com" :port "80"} {:host "telnet mywebserver.com" :port "8443"}]}

ve bu beklentileri s. Uzaktan testler için bir hedef tanımlamanız gerekir:

{:existing [{:node-name "test-vm1"
:node-ip "35.157.19.218"}
{:node-name "test-vm2" :node-ip "18.194.113.138"}] :provisioning-user {:login "ubuntu"}}

Testi şu şekilde yapabilirsiniz: java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.