From ee5338d7cad0f0e27dffebe17844922bf89e0d2a Mon Sep 17 00:00:00 2001 From: ogrechko Date: Wed, 10 Dec 2025 12:11:19 +0000 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20playbooks/scan=5Finventory.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- playbooks/scan_inventory.yml | 76 ++++++++++++++++++++---------------- 1 file changed, 42 insertions(+), 34 deletions(-) diff --git a/playbooks/scan_inventory.yml b/playbooks/scan_inventory.yml index abc86df..d24056f 100644 --- a/playbooks/scan_inventory.yml +++ b/playbooks/scan_inventory.yml @@ -1,5 +1,5 @@ --- -- name: "Сканирование сети (Final Fix - Regex)" +- name: "Сканирование сети (Jinja2 Logic Fix)" hosts: localhost connection: local gather_facts: no @@ -63,58 +63,66 @@ changed_when: false # ---------------------------------------------------------------- - # ШАГ 3: Классификация (ИСПРАВЛЕНО НА REGEX) + # ШАГ 3: Классификация (Jinja2 Block - Исправленная логика) + # Мы обрабатываем весь список результатов сразу, а не в цикле задач. # ---------------------------------------------------------------- - - name: Анализ результатов + - name: Обработка результатов сканирования set_fact: - classified_hosts: "{{ classified_hosts | default([]) + [ host_data ] }}" - vars: - out: "{{ item.stdout }}" - ip: "{{ item.item }}" + classified_hosts: >- + [ + {% for res in scan_results.results %} + {% set out = res.stdout %} + {% set ip = res.item %} + + {# Поиск имени #} + {% set smb_found = out | regex_search('Computer name: ([\\w-]+)', '\\1') %} + {% set smb_name = smb_found[0] if smb_found else '' %} - # Поиск имени (безопасный метод) - smb_matches: "{{ out | regex_findall('Computer name: ([\\w-]+)') }}" - smb_name: "{{ smb_matches | first | default('') }}" - - # ЛОГИКА ОПРЕДЕЛЕНИЯ ТИПА (Используем regex_search для игнорирования лишних пробелов) - # \s+ означает "один или больше пробелов" - detected_type: >- - {% if out | regex_search('445/tcp\s+open') %}windows - {% elif out | regex_search('8291/tcp\s+open') %}mikrotik - {% elif out | regex_search('9100/tcp\s+open') %}printer - {% elif out | regex_search('22/tcp\s+open') %}linux - {% else %}other{% endif %} + {# Определение типа (Ищем 'порт/tcp' и 'open' с любыми пробелами) #} + {% set type = 'other' %} + {% if out | regex_search('445/tcp\s+open') %} + {% set type = 'windows' %} + {% elif out | regex_search('8291/tcp\s+open') %} + {% set type = 'mikrotik' %} + {% elif out | regex_search('9100/tcp\s+open') %} + {% set type = 'printer' %} + {% elif out | regex_search('22/tcp\s+open') %} + {% set type = 'linux' %} + {% endif %} - # Формируем имя - final_name: >- - {% if detected_type == 'windows' and smb_name != '' %}{{ smb_name | lower }} - {% else %}{{ detected_type }}_{{ ip | replace('.', '_') }}{% endif %} + {# Формирование имени #} + {% if type == 'windows' and smb_name != '' %} + {% set final_name = smb_name | lower %} + {% else %} + {% set final_name = type + '_' + ip | replace('.', '_') %} + {% endif %} - host_data: - ip: "{{ ip }}" - type: "{{ detected_type }}" - name: "{{ final_name }}" - loop: "{{ scan_results.results }}" - no_log: true + { + "ip": "{{ ip }}", + "type": "{{ type }}", + "name": "{{ final_name }}" + }, + {% endfor %} + ] # ---------------------------------------------------------------- - # ШАГ 4: Группировка + # ШАГ 4: Разбиение на группы # ---------------------------------------------------------------- - - name: Группировка списков + - name: Формирование списков set_fact: list_win: "{{ classified_hosts | selectattr('type', 'equalto', 'windows') | list }}" list_lin: "{{ classified_hosts | selectattr('type', 'equalto', 'linux') | list }}" list_tik: "{{ classified_hosts | selectattr('type', 'equalto', 'mikrotik') | list }}" list_prn: "{{ classified_hosts | selectattr('type', 'equalto', 'printer') | list }}" - - name: СТАТИСТИКА (Что нашли) + - name: СТАТИСТИКА (Результат) debug: msg: - - "Всего живых IP: {{ active_ips | length }}" - "Windows: {{ list_win | length }}" - "MikroTik: {{ list_tik | length }}" - "Linux: {{ list_lin | length }}" - "Printers: {{ list_prn | length }}" + - "Other: {{ classified_hosts | length - (list_win|length + list_lin|length + list_tik|length + list_prn|length) }}" # ---------------------------------------------------------------- # ШАГ 5: Отправка Windows @@ -194,7 +202,7 @@ when: list_tik | length > 0 # ---------------------------------------------------------------- - # ШАГ 7: Отправка Принтеров (если нужны) + # ШАГ 7: Отправка Принтеров # ---------------------------------------------------------------- - block: - name: Генерация инвентаря Принтеров