Ansible: Другая опция доступна для проверки telnet открытых портов?

15

Я новичок в Ansible. Вот моя задача ...

У меня более 400 хостов, и мне нужно проверить, открыты ли 5 ​​разных портов от их конца до нашего веб-сервера.

По отдельности я мог войти и запустить:

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

..и так далее..

Какой модуль или плагин можно использовать в Ansible, чтобы я мог автоматизировать это и заставить его сообщать результаты (открытые или закрытые порты) обратно на мой сервер Ansible?

AWhitaker
источник

Ответы:

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к этим портам.

Мы используем ignore_errors: yesздесь, чтобы любые ошибки были отмечены красным, но не останавливали выполнение.

Открытые порты сообщаются как okэлементы на выходе, а закрытые порты - как failed(вы должны использовать -vvфлаг, ansible-playbookчтобы увидеть этот вывод).

Точная настройка вывода

Если вы хотите более конкретный вывод для случаев успеха и неудач, код должен быть более сложным, добавив вторую задачу:

  • wait_forзадача должна registerпеременная
  • вторая задача производит вывод, используя debugусловия успеха / неудачи (например, используя условное выражение Jinja2 )
  • затем вам нужно поместить обе эти задачи во включаемый файл (без какого-либо with_itemsцикла) и написать основную задачу playbook, которая использует include... with_itemsдля вызова включаемого файла один раз для каждого порта.
RichVel
источник
Главное, что они должны были бы установить host: mywebserver.com.
бойкот SE для Моники
@XiongChiamiov - host: xне требуется. Я только что повторно протестировал Ansible 2.3.1, и hostатрибутом wait_forзадач по умолчанию является текущий сервер, обрабатываемый из инвентаря.
RichVel
Именно поэтому OP должен переопределить это: они проверяют подключение к другому веб-серверу со всех своих серверов (перечитайте вопрос).
бойкот 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я не могу найти в справочных страницах?
Ионикс
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
user128364
источник
Пожалуйста, попробуйте правильно отформатировать ваше сообщение, все сайты в сети StackExchange допускают одинаковую уценку, документация для форматирования здесь
Tensibai
3
Кстати, я тоже не вижу, что добавляет этот ответ, которого нет в ответе
RichVel
0

Мы используем наш инструмент dda-serverpec ( 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 или 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

Джергер
источник