Как проверить доступность серверов с помощью Ansible?

«Как проверить доступность серверов с помощью Ansible?» — вопрос из категории Ansible, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

1. Базовый модуль ping: Он проверяет не ICMP, а возможность выполнить Python на целевом хосте через настроенное соединение (SSH, WinRM).

- name: Test connectivity to all hosts
  ansible.builtin.ping:

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

2. Проверка доступности конкретных портов: Перед развёртыванием приложения проверяю, что необходимые порты (БД, кеша, очереди) открыты и принимают соединения.

- name: Check if database port is reachable
  ansible.builtin.wait_for:
    host: "{{ db_host }}"
    port: "{{ db_port }}"
    timeout: 10
  delegate_to: localhost
  run_once: true

3. Проверка HTTP/HTTPS эндпоинтов (здоровье сервиса): Модуль uri позволяет проверить не только доступность порта, но и корректность ответа приложения.

- name: Validate web service health endpoint
  ansible.builtin.uri:
    url: "http://{{ inventory_hostname }}:{{ app_port }}/health"
    return_content: yes
    status_code: 200
    timeout: 5
  register: health_check

- name: Fail if health check failed
  ansible.builtin.fail:
    msg: "Health check failed. Response: {{ health_check.content }}"
  when: health_check.status != 200

4. Групповая проверка перед выполнением критичных операций: Создаю отдельный плейбук для предварительных проверок (pre-flight checks), который включает:

  • Проверку свободного места на диске (ansible.builtin.shell: df -h).
  • Проверку загрузки CPU/памяти.
  • Проверку наличия необходимых зависимостей.

5. Использование ansible.builtin.shell для кастомных проверок:

- name: Custom port check using netcat (if available on target)
  ansible.builtin.shell: "nc -z localhost 9200"  # Проверка порта Elasticsearch
  changed_when: false  # Помечаем таск как "не изменяющий" состояние
  failed_when: "'succeeded' not in command.stdout"
  register: port_check

Такой многоуровневый подход позволяет быстро выявлять проблемы с инфраструктурой до начала развёртывания и делает пайплайны CI/CD более устойчивыми.