Files
semaphore/playbooks/inventory.yml

158 lines
6.0 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.
---
- name: Debug Payload
debug:
msg:
- "Name: {{ inventory_name }}"
- "SSH Key ID: {{ semaphore_key_id }}"
- "Content Length: {{ inventory_content | length }}"
#- name: Сбор инвентаря и создание его в Semaphore UI
#hosts: localhost
#connection: local
#gather_facts: no
#vars:
# --- НАСТРОЙКИ SEMAPHORE ---
#semaphore_url: "http://192.168.0.198:9999" # Адрес вашего Semaphore
#semaphore_project_id: 1 # ID проекта
#semaphore_key_id: 7 # ID ключа (Store Key) для подключения к хостам
#semaphore_api_token: "9ojexqiwt1xkemig7j1bd1pe-frh7hkre4reryk2occ=" # Вставьте токен или передайте через Extra Vars
#inventory_name: "Auto Scanned Network" # Как назвать инвентарь в Semaphore
- name: Создание инвентаря в Semaphore через API
uri:
url: "{{ semaphore_url }}/api/project/{{ semaphore_project_id }}/inventory"
method: POST
headers:
Authorization: "Bearer {{ semaphore_api_token }}"
Content-Type: "application/json"
Accept: "application/json"
body_format: json
body:
name: "{{ inventory_name }}"
project_id: "{{ semaphore_project_id | int }}"
type: "static"
# ВАЖНО: поле называется ssh_key_id, а не key_id
ssh_key_id: "{{ semaphore_key_id | int }}"
inventory: "{{ inventory_content }}"
status_code: [201, 200]
# 201 - Created, 200 - OK
register: api_response
# --- НАСТРОЙКИ СЕТИ (из вашего примера) ---
subnets:
- "192.168.0.0/24"
- "192.168.1.0/24"
- "192.168.2.0/24"
- "192.168.3.0/24"
- "172.19.8.0/23"
- "172.19.9.0/23"
- "172.19.10.0/23"
- "172.19.24.0/23"
- "172.19.26.0/23"
- "172.19.40.0/23"
- "172.19.42.0/23"
- "172.19.56.0/23"
- "172.19.58.0/23"
# ... добавьте остальные подсети ...
scan_ports: [5985, 22, 445]
tasks:
# 1. Сканирование (Ваш код)
- name: Сканирование сети (поиск живых IP)
command: >
nmap -p {{ scan_ports | join(',') }}
-Pn -n --open --min-rate 1000 -T4 -oG -
{{ subnets | join(' ') }}
register: nmap_result
changed_when: false
- name: Извлечение IP адресов
set_fact:
active_ips: "{{ nmap_result.stdout | regex_findall('Host: ([0-9.]+).*Ports:.*(?:' + scan_ports | join('|') + ')/open') | unique | list }}"
# 2. Определение имен (Ваш код)
- name: Определение имен хостов (SMB Discovery + DNS)
shell: |
IP="{{ item }}"
SMB_NAME=$(nmap -p 445 --script smb-os-discovery $IP -Pn -n | grep "Computer name:" | awk -F': ' '{print $2}')
if [ ! -z "$SMB_NAME" ]; then
echo "$SMB_NAME" | tr '[:upper:]' '[:lower:]'
else
DNS_NAME=$(nslookup -timeout=1 $IP 192.168.1.250 2>/dev/null | grep 'name =' | awk '{print $NF}' | sed 's/\.$//' | head -n 1)
if [ ! -z "$DNS_NAME" ]; then
echo "$DNS_NAME" | tr '[:upper:]' '[:lower:]'
else
echo "UNKNOWN"
fi
fi
loop: "{{ active_ips }}"
register: host_names
changed_when: false
no_log: true
# 3. Сортировка (Ваш код)
- name: Сортировка хостов
set_fact:
pc_list: >-
{{ host_names.results | selectattr('stdout', 'search', 'pc')
| map(attribute='item') | list
| zip(host_names.results | selectattr('stdout', 'search', 'pc') | map(attribute='stdout') | list)
| list }}
other_list: >-
{{ host_names.results | rejectattr('stdout', 'search', 'pc')
| map(attribute='item') | list
| zip(host_names.results | rejectattr('stdout', 'search', 'pc') | map(attribute='stdout') | list)
| list }}
# 4. Формирование текста инвентаря в переменную
- name: Генерация текста инвентаря
set_fact:
inventory_content: |
# === Найденные PC ===
[windows_pcs]
{% for ip, name in pc_list %}
{{ name }} ansible_host={{ ip }}
{% endfor %}
# === Остальные устройства ===
[windows_other]
{% for ip, name in other_list %}
{% if name == "UNKNOWN" %}
unknown_{{ ip | replace('.', '_') }} ansible_host={{ ip }}
{% else %}
{{ name }} ansible_host={{ ip }}
{% endif %}
{% endfor %}
[windows:children]
windows_pcs
windows_other
[windows:vars]
ansible_connection=winrm
ansible_winrm_transport=ntlm
ansible_winrm_server_cert_validation=ignore
ansible_port=5985
ansible_user=Administrator
# 5. ОТПРАВКА В SEMAPHORE API
- name: Создание/Обновление инвентаря в Semaphore через API
uri:
url: "{{ semaphore_url }}/api/project/{{ semaphore_project_id }}/inventory"
method: POST
headers:
Authorization: "Bearer {{ semaphore_api_token }}"
Content-Type: "application/json"
Accept: "application/json"
body_format: json
body:
name: "{{ inventory_name }}"
project_id: "{{ semaphore_project_id | int }}"
type: "static"
key_id: "{{ semaphore_key_id | int }}"
inventory: "{{ inventory_content }}"
status_code: [201, 204, 200]
register: api_response
- name: Результат API
debug:
msg: "Инвентарь успешно создан! ID: {{ api_response.json.id | default('неизвестен') }}"