Files
semaphore/playbooks/inventory.yml

142 lines
5.0 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
- name: Сбор инвентаря и создание (Метод через файл)
hosts: localhost
connection: local
gather_facts: no
vars:
# --- НАСТРОЙКИ ---
semaphore_url: "http://192.168.0.198:9999"
semaphore_project_id: 1
semaphore_key_id: 7
semaphore_api_token: "9ojexqiwt1xkemig7j1bd1pe-frh7hkre4reryk2occ="
inventory_name: "Auto Scanned Network"
# --- СЕТИ ---
subnets:
- "192.168.0.0/23"
- "192.168.1.0/23"
- "192.168.2.0/24"
- "192.168.3.0/24"
- "172.19.8.0/24"
- "172.19.9.0/24"
- "172.19.10.0/24"
- "172.19.24.0/24"
- "172.19.26.0/24"
- "172.19.40.0/24"
- "172.19.42.0/24"
- "172.19.56.0/24"
- "172.19.58.0/24"
- "172.19.90.0/24"
# добавьте остальные ваши подсети сюда...
scan_ports: [5985, 22, 445]
tasks:
# 1. Сканирование (Ваш код)
- name: Сканирование сети
command: >
nmap -p {{ scan_ports | join(',') }}
-Pn -n --open --min-rate 1000 -T4 -oG -
{{ subnets | join(' ') }}
register: nmap_result
changed_when: false
ignore_errors: yes
- name: Извлечение IP
set_fact:
active_ips: "{{ nmap_result.stdout | regex_findall('Host: ([0-9.]+).*Ports:.*(?:' + scan_ports | join('|') + ')/open') | unique | list }}"
- name: Проверка IP
fail:
msg: "IP не найдены!"
when: active_ips | length == 0
# 2. Имена (Ваш код)
- name: Определение имен
shell: |
IP="{{ item }}"
SMB_NAME=$(nmap -p 445 --script smb-os-discovery $IP -Pn -n | grep "Computer name:" | awk -F': ' '{print $2}')
if [ ! -z "$SMB_NAME" ]; then echo "$SMB_NAME" | tr '[:upper:]' '[:lower:]'; else
DNS_NAME=$(nslookup -timeout=1 $IP 192.168.1.250 2>/dev/null | grep 'name =' | awk '{print $NF}' | sed 's/\.$//' | head -n 1)
if [ ! -z "$DNS_NAME" ]; then echo "$DNS_NAME" | tr '[:upper:]' '[:lower:]'; else echo "UNKNOWN"; fi
fi
loop: "{{ active_ips }}"
register: host_names
changed_when: false
no_log: true
# 3. Сортировка (Ваш код)
- name: Сортировка
set_fact:
pc_list: >-
{{ host_names.results | selectattr('stdout', 'search', 'pc') | map(attribute='item') | list | zip(host_names.results | selectattr('stdout', 'search', 'pc') | map(attribute='stdout') | list) | list }}
other_list: >-
{{ host_names.results | rejectattr('stdout', 'search', 'pc') | map(attribute='item') | list | zip(host_names.results | rejectattr('stdout', 'search', 'pc') | map(attribute='stdout') | list) | list }}
# 4. Текст инвентаря
- name: Генерация текста
set_fact:
inventory_content: |
[windows_pcs]
{% for ip, name in pc_list %}
{{ name }} ansible_host={{ ip }}
{% endfor %}
[windows_other]
{% for ip, name in other_list %}
{% if name == "UNKNOWN" %}
unknown_{{ ip | replace('.', '_') }} ansible_host={{ ip }}
{% else %}
{{ name }} ansible_host={{ ip }}
{% endif %}
{% endfor %}
[windows:children]
windows_pcs
windows_other
[windows:vars]
ansible_connection=ssh
ansible_port=22
ansible_shell_type=powershell
ansible_user=o.grechko
# ==========================================================
# ИЗМЕНЕННАЯ ЧАСТЬ: СОЗДАНИЕ ЧЕРЕЗ ФАЙЛ
# ==========================================================
- name: Сохранение JSON-пейлоада в файл (для надежности)
copy:
content: |
{
"name": "{{ inventory_name }} {{ 1000 | random }}",
"project_id": {{ semaphore_project_id | int }},
"type": "static",
"ssh_key_id": {{ semaphore_key_id | int }},
"become_key_id": null,
"repository_id": null,
"inventory": {{ inventory_content | to_json }}
}
dest: /tmp/semaphore_payload.json
- name: Отправка через CURL (чтение из файла)
command: >
curl -v -X POST "{{ semaphore_url }}/api/project/{{ semaphore_project_id }}/inventory"
-H "Authorization: Bearer {{ semaphore_api_token }}"
-H "Content-Type: application/json"
-H "Accept: application/json"
-d @/tmp/semaphore_payload.json
register: curl_result
ignore_errors: yes
- name: Показать полный ответ CURL
debug:
var: curl_result.stderr_lines
- name: Показать ответ сервера (body)
debug:
var: curl_result.stdout_lines
- name: Удалить временный файл
file:
path: /tmp/semaphore_payload.json
state: absent