Files
semaphore/playbooks/inventory.yml

78 lines
4.1 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
# -------------------------------------------------------------------------
# ПЛЕЙ 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) }})"