---
# Сбор фактов о VMware vSphere инфраструктуре через vCenter API.
# Не использует SSH — всё выполняется локально через pyVmomi.
# Результаты сохраняются в vmware_facts/*.json и используются generate_report.py.
#
# Запуск:
#   ansible-playbook -i inventory/prod/vmware/ playbooks/gather_facts_vmware.yml
- name: Сбор фактов VMware vSphere
  hosts: vmware_vcenter
  gather_facts: false

  vars:
    vmware_output_dir: "{{ playbook_dir }}/../vmware_facts"

  tasks:
    - name: Создать директорию для хранения VMware фактов
      ansible.builtin.file:
        path: "{{ vmware_output_dir }}"
        state: directory
        mode: "0755"
      delegate_to: localhost

    - name: Получить информацию о кластерах датацентра
      community.vmware.vmware_cluster_info:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: "{{ vcenter_validate_certs }}"
        datacenter: "{{ vcenter_datacenter }}"
      register: _cluster_info
      delegate_to: localhost
      failed_when: false

    - name: Получить системные факты ESXi-гипервизоров
      community.vmware.vmware_host_facts:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: "{{ vcenter_validate_certs }}"
        esxi_hostname: "{{ item }}"
      register: _esxi_facts
      loop: "{{ vcenter_esxi_hosts }}"
      delegate_to: localhost
      failed_when: false

    - name: Получить список всех виртуальных машин
      community.vmware.vmware_vm_info:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: "{{ vcenter_validate_certs }}"
        vm_type: all
      register: _vm_info
      delegate_to: localhost
      failed_when: false

    - name: Получить информацию о датасторах
      community.vmware.vmware_datastore_info:
        hostname: "{{ vcenter_hostname }}"
        username: "{{ vcenter_username }}"
        password: "{{ vcenter_password }}"
        validate_certs: "{{ vcenter_validate_certs }}"
        datacenter: "{{ vcenter_datacenter }}"
      register: _datastore_info
      delegate_to: localhost
      failed_when: false

    - name: Сохранить факты кластера в JSON
      ansible.builtin.copy:
        content: "{{ _cluster_info.clusters | default({}) | to_nice_json }}"
        dest: "{{ vmware_output_dir }}/cluster_{{ vcenter_cluster }}.json"
        mode: "0644"
      delegate_to: localhost
      when: _cluster_info is not failed

    - name: Сохранить факты ESXi-гипервизоров в JSON
      ansible.builtin.copy:
        content: >-
          {{
            item.ansible_facts
            | combine({'esxi_hostname': item.item})
            | to_nice_json
          }}
        dest: "{{ vmware_output_dir }}/esxi_{{ item.item }}.json"
        mode: "0644"
      loop: "{{ _esxi_facts.results }}"
      delegate_to: localhost
      when:
        - item.ansible_facts is defined
        - item is not failed

    - name: Сохранить список виртуальных машин в JSON
      ansible.builtin.copy:
        content: "{{ _vm_info.virtual_machines | default([]) | to_nice_json }}"
        dest: "{{ vmware_output_dir }}/vms.json"
        mode: "0644"
      delegate_to: localhost
      when: _vm_info is not failed

    - name: Сохранить информацию о датасторах в JSON
      ansible.builtin.copy:
        content: "{{ _datastore_info.datastores | default([]) | to_nice_json }}"
        dest: "{{ vmware_output_dir }}/datastores.json"
        mode: "0644"
      delegate_to: localhost
      when: _datastore_info is not failed
