--- # ------------------------------------------------------------------------- # ПЛЕЙ 1: Подключение к Docker-серверу, чтение файла и создание инвентаря # ------------------------------------------------------------------------- - name: Extract IPs from Docker and create Inventory hosts: docker_servers # Группа в Semaphore, где лежит ваш Docker-сервер become: true # Нужно для выполнения команд docker vars: # НАСТРОЙКИ container_name: "semaphore-semaphore-1" # Имя контейнера 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) }})"