diff --git a/playbooks/scan_inventory.yml b/playbooks/scan_inventory.yml index 802a205..25644f2 100644 --- a/playbooks/scan_inventory.yml +++ b/playbooks/scan_inventory.yml @@ -1,9 +1,8 @@ --- -- name: "Сканирование сети (Rootless Mode - TCP Only)" +- name: "Сканирование сети (Rootless Mode - Fix Regex)" hosts: localhost connection: local gather_facts: no - # become: yes <--- УДАЛЕНО: Работаем без прав root vars: # --- SEMAPHORE API --- semaphore_url: "http://192.168.0.198:9999" @@ -36,7 +35,6 @@ tasks: # ---------------------------------------------------------------- # ШАГ 1: Поиск живых хостов - # Используем -sn (обычный пользователь сделает TCP ping, это ок) # ---------------------------------------------------------------- - name: Ping Sweep command: "nmap -sn -n --min-rate 1000 -T4 -oG - {{ subnets | join(' ') }}" @@ -54,13 +52,9 @@ # ---------------------------------------------------------------- # ШАГ 2: Сканирование портов (TCP Connect) - # Используем -sT (не требует root) вместо -sS/-sU # ---------------------------------------------------------------- - name: TCP Port Scan & Name Discovery shell: | - # Сканируем ключевые TCP порты: - # 22 (SSH/Linux), 445 (SMB/Windows), 8291 (Winbox/MikroTik), 9100 (JetDirect/Printer) - # --script smb-os-discovery пытается узнать имя Windows (работает по TCP, root не нужен) nmap -sT -p 22,445,8291,9100 \ --script smb-os-discovery \ -Pn -n -T4 {{ item }} @@ -69,19 +63,22 @@ changed_when: false # ---------------------------------------------------------------- - # ШАГ 3: Классификация (по открытым портам) + # ШАГ 3: Классификация (ИСПРАВЛЕНО) # ---------------------------------------------------------------- - - name: Анализ результатов + - name: Анализ результатов (Debug Mode) set_fact: classified_hosts: "{{ classified_hosts | default([]) + [ host_data ] }}" vars: out: "{{ item.stdout }}" ip: "{{ item.item }}" - # Пытаемся найти имя компьютера через SMB (для Windows) - smb_name: "{{ out | regex_search('Computer name: ([\\w-]+)', '\\1') | first | default('') }}" + # БЕЗОПАСНЫЙ ПОИСК ИМЕНИ: + # Используем regex_findall вместо search. + # Если ничего не найдено, вернется пустой список [], и default('') сработает корректно. + smb_matches: "{{ out | regex_findall('Computer name: ([\\w-]+)') }}" + smb_name: "{{ smb_matches | first | default('') }}" - # ЛОГИКА ОПРЕДЕЛЕНИЯ ТИПА (По открытым портам) + # ЛОГИКА ОПРЕДЕЛЕНИЯ ТИПА detected_type: >- {% if '445/tcp open' in out %}windows {% elif '8291/tcp open' in out %}mikrotik @@ -99,7 +96,7 @@ type: "{{ detected_type }}" name: "{{ final_name }}" loop: "{{ scan_results.results }}" - no_log: true + # no_log: true <--- УБРАЛИ, ЧТОБЫ ВИДЕТЬ ОШИБКУ, ЕСЛИ ОНА БУДЕТ # ---------------------------------------------------------------- # ШАГ 4: Группировка @@ -189,7 +186,7 @@ when: list_tik | length > 0 # ---------------------------------------------------------------- - # ШАГ 7: Отправка Принтеров (если нужны) + # ШАГ 7: Отправка Принтеров # ---------------------------------------------------------------- - block: - name: Генерация инвентаря Принтеров