Ansible: มีตัวเลือกอื่นสำหรับการตรวจสอบ telnet ของพอร์ตที่เปิดอยู่หรือไม่


15

ฉันใหม่กับ Ansible นี่คืองานของฉัน ...

ฉันมีโฮสต์มากกว่า 400 แห่งและฉันต้องตรวจสอบว่า 5 พอร์ตที่แตกต่างกันเปิดจากจุดสิ้นสุดไปยังเว็บเซิร์ฟเวอร์ของเราหรือไม่

ทีละคนฉันสามารถเข้าสู่ระบบและเรียกใช้:

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

.. และอื่น ๆ ..

โมดูลหรือปลั๊กอินใดที่สามารถใช้ใน Ansible เพื่อให้ฉันสามารถทำสิ่งนี้โดยอัตโนมัติและรายงานผลลัพธ์ (ไม่ว่าจะเปิดหรือปิดพอร์ต) กลับไปที่เซิร์ฟเวอร์ Ansible ของฉันหรือไม่

คำตอบ:


28

คุณสามารถใช้โมดูลAnsible wait_forซึ่งตรวจสอบว่าพอร์ต TCP ที่ระบุเปิดอยู่

เนื่องจากในกรณีนี้พอร์ตทั้งหมดควรเปิดอยู่แล้วเราจึงสามารถใช้หมายเลขขั้นต่ำได้ ของการลองใหม่เพียงพอที่จะครอบคลุมปัญหาเครือข่าย:

- 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

โดยค่าเริ่มต้น Ansible จะตรวจสอบทุก ๆ วินาที (กำหนดค่าใน Ansible 2.3 โดยใช้sleepแอตทริบิวต์) ดังนั้นจะตรวจสอบ 3 ครั้งต่อพอร์ต

เรียกใช้สิ่งนี้ใน playbook เทียบกับคลังโฆษณาของคุณที่มีมากกว่า 400 โฮสต์ - Ansible จะตรวจสอบพร้อม ๆ กันว่าโฮสต์ทั้งหมดสามารถเข้าถึงmywebserver.comพอร์ตเหล่านั้นได้

เราใช้ignore_errors: yesที่นี่เพื่อให้ข้อผิดพลาดมีการทำเครื่องหมายสีแดง แต่ไม่หยุดการทำงาน

พอร์ตที่เปิดจะถูกรายงานเป็นokรายการในเอาท์พุทและพอร์ตที่ปิดจะถูกรายงานเป็นfailed(คุณต้องใช้-vvแฟล็กansible-playbookเพื่อดูเอาท์พุทนี้)

เอาต์พุตปรับจูน

หากคุณต้องการผลลัพธ์ที่เฉพาะเจาะจงมากขึ้นสำหรับกรณีความสำเร็จและความล้มเหลวรหัสจะต้องซับซ้อนมากขึ้นโดยเพิ่มงานที่สอง:

  • wait_forงานต้องregisterเป็นตัวแปร
  • ภารกิจที่สองจะสร้างเอาต์พุตโดยใช้debugเงื่อนไขความสำเร็จ / ความล้มเหลว (เช่นการใช้นิพจน์เงื่อนไข Jinja2 )
  • จากนั้นคุณต้องใส่ทั้งสองงานนี้ในไฟล์รวม (โดยไม่ต้องwith_itemsวนซ้ำ) และเขียนงานเพลย์บุคหลักที่ใช้include... with_itemsเพื่อเรียกไฟล์รวมหนึ่งครั้งต่อพอร์ต

host: mywebserver.comที่สำคัญพวกเขาจะต้องตั้งค่า
Boycott SE สำหรับ Monica Cellio

@XiongChiamiov - host: xไม่จำเป็น ฉันเพิ่งทดสอบกับ Ansible 2.3.1 อีกครั้งและhostแอตทริบิวต์ของwait_forงานเป็นค่าเริ่มต้นไปยังเซิร์ฟเวอร์ปัจจุบันที่กำลังประมวลผลจากสินค้าคงคลัง
RichVel

ตรงซึ่งเป็นสาเหตุที่ OP ต้องการแทนที่: พวกเขากำลังทดสอบการเชื่อมต่อกับเว็บเซิร์ฟเวอร์อื่นจากเซิร์ฟเวอร์ทั้งหมดของพวกเขา (อ่านคำถามอีกครั้ง)
Boycott SE สำหรับ Monica Cellio

2
ดีมากได้อัปเดตคำตอบพร้อมhostsคุณสมบัติ
RichVel

ขอขอบคุณ! มันใช้งานได้สำหรับฉันและให้พอที่จะทำงานต่อ
AWhitaker

2

AFAIK ไม่มีโมดูลในตัวสำหรับจุดประสงค์นี้ แต่คุณสามารถใช้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
ขอขอบคุณมันใช้งานได้ แต่ฉันเลือกที่จะไปกับคำแนะนำแรกเพราะมันช่วยให้ฉันปรับแต่งการเล่นต่อไป
AWhitaker

อะไรคือสิ่งที่-G 1ฉันไม่สามารถหาได้ในหน้าคน?
lonix

0

คุณสามารถใช้โมดูลwait_forเหมือนกัน

ตัวอย่างที่ยกมาจากเอกสาร:

- 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

โปรดลองจัดรูปแบบโพสต์ของคุณอย่างถูกต้องไซต์ทั้งหมดในเครือข่าย StackExchange อนุญาตให้ทำเครื่องหมายเดียวกันเอกสารสำหรับการจัดรูปแบบอยู่ที่นี่
Tensibai

3
BTW ฉันล้มเหลวเกินไปเห็นว่าคำตอบนี้จะเพิ่มซึ่งไม่ได้อยู่ในคำตอบ RichVel แล้ว
Tensibai

0

เราใช้เครื่องมือของเรา dda-serverspec ( https://github.com/DomainDrivenAr Architecture/dda-serverspec-crate ) สำหรับงานดังกล่าว คุณอาจกำหนดความคาดหวังของคุณ

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

และทดสอบความคาดหวังเหล่านี้กับ localhost หรือ remote โดย ssh สำหรับการทดสอบระยะไกลคุณต้องกำหนดเป้าหมาย:

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

คุณอาจทำการทดสอบโดย java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.