diff --git a/playbooks/inventory.yml b/playbooks/inventory.yml index 7b188ea..71c1996 100644 --- a/playbooks/inventory.yml +++ b/playbooks/inventory.yml @@ -1,43 +1,19 @@ --- -- name: Debug Payload - debug: - msg: - - "Name: {{ inventory_name }}" - - "SSH Key ID: {{ semaphore_key_id }}" - - "Content Length: {{ inventory_content | length }}" -#- name: Сбор инвентаря и создание его в Semaphore UI - #hosts: localhost - #connection: local - #gather_facts: no - #vars: +- name: Сбор инвентаря и создание его в Semaphore UI + hosts: localhost + connection: local + gather_facts: no + vars: # --- НАСТРОЙКИ SEMAPHORE --- - #semaphore_url: "http://192.168.0.198:9999" # Адрес вашего Semaphore - #semaphore_project_id: 1 # ID проекта - #semaphore_key_id: 7 # ID ключа (Store Key) для подключения к хостам - #semaphore_api_token: "9ojexqiwt1xkemig7j1bd1pe-frh7hkre4reryk2occ=" # Вставьте токен или передайте через Extra Vars - #inventory_name: "Auto Scanned Network" # Как назвать инвентарь в Semaphore + semaphore_url: "http://192.168.0.198:9999" # Укажите ваш URL (или http://localhost:3000) + semaphore_project_id: 1 + # ID ключа, который будет использоваться для подключения к новым хостам + semaphore_key_id: 7 + # Токен API (лучше хранить в Secret, но для теста можно тут) + semaphore_api_token: "9ojexqiwt1xkemig7j1bd1pe-frh7hkre4reryk2occ=" + inventory_name: "Auto Scanned Network" -- name: Создание инвентаря в Semaphore через API - uri: - url: "{{ semaphore_url }}/api/project/{{ semaphore_project_id }}/inventory" - method: POST - headers: - Authorization: "Bearer {{ semaphore_api_token }}" - Content-Type: "application/json" - Accept: "application/json" - body_format: json - body: - name: "{{ inventory_name }}" - project_id: "{{ semaphore_project_id | int }}" - type: "static" - # ВАЖНО: поле называется ssh_key_id, а не key_id - ssh_key_id: "{{ semaphore_key_id | int }}" - inventory: "{{ inventory_content }}" - status_code: [201, 200] - # 201 - Created, 200 - OK - register: api_response - - # --- НАСТРОЙКИ СЕТИ (из вашего примера) --- + # --- НАСТРОЙКИ СЕТИ --- subnets: - "192.168.0.0/24" - "192.168.1.0/24" @@ -52,11 +28,14 @@ - "172.19.42.0/23" - "172.19.56.0/23" - "172.19.58.0/23" - # ... добавьте остальные подсети ... + - "172.19.90.0/23" + # - "192.168.1.0/24" # Добавьте нужные подсети scan_ports: [5985, 22, 445] tasks: - # 1. Сканирование (Ваш код) + # --------------------------------------------------------- + # ШАГ 1: Сканирование (Nmap) + # --------------------------------------------------------- - name: Сканирование сети (поиск живых IP) command: > nmap -p {{ scan_ports | join(',') }} @@ -64,12 +43,20 @@ {{ 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 }}" - # 2. Определение имен (Ваш код) + - name: Проверка, найдены ли IP + fail: + msg: "Не найдено ни одного активного IP. Проверьте настройки сети или Nmap." + when: active_ips | length == 0 + + # --------------------------------------------------------- + # ШАГ 2: Определение имен + # --------------------------------------------------------- - name: Определение имен хостов (SMB Discovery + DNS) shell: | IP="{{ item }}" @@ -89,7 +76,9 @@ changed_when: false no_log: true - # 3. Сортировка (Ваш код) + # --------------------------------------------------------- + # ШАГ 3: Сортировка и генерация текста + # --------------------------------------------------------- - name: Сортировка хостов set_fact: pc_list: >- @@ -103,7 +92,6 @@ | zip(host_names.results | rejectattr('stdout', 'search', 'pc') | map(attribute='stdout') | list) | list }} - # 4. Формирование текста инвентаря в переменную - name: Генерация текста инвентаря set_fact: inventory_content: | @@ -128,14 +116,25 @@ windows_other [windows:vars] - ansible_connection=winrm - ansible_winrm_transport=ntlm - ansible_winrm_server_cert_validation=ignore - ansible_port=5985 - ansible_user=Administrator + ansible_connection=ssh + ansible_port=22 + ansible_shell_type=powershell + ansible_user=o.grechko - # 5. ОТПРАВКА В SEMAPHORE API - - name: Создание/Обновление инвентаря в Semaphore через API + # --------------------------------------------------------- + # ШАГ 4: Отладка (проверка данных перед отправкой) + # --------------------------------------------------------- + - name: Debug Payload (Проверка данных) + debug: + msg: + - "URL: {{ semaphore_url }}/api/project/{{ semaphore_project_id }}/inventory" + - "SSH Key ID: {{ semaphore_key_id }}" + - "Количество символов в инвентаре: {{ inventory_content | length }}" + + # --------------------------------------------------------- + # ШАГ 5: Отправка в API (ИСПРАВЛЕНО ssh_key_id) + # --------------------------------------------------------- + - name: Создание инвентаря в Semaphore через API uri: url: "{{ semaphore_url }}/api/project/{{ semaphore_project_id }}/inventory" method: POST @@ -148,11 +147,11 @@ name: "{{ inventory_name }}" project_id: "{{ semaphore_project_id | int }}" type: "static" - key_id: "{{ semaphore_key_id | int }}" + ssh_key_id: "{{ semaphore_key_id | int }}" inventory: "{{ inventory_content }}" - status_code: [201, 204, 200] + status_code: [201, 200] register: api_response - - name: Результат API + - name: Успех debug: - msg: "Инвентарь успешно создан! ID: {{ api_response.json.id | default('неизвестен') }}" \ No newline at end of file + msg: "Инвентарь создан! ID: {{ api_response.json.id | default('OK') }}" \ No newline at end of file