Добавить playbooks/inventory.yml

This commit is contained in:
2025-12-10 07:48:24 +00:00
parent 9e3dbfcdcd
commit 29f6595146

78
playbooks/inventory.yml Normal file
View File

@@ -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) }})"