Відповідь: інша опція для телнет-перевірки відкритих портів?


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 рази на порт.

Запустіть це в ігровій книзі з інвентарем 400+ хостів - Ansible перевірить паралельно, що всі хости можуть дістатися mywebserver.comдо цих портів.

  • паралелізм підлягає встановленню вилок у вашому ansible.cfg.

Ми використовуємо ignore_errors: yesтут так, що будь-які помилки позначені червоним кольором, але не зупиняють виконання.

Про відкриті порти повідомляється як про okпредмети у вихідному, а про закриті порти - як про таке failed(ви повинні використовувати -vvпрапор, ansible-playbookщоб побачити цей вихід).

Тонка настройка виходу

Якщо ви хочете більш конкретних результатів для випадків успіху та невдачі, код повинен бути складнішим, додаючи друге завдання:

  • wait_forзавдання має registerзмінну
  • друге завдання виробляє вихід, використовуючи debugумови умови успіху / відмови (наприклад, використовуючи умовний вираз Jinja2 )
  • то вам потрібно поставити обидві ці задачі у файл включення (без with_itemsциклу) і написати основне завдання відтворення, яке використовує include... with_itemsдля виклику файлу включення один раз на порт.

Важливо, що їх потрібно буде встановити host: mywebserver.com.
Бойкот SE для Моніки Стейліо

@XiongChiamiov - host: xне потрібно. Щойно я повторно перевірявся з Ansible 2.3.1 та hostатрибутом wait_forзавдань за замовчуванням для поточного сервера, який обробляється з інвентаря.
RichVel

Саме тому ОП потрібно це перекрити: вони перевіряють підключення до іншого веб-сервера з усіх своїх серверів (перечитайте питання).
Бойкот SE для Моніки Селліо

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я не можу знайти на сторінках man?
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 дозволяють однакову розмітку, документація для форматування тут
Тенсібай

3
До речі, я теж не розумію, що додає ця відповідь, що вже не є у відповіді RichVel
Tensibai

0

Ми використовуємо наш інструмент dda-serverspec ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) для таких завдань. Ви можете визначити своє очікування

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

і перевірити ці сподівання або на localhost, або на віддалений за допомогою 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.