Обновить playbooks/scan_inventory.yml

This commit is contained in:
2025-12-10 11:12:49 +00:00
parent fc94c9d6ed
commit 13969c9425

View File

@@ -3,14 +3,14 @@
hosts: localhost hosts: localhost
connection: local connection: local
gather_facts: no gather_facts: no
become: yes # Нужно для сканирования UDP (SNMP) и Nmap -O # become: yes <--- УБРАЛИ ОТСЮДА (Глобальный sudo вызывает ошибку прав)
vars: vars:
# --- SEMAPHORE API --- # --- SEMAPHORE API ---
semaphore_url: "http://192.168.0.198:9999" semaphore_url: "http://192.168.0.198:9999"
semaphore_project_id: 1 semaphore_project_id: 1
semaphore_api_token: "9ojexqiwt1xkemig7j1bd1pe-frh7hkre4reryk2occ=" semaphore_api_token: "9ojexqiwt1xkemig7j1bd1pe-frh7hkre4reryk2occ="
# --- ID КЛЮЧЕЙ ДЛЯ БУДУЩИХ ПОДКЛЮЧЕНИЙ --- # --- ID КЛЮЧЕЙ ---
key_windows: 7 key_windows: 7
key_linux: 8 key_linux: 8
key_mikrotik: 9 key_mikrotik: 9
@@ -33,15 +33,15 @@
- "172.19.58.0/24" - "172.19.58.0/24"
- "172.19.90.0/24" - "172.19.90.0/24"
# SNMP Community (пароль для чтения)
snmp_community: "public" snmp_community: "public"
tasks: tasks:
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# ШАГ 1: Поиск живых хостов (Ping) # ШАГ 1: Поиск живых хостов
# ---------------------------------------------------------------- # ----------------------------------------------------------------
- name: Ping Sweep (быстрый поиск) - name: Ping Sweep (быстрый поиск)
command: "nmap -sn -n --min-rate 1000 -T4 -oG - {{ subnets | join(' ') }}" command: "nmap -sn -n --min-rate 1000 -T4 -oG - {{ subnets | join(' ') }}"
become: yes # <--- ДОБАВИЛИ СЮДА (Точечно)
register: ping_scan register: ping_scan
changed_when: false changed_when: false
@@ -49,14 +49,13 @@
set_fact: set_fact:
active_ips: "{{ ping_scan.stdout | regex_findall('Host: ([0-9.]+)') | unique | list }}" active_ips: "{{ ping_scan.stdout | regex_findall('Host: ([0-9.]+)') | unique | list }}"
# ИСПРАВЛЕННАЯ СТРОКА (Теперь это правильный многострочный блок)
- name: Проверка наличия хостов - name: Проверка наличия хостов
fail: fail:
msg: "Сеть пуста, активных хостов не найдено." msg: "Сеть пуста, активных хостов не найдено."
when: active_ips | length == 0 when: active_ips | length == 0
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# ШАГ 2: Опрос через SNMP + Проверка портов # ШАГ 2: Опрос через SNMP
# ---------------------------------------------------------------- # ----------------------------------------------------------------
- name: SNMP Discovery - name: SNMP Discovery
shell: | shell: |
@@ -64,12 +63,13 @@
--script snmp-sysdescr \ --script snmp-sysdescr \
--script-args snmpcommunity={{ snmp_community }} \ --script-args snmpcommunity={{ snmp_community }} \
-Pn -n -T4 {{ item }} -Pn -n -T4 {{ item }}
become: yes # <--- ДОБАВИЛИ СЮДА (Точечно, т.к. UDP скан требует root)
loop: "{{ active_ips }}" loop: "{{ active_ips }}"
register: scan_results register: scan_results
changed_when: false changed_when: false
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# ШАГ 3: Классификация на основе ответа SNMP # ШАГ 3: Классификация
# ---------------------------------------------------------------- # ----------------------------------------------------------------
- name: Анализ устройств и классификация - name: Анализ устройств и классификация
set_fact: set_fact:
@@ -77,19 +77,13 @@
vars: vars:
out: "{{ item.stdout }}" out: "{{ item.stdout }}"
ip: "{{ item.item }}" ip: "{{ item.item }}"
# Пытаемся вытащить строку sysDescr
snmp_desc: "{{ out | regex_search('sysDescr\\.0: ([^\\n]+)', '\\1') | first | default('') }}" snmp_desc: "{{ out | regex_search('sysDescr\\.0: ([^\\n]+)', '\\1') | first | default('') }}"
# Определяем тип (Логика распознавания)
detected_type: >- detected_type: >-
{% if 'Windows' in snmp_desc or '445/tcp open' in out %}windows {% if 'Windows' in snmp_desc or '445/tcp open' in out %}windows
{% elif 'RouterOS' in snmp_desc or 'MikroTik' in snmp_desc or '8291/tcp open' in out %}mikrotik {% elif 'RouterOS' in snmp_desc or 'MikroTik' in snmp_desc or '8291/tcp open' in out %}mikrotik
{% elif 'Linux' in snmp_desc or 'Ubuntu' in snmp_desc or '22/tcp open' in out %}linux {% elif 'Linux' in snmp_desc or 'Ubuntu' in snmp_desc or '22/tcp open' in out %}linux
{% elif 'JetDirect' in snmp_desc or 'LaserJet' in snmp_desc or 'Samsung' in snmp_desc or 'Kyocera' in snmp_desc or '9100/tcp open' in out %}printer {% elif 'JetDirect' in snmp_desc or 'LaserJet' in snmp_desc or 'Samsung' in snmp_desc or 'Kyocera' in snmp_desc or '9100/tcp open' in out %}printer
{% else %}other{% endif %} {% else %}other{% endif %}
# Собираем данные об одном хосте
host_data: host_data:
ip: "{{ ip }}" ip: "{{ ip }}"
type: "{{ detected_type }}" type: "{{ detected_type }}"
@@ -99,7 +93,7 @@
no_log: true no_log: true
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# ШАГ 4: Разбиение на группы # ШАГ 4: Группировка
# ---------------------------------------------------------------- # ----------------------------------------------------------------
- name: Группировка хостов - name: Группировка хостов
set_fact: set_fact:
@@ -109,7 +103,7 @@
list_prn: "{{ classified_hosts | selectattr('type', 'equalto', 'printer') | list }}" list_prn: "{{ classified_hosts | selectattr('type', 'equalto', 'printer') | list }}"
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# ШАГ 5: Отправка в Semaphore (Windows) # ШАГ 5: Отправка Windows
# ---------------------------------------------------------------- # ----------------------------------------------------------------
- block: - block:
- name: Генерация текста инвентаря Windows - name: Генерация текста инвентаря Windows
@@ -148,7 +142,7 @@
when: list_win | length > 0 when: list_win | length > 0
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# ШАГ 6: Отправка в Semaphore (MikroTik) # ШАГ 6: Отправка MikroTik
# ---------------------------------------------------------------- # ----------------------------------------------------------------
- block: - block:
- name: Генерация текста инвентаря MikroTik - name: Генерация текста инвентаря MikroTik
@@ -186,7 +180,7 @@
when: list_tik | length > 0 when: list_tik | length > 0
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# ШАГ 7: Отправка в Semaphore (Принтеры) # ШАГ 7: Отправка Принтеров
# ---------------------------------------------------------------- # ----------------------------------------------------------------
- block: - block:
- name: Генерация текста инвентаря Принтеров - name: Генерация текста инвентаря Принтеров