Добавить 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