78 lines
4.1 KiB
YAML
78 lines
4.1 KiB
YAML
---
|
||
# -------------------------------------------------------------------------
|
||
# ПЛЕЙ 1: Подключение к Docker-серверу, чтение файла и создание инвентаря
|
||
# -------------------------------------------------------------------------
|
||
- name: Extract IPs from Docker and create Inventory
|
||
hosts: docker_servers # Группа в Semaphore, где лежит ваш Docker-сервер
|
||
become: true # Нужно для выполнения команд docker
|
||
vars:
|
||
# НАСТРОЙКИ
|
||
container_name: "my_app_container" # Имя контейнера
|
||
file_path_in_container: "/app/hosts.txt" # Путь к файлу внутри контейнера
|
||
inventory_save_path: "/tmp/extracted_inventory.ini" # Куда сохранить результат на сервере
|
||
|
||
tasks:
|
||
# 1. Проверяем, жив ли контейнер
|
||
- name: Check if container is running
|
||
shell: "docker ps -q -f name={{ container_name }}"
|
||
register: container_check
|
||
|
||
- name: Fail if container is not running
|
||
fail:
|
||
msg: "Контейнер {{ container_name }} не найден или остановлен!"
|
||
when: container_check.stdout == ""
|
||
|
||
# 2. Читаем файл (формат: просто список IP, каждый с новой строки)
|
||
- name: Read file content from container
|
||
command: "docker exec {{ container_name }} cat {{ file_path_in_container }}"
|
||
register: file_content
|
||
changed_when: false
|
||
|
||
# 3. Добавляем хосты в оперативную память (для текущего запуска Ansible)
|
||
- name: Add hosts to memory (dynamic inventory)
|
||
add_host:
|
||
name: "{{ item }}"
|
||
groups: extracted_dockers_hosts
|
||
ansible_user: "Administrator" # Можно задать пользователя по умолчанию для новых хостов
|
||
ansible_connection: "winrm" # Или ssh, в зависимости от того, что за хосты в списке
|
||
# Фильтр select проверяет, что строка не пустая
|
||
loop: "{{ file_content.stdout_lines | select('match', '^.+$') | list }}"
|
||
|
||
# 4. (Опционально) Сохраняем физический файл инвентаря, как в вашем старом скрипте
|
||
- name: Save inventory to file (INI format)
|
||
copy:
|
||
content: |
|
||
# === Инвентарь, полученный из Docker: {{ container_name }} ===
|
||
|
||
[extracted_hosts]
|
||
{% for ip in file_content.stdout_lines | select('match', '^.+$') %}
|
||
host_{{ ip | replace('.', '_') }} ansible_host={{ ip }}
|
||
{% endfor %}
|
||
|
||
[extracted_hosts:vars]
|
||
# Пример переменных (настройте под ваши задачи)
|
||
ansible_connection=winrm
|
||
ansible_port=5985
|
||
ansible_winrm_transport=ntlm
|
||
ansible_winrm_server_cert_validation=ignore
|
||
dest: "{{ inventory_save_path }}"
|
||
delegate_to: localhost # Сохранить файл на сервере Semaphore (или уберите, чтобы сохранить на Docker-сервере)
|
||
|
||
- name: Show extracted IPs
|
||
debug:
|
||
msg: "Найден IP: {{ item }}"
|
||
loop: "{{ file_content.stdout_lines | select('match', '^.+$') | list }}"
|
||
|
||
# -------------------------------------------------------------------------
|
||
# ПЛЕЙ 2: (Пример) Проверка связи с новыми хостами
|
||
# -------------------------------------------------------------------------
|
||
- name: Verify connection to new hosts
|
||
hosts: extracted_dockers_hosts
|
||
gather_facts: false # Отключаем сбор фактов для скорости (или если нет доступа)
|
||
|
||
tasks:
|
||
- name: Ping host
|
||
# Используем win_ping для Windows или ping для Linux
|
||
# win_ping:
|
||
debug:
|
||
msg: "Успешное подключение к {{ inventory_hostname }} (IP: {{ ansible_host | default(inventory_hostname) }})" |