Ви можете використовувати модуль 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.