Обновить playbooks/scan_inventory.yml
This commit is contained in:
@@ -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 %}
|
||||||
|
|
||||||
|
{# Поиск имени #}
|
||||||
|
{% set smb_found = out | regex_search('Computer name: ([\\w-]+)', '\\1') %}
|
||||||
|
{% set smb_name = smb_found[0] if smb_found else '' %}
|
||||||
|
|
||||||
# Поиск имени (безопасный метод)
|
{# Определение типа (Ищем 'порт/tcp' и 'open' с любыми пробелами) #}
|
||||||
smb_matches: "{{ out | regex_findall('Computer name: ([\\w-]+)') }}"
|
{% set type = 'other' %}
|
||||||
smb_name: "{{ smb_matches | first | default('') }}"
|
{% if out | regex_search('445/tcp\s+open') %}
|
||||||
|
{% set type = 'windows' %}
|
||||||
# ЛОГИКА ОПРЕДЕЛЕНИЯ ТИПА (Используем regex_search для игнорирования лишних пробелов)
|
{% elif out | regex_search('8291/tcp\s+open') %}
|
||||||
# \s+ означает "один или больше пробелов"
|
{% set type = 'mikrotik' %}
|
||||||
detected_type: >-
|
{% elif out | regex_search('9100/tcp\s+open') %}
|
||||||
{% if out | regex_search('445/tcp\s+open') %}windows
|
{% set type = 'printer' %}
|
||||||
{% elif out | regex_search('8291/tcp\s+open') %}mikrotik
|
{% elif out | regex_search('22/tcp\s+open') %}
|
||||||
{% elif out | regex_search('9100/tcp\s+open') %}printer
|
{% set type = 'linux' %}
|
||||||
{% elif out | regex_search('22/tcp\s+open') %}linux
|
{% endif %}
|
||||||
{% else %}other{% 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: Генерация инвентаря Принтеров
|
||||||
|
|||||||
Reference in New Issue
Block a user