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

This commit is contained in:
2025-12-10 12:11:19 +00:00
parent c59199e9a6
commit ee5338d7ca

View File

@@ -1,5 +1,5 @@
--- ---
- name: "Сканирование сети (Final Fix - Regex)" - name: "Сканирование сети (Jinja2 Logic Fix)"
hosts: localhost hosts: localhost
connection: local connection: local
gather_facts: no gather_facts: no
@@ -63,58 +63,66 @@
changed_when: false changed_when: false
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# ШАГ 3: Классификация (ИСПРАВЛЕНО НА REGEX) # ШАГ 3: Классификация (Jinja2 Block - Исправленная логика)
# Мы обрабатываем весь список результатов сразу, а не в цикле задач.
# ---------------------------------------------------------------- # ----------------------------------------------------------------
- name: Анализ результатов - name: Обработка результатов сканирования
set_fact: set_fact:
classified_hosts: "{{ classified_hosts | default([]) + [ host_data ] }}" classified_hosts: >-
vars: [
out: "{{ item.stdout }}" {% for res in scan_results.results %}
ip: "{{ item.item }}" {% set out = res.stdout %}
{% set ip = res.item %}
# Поиск имени (безопасный метод) {# Поиск имени #}
smb_matches: "{{ out | regex_findall('Computer name: ([\\w-]+)') }}" {% set smb_found = out | regex_search('Computer name: ([\\w-]+)', '\\1') %}
smb_name: "{{ smb_matches | first | default('') }}" {% set smb_name = smb_found[0] if smb_found else '' %}
# ЛОГИКА ОПРЕДЕЛЕНИЯ ТИПА (Используем regex_search для игнорирования лишних пробелов) {# Определение типа (Ищем 'порт/tcp' и 'open' с любыми пробелами) #}
# \s+ означает "один или больше пробелов" {% set type = 'other' %}
detected_type: >- {% if out | regex_search('445/tcp\s+open') %}
{% if out | regex_search('445/tcp\s+open') %}windows {% set type = 'windows' %}
{% elif out | regex_search('8291/tcp\s+open') %}mikrotik {% elif out | regex_search('8291/tcp\s+open') %}
{% elif out | regex_search('9100/tcp\s+open') %}printer {% set type = 'mikrotik' %}
{% elif out | regex_search('22/tcp\s+open') %}linux {% elif out | regex_search('9100/tcp\s+open') %}
{% else %}other{% endif %} {% set type = 'printer' %}
{% elif out | regex_search('22/tcp\s+open') %}
{% set type = 'linux' %}
{% endif %}
# Формируем имя {# Формирование имени #}
final_name: >- {% if type == 'windows' and smb_name != '' %}
{% if detected_type == 'windows' and smb_name != '' %}{{ smb_name | lower }} {% set final_name = smb_name | lower %}
{% else %}{{ detected_type }}_{{ ip | replace('.', '_') }}{% endif %} {% else %}
{% set final_name = type + '_' + ip | replace('.', '_') %}
{% endif %}
host_data: {
ip: "{{ ip }}" "ip": "{{ ip }}",
type: "{{ detected_type }}" "type": "{{ type }}",
name: "{{ final_name }}" "name": "{{ final_name }}"
loop: "{{ scan_results.results }}" },
no_log: true {% endfor %}
]
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# ШАГ 4: Группировка # ШАГ 4: Разбиение на группы
# ---------------------------------------------------------------- # ----------------------------------------------------------------
- name: Группировка списков - name: Формирование списков
set_fact: set_fact:
list_win: "{{ classified_hosts | selectattr('type', 'equalto', 'windows') | list }}" list_win: "{{ classified_hosts | selectattr('type', 'equalto', 'windows') | list }}"
list_lin: "{{ classified_hosts | selectattr('type', 'equalto', 'linux') | list }}" list_lin: "{{ classified_hosts | selectattr('type', 'equalto', 'linux') | list }}"
list_tik: "{{ classified_hosts | selectattr('type', 'equalto', 'mikrotik') | list }}" list_tik: "{{ classified_hosts | selectattr('type', 'equalto', 'mikrotik') | list }}"
list_prn: "{{ classified_hosts | selectattr('type', 'equalto', 'printer') | list }}" list_prn: "{{ classified_hosts | selectattr('type', 'equalto', 'printer') | list }}"
- name: СТАТИСТИКА (Что нашли) - name: СТАТИСТИКА (Результат)
debug: debug:
msg: msg:
- "Всего живых IP: {{ active_ips | length }}"
- "Windows: {{ list_win | length }}" - "Windows: {{ list_win | length }}"
- "MikroTik: {{ list_tik | length }}" - "MikroTik: {{ list_tik | length }}"
- "Linux: {{ list_lin | length }}" - "Linux: {{ list_lin | length }}"
- "Printers: {{ list_prn | length }}" - "Printers: {{ list_prn | length }}"
- "Other: {{ classified_hosts | length - (list_win|length + list_lin|length + list_tik|length + list_prn|length) }}"
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# ШАГ 5: Отправка Windows # ШАГ 5: Отправка Windows
@@ -194,7 +202,7 @@
when: list_tik | length > 0 when: list_tik | length > 0
# ---------------------------------------------------------------- # ----------------------------------------------------------------
# ШАГ 7: Отправка Принтеров (если нужны) # ШАГ 7: Отправка Принтеров
# ---------------------------------------------------------------- # ----------------------------------------------------------------
- block: - block:
- name: Генерация инвентаря Принтеров - name: Генерация инвентаря Принтеров