Ansible: Tùy chọn khác có sẵn để kiểm tra telnet của các cổng mở?


15

Tôi mới biết về Ansible. Đây là nhiệm vụ của tôi ...

Tôi có hơn 400 máy chủ và tôi cần xác minh xem có 5 cổng khác nhau được mở từ đầu đến máy chủ web của chúng tôi hay không.

Cá nhân, tôi có thể đăng nhập và chạy:

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

..và như thế..

Mô-đun hoặc plugin nào có thể được sử dụng trong Ansible để tôi có thể tự động hóa phần này và để nó báo cáo kết quả (dù là cổng mở hay đóng) trở lại máy chủ Ansible của tôi?

Câu trả lời:


28

Bạn có thể sử dụng mô-đun Wait_for Ansible để kiểm tra một cổng TCP cụ thể đang mở.

Vì trong trường hợp này, tất cả các cổng đã được mở, chúng tôi có thể sử dụng tối thiểu không. của thử lại, chỉ đủ để bao gồm các vấn đề mạng:

- 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

Theo mặc định, Ansible sẽ kiểm tra mỗi giây một lần (có thể định cấu hình trong Ansible 2.3 bằng sleepthuộc tính), do đó, điều này sẽ kiểm tra 3 lần trên mỗi cổng.

Chạy phần này trong một cuốn sách với hàng tồn kho hơn 400 máy chủ của bạn - Ansible sẽ kiểm tra song song rằng tất cả các máy chủ có thể tiếp cận mywebserver.comtrên các cổng đó.

  • sự song song là tùy thuộc vào các thiết lập dĩa trong của bạn ansible.cfg.

Chúng tôi sử dụng ignore_errors: yesở đây để bất kỳ lỗi nào được đánh dấu màu đỏ nhưng không dừng thực thi.

Các cổng mở được báo cáo là okcác mục trong đầu ra và các cổng đóng được báo cáo là failed(bạn phải sử dụng -vvcờ trên ansible-playbookđể xem đầu ra này).

Đầu ra tinh chỉnh

Nếu bạn muốn đầu ra cụ thể hơn cho các trường hợp thành công và thất bại, mã phải phức tạp hơn, thêm một nhiệm vụ thứ hai:

  • wait_fornhiệm vụ phải registerlà một biến
  • tác vụ thứ hai tạo ra đầu ra bằng cách sử dụng debugdựa trên điều kiện thành công / thất bại (ví dụ: sử dụng biểu thức điều kiện Jinja2 )
  • sau đó, bạn cần đặt cả hai tác vụ này vào một tệp bao gồm (không có bất kỳ with_itemsvòng lặp nào ) và viết một tác vụ playbook chính sử dụng include... with_itemsđể gọi tệp bao gồm một lần trên mỗi cổng.

Điều quan trọng là họ cần phải thiết lập host: mywebserver.com.
Xiong Chiamiov

@XiongChiamiov - host: xkhông bắt buộc. Tôi vừa thử nghiệm lại với Ansible 2.3.1 và hostthuộc tính của các wait_fortác vụ mặc định cho máy chủ hiện tại đang được xử lý từ kho.
RichVel

Chính xác, đó là lý do tại sao OP cần ghi đè lên nó: họ đang kiểm tra kết nối với máy chủ web khác từ tất cả các máy chủ của họ (đọc lại câu hỏi).
Xiong Chiamiov

2
Điểm tốt, đã cập nhật câu trả lời với hoststhuộc tính.
RichVel

Cảm ơn bạn! Điều này làm việc cho tôi, và cho tôi đủ để làm việc.
AWhitaker

2

AFAIK không có mô-đun tích hợp cho mục đích này, nhưng bạn có thể sử dụng 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]

2
Cảm ơn bạn, điều này cũng hoạt động, nhưng tôi đã chọn đi với đề xuất đầu tiên vì nó cho phép tôi tùy chỉnh thêm vở kịch.
AWhitaker

Thế nào là -G 1tôi không thể tìm thấy nó trong các trang người đàn ông?
lonix

0

Bạn có thể sử dụng mô-đun Wait_for cho cùng

ví dụ trích dẫn từ tài liệu:

- 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

Vui lòng cố gắng định dạng bài đăng của bạn một cách chính xác, tất cả các trang web trên mạng StackExchange đều cho phép đánh dấu giống nhau, tài liệu để định dạng ở đây
Tensibai

3
BTW Tôi cũng không thấy câu trả lời này bổ sung cái nào chưa có trong câu trả lời của
RichVel

0

Chúng tôi sử dụng công cụ dda-serverpec của chúng tôi ( https://github.com/DomainDrivenArch architecture / dda-serverspec-crate ) cho các tác vụ đó. Bạn có thể xác định kỳ vọng của bạn

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

và kiểm tra những kỳ vọng này hoặc chống lại localhost hoặc từ xa bằng ssh. Đối với các thử nghiệm từ xa, bạn phải xác định mục tiêu:

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

Bạn có thể chạy thử nghiệm bằng cách java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.