Files
semaphore/playbooks/inventory.yml

132 lines
5.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.
---
- 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: 5 # ID ключа (Store Key) для подключения к хостам
semaphore_api_token: "9ojexqiwt1xkemig7j1bd1pe-frh7hkre4reryk2occ=" # Вставьте токен или передайте через Extra Vars
inventory_name: "Auto Scanned Network" # Как назвать инвентарь в Semaphore
# --- НАСТРОЙКИ СЕТИ (из вашего примера) ---
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('неизвестен') }}"