diff --git a/playbooks/inventory.yml b/playbooks/inventory.yml new file mode 100644 index 0000000..bb27ed1 --- /dev/null +++ b/playbooks/inventory.yml @@ -0,0 +1,78 @@ +--- +# ------------------------------------------------------------------------- +# ПЛЕЙ 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) }})" \ No newline at end of file