Ansible: Opsi lain yang tersedia untuk telnet memeriksa port terbuka?

15

Saya baru mengenal Ansible. Inilah tugas saya ...

Saya memiliki lebih dari 400 host, dan saya perlu memverifikasi apakah 5 port berbeda terbuka dari ujungnya ke server web kami.

Secara individual, saya bisa masuk dan menjalankan:

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

..dan seterusnya..

Modul atau plugin apa yang dapat digunakan dalam Ansible sehingga saya dapat mengotomatiskan ini, dan minta hasilnya (port terbuka atau tertutup) kembali ke server Ansible saya?

Pembuat kebijakan
sumber

Jawaban:

28

Anda dapat menggunakan modul wait_for Ansible yang memeriksa port TCP tertentu terbuka.

Karena dalam hal ini, semua port harus sudah terbuka, kita dapat menggunakan no minimal. percobaan, cukup untuk menutup masalah jaringan:

- 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

Secara default, Ansible akan memeriksa sekali setiap detik (dapat dikonfigurasi dalam Ansible 2.3 menggunakan sleepatribut), jadi ini akan memeriksa 3 kali per port.

Jalankan ini di sebuah buku pedoman melawan inventaris Anda yang terdiri dari 400+ host - Ansible akan memeriksa secara paralel bahwa semua host dapat mencapai mywebserver.compada port tersebut.

Kami menggunakan di ignore_errors: yessini agar kesalahan ditandai dengan warna merah tetapi tidak menghentikan eksekusi.

Port terbuka dilaporkan sebagai okitem dalam output dan port tertutup dilaporkan sebagai failed(Anda harus menggunakan -vvflag on ansible-playbookuntuk melihat output ini).

Output fine-tuning

Jika Anda ingin keluaran yang lebih spesifik untuk kasus-kasus keberhasilan dan kegagalan, kode harus lebih kompleks, menambahkan tugas kedua:

  • wait_fortugas harus registerberupa variabel
  • tugas kedua menghasilkan keluaran menggunakan debugberdasarkan kondisi keberhasilan / kegagalan (misalnya menggunakan ekspresi kondisional Jinja2 )
  • maka Anda harus meletakkan kedua tugas ini dalam file sertakan (tanpa with_itemsloop apa pun ), dan menulis tugas playbook utama yang menggunakan include... with_itemsuntuk memanggil file sertakan sekali per port.
RichVel
sumber
Yang penting mereka perlu atur host: mywebserver.com.
Boikot SE untuk Monica Cellio
@XiongChiamiov - host: xtidak diperlukan. Saya baru saja menguji ulang dengan Ansible 2.3.1 dan hostatribut wait_fortugas default ke server saat ini sedang diproses dari inventaris.
RichVel
Tepatnya, itulah sebabnya OP perlu menimpanya: mereka menguji konektivitas ke server web lain dari semua server mereka (baca kembali pertanyaannya).
Boikot SE untuk Monica Cellio
2
Poin baiknya, telah memperbarui jawaban dengan hostsatribut.
RichVel
Terima kasih! Ini bekerja untuk saya, dan memberi saya cukup untuk dikerjakan.
AWhitaker
2

AFAIK tidak ada modul bawaan untuk tujuan ini, tetapi Anda dapat menggunakan shell+ 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]
Konstantin Suvorov
sumber
2
Terima kasih, ini juga berfungsi, tapi saya memilih untuk pergi dengan saran pertama karena memungkinkan saya untuk lebih menyesuaikan permainan.
AWhitaker
Apa yang -G 1tidak dapat saya temukan di halaman manual?
lonix
0

Anda dapat menggunakan modul wait_for untuk hal yang sama

contoh yang dikutip dari dokumentasi:

- 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
pengguna128364
sumber
Silakan coba memformat posting Anda dengan benar, semua situs di jaringan StackExchange memungkinkan penurunan harga yang sama, dokumentasi untuk pemformatan ada di sini
Tensibai
3
BTW Saya gagal juga melihat apa yang ditambahkan jawaban ini yang belum ada dalam jawaban
RichVel
0

Kami menggunakan alat kami dda-serverspec ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) untuk tugas semacam itu. Anda dapat menentukan harapan Anda

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

dan uji harapan ini terhadap localhost atau remote oleh ssh. Untuk pengujian jarak jauh Anda harus menentukan target:

{: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"}}

Anda dapat menjalankan tes dengan java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

Jerger
sumber