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

This commit is contained in:
2025-12-05 12:13:19 +00:00
parent 151cbddc95
commit 9c11b2dc00

View File

@@ -1,5 +1,5 @@
--- ---
- name: Сбор инвентаря Windows машин (nmap) - name: Генерация инвентаря Windows PC по DNS
hosts: localhost hosts: localhost
connection: local connection: local
gather_facts: yes gather_facts: yes
@@ -8,7 +8,7 @@
dns_servers: dns_servers:
- "192.168.1.250" - "192.168.1.250"
- "192.168.1.254" - "192.168.1.254"
inventory_file: "/tmp/windows_inventory.ini" inventory_file: "/tmp/windows_inventory.yml"
subnets: subnets:
- "192.168.0.0/24" - "192.168.0.0/24"
- "192.168.1.0/24" - "192.168.1.0/24"
@@ -22,113 +22,93 @@
- "172.19.42.0/23" - "172.19.42.0/23"
- "172.19.56.0/23" - "172.19.56.0/23"
- "172.19.58.0/23" - "172.19.58.0/23"
winrm_ports:
- 5985
- 5986
tasks: tasks:
- name: Проверка установки nmap - name: Генерация списка всех IP
command: which nmap shell: |
register: nmap_check python3 << 'EOF'
failed_when: false import ipaddress
changed_when: false subnets = {{ subnets | to_json }}
for subnet in subnets:
- name: Ошибка если nmap не установлен network = ipaddress.ip_network(subnet)
fail: for ip in network.hosts():
msg: "nmap не установлен!" print(ip)
when: nmap_check.rc != 0 EOF
register: all_ips
- name: Сканирование подсетей changed_when: false
command: "nmap -p {{ winrm_ports | join(',') }} --open -T4 -oG - {{ subnets | join(' ') }}"
register: nmap_result - name: Парсинг IP адресов
changed_when: false set_fact:
ip_list: "{{ all_ips.stdout_lines }}"
- name: Извлечение IP с WinRM
set_fact: - name: Информация о сканировании
active_ips: "{{ nmap_result.stdout | regex_findall('Host: ([0-9.]+).*Ports:.*(?:5985|5986)/open') | unique | list }}" debug:
msg: "Будет проверено {{ ip_list | length }} IP адресов"
- name: Найдено IP
debug: - name: DNS резолв для всех IP
msg: "Найдено {{ active_ips | length }} IP с WinRM"
# ИЗМЕНЕНО: Попытка резолва через оба DNS сервера
- name: DNS резолв через корпоративные DNS
shell: | shell: |
# Пробуем первый DNS
result=$(nslookup {{ item }} {{ dns_servers[0] }} 2>/dev/null | grep 'name =' | awk '{print $NF}' | sed 's/\.$//') result=$(nslookup {{ item }} {{ dns_servers[0] }} 2>/dev/null | grep 'name =' | awk '{print $NF}' | sed 's/\.$//')
# Если не получилось, пробуем второй DNS
if [ -z "$result" ]; then if [ -z "$result" ]; then
result=$(nslookup {{ item }} {{ dns_servers[1] }} 2>/dev/null | grep 'name =' | awk '{print $NF}' | sed 's/\.$//') result=$(nslookup {{ item }} {{ dns_servers[1] }} 2>/dev/null | grep 'name =' | awk '{print $NF}' | sed 's/\.$//')
fi fi
# Если оба не сработали
if [ -z "$result" ]; then if [ -z "$result" ]; then
echo "NO_DNS" echo "NO_DNS"
else else
echo "$result" echo "$result"
fi fi
loop: "{{ active_ips }}" loop: "{{ ip_list }}"
register: dns_lookup register: dns_results
changed_when: false changed_when: false
when: active_ips | length > 0 # Выполнение параллельно для ускорения
async: 30
poll: 0
- name: Формирование PC хостов - name: Ожидание завершения DNS запросов
async_status:
jid: "{{ item.ansible_job_id }}"
register: dns_jobs
until: dns_jobs.finished
retries: 60
delay: 1
loop: "{{ dns_results.results }}"
- name: Фильтрация PC хостов
set_fact: set_fact:
pc_hosts: "{{ pc_hosts | default([]) + [{'hostname': item.stdout | trim, 'ip': item.item}] }}" pc_hosts: "{{ pc_hosts | default([]) + [{'hostname': item.stdout | trim, 'ip': item.item}] }}"
loop: "{{ dns_lookup.results | default([]) }}" loop: "{{ dns_jobs.results }}"
when: when:
- active_ips | length > 0
- item.stdout is defined - item.stdout is defined
- item.stdout != "NO_DNS" - item.stdout != "NO_DNS"
- item.stdout | trim is match('^pc\\d+.*' + domain + '$') - item.stdout | trim | lower is match('^pc\\d+.*')
- name: Фильтрация PC (pc01-pc500 / pc001-pc500) - name: Создание инвентаря YAML
set_fact:
filtered_hosts: "{{ pc_hosts | default([]) | selectattr('hostname', 'match', '^pc(\\d{2,3})\\.' + domain + '$') | list }}"
- name: Неопознанные хосты
set_fact:
unknown_ips: "{{ active_ips | difference(filtered_hosts | default([]) | map(attribute='ip') | list) }}"
- name: Создание инвентаря
copy: copy:
content: | content: |
# ========================================== # ==========================================
# Инвентарь Windows PC # Инвентарь Windows PC
# Дата: {{ ansible_date_time.iso8601 }} # Сгенерирован: {{ ansible_date_time.iso8601 }}
# DNS серверы: {{ dns_servers | join(', ') }} # DNS серверы: {{ dns_servers | join(', ') }}
# Подсети: {{ subnets | join(', ') }} # Подсети: {{ subnets | join(', ') }}
# Найдено IP с WinRM: {{ active_ips | length }} # Всего IP проверено: {{ ip_list | length }}
# PC хостов в домене: {{ filtered_hosts | default([]) | length }} # PC хостов найдено: {{ pc_hosts | default([]) | length }}
# Неопознанных: {{ unknown_ips | default([]) | length }}
# ========================================== # ==========================================
[windows_pcs] all:
{% for host in filtered_hosts | default([]) | sort(attribute='hostname') %} children:
{{ host.hostname | regex_replace('\\.' + domain + '$', '') }} ansible_host={{ host.hostname }} windows_pcs:
hosts:
{% for host in pc_hosts | default([]) | sort(attribute='hostname') %}
{{ host.hostname | regex_replace('\\.' + domain + '$', '') | regex_replace('\\..*$', '') }}:
ansible_host: {{ host.ip }}
{% endfor %} {% endfor %}
vars:
{% if unknown_ips | length > 0 %} ansible_connection: winrm
# Хосты с WinRM, но без DNS имён или не PC* ansible_winrm_transport: ntlm
[windows_unknown] ansible_winrm_server_cert_validation: ignore
{% for ip in unknown_ips %} ansible_port: 5985
unknown_{{ ip | replace('.', '_') }} ansible_host={{ ip }} ansible_winrm_scheme: http
{% endfor %}
[windows:children]
windows_pcs
windows_unknown
{% else %}
[windows:children]
windows_pcs
{% endif %}
[windows:vars]
ansible_connection=winrm
ansible_winrm_transport=ntlm
ansible_winrm_server_cert_validation=ignore
ansible_port=5985
dest: "{{ inventory_file }}" dest: "{{ inventory_file }}"
- name: Итоговая статистика - name: Итоговая статистика
@@ -136,15 +116,13 @@
msg: msg:
- "==========================================" - "=========================================="
- "Просканировано подсетей: {{ subnets | length }}" - "Просканировано подсетей: {{ subnets | length }}"
- "Найдено IP с WinRM: {{ active_ips | length }}" - "Проверено IP адресов: {{ ip_list | length }}"
- "PC хостов (pc01-pc500): {{ filtered_hosts | default([]) | length }}" - "Найдено PC хостов: {{ pc_hosts | default([]) | length }}"
- "Неопознанных хостов: {{ unknown_ips | default([]) | length }}" - "Файл инвентаря: {{ inventory_file }}"
- "Файл: {{ inventory_file }}"
- "==========================================" - "=========================================="
- name: Список найденных PC - name: Список найденных PC
debug: debug:
msg: "{{ filtered_hosts | default([]) | map(attribute='hostname') | list }}" msg: "{{ item.hostname }} ({{ item.ip }})"
when: loop: "{{ pc_hosts | default([]) | sort(attribute='hostname') }}"
- filtered_hosts is defined when: pc_hosts is defined
- filtered_hosts | length > 0