Добавить playbooks/inventory.yml
This commit is contained in:
78
playbooks/inventory.yml
Normal file
78
playbooks/inventory.yml
Normal 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) }})"
|
||||
Reference in New Issue
Block a user