--- - name: Omada read-only health inventory hosts: localhost connection: local gather_facts: false vars_files: - "../../group_vars/all.yml" - "../../group_vars/vault/all.yml" vars: omada_validate_certs: false omada_page_size: 200 tasks: - name: Verify required Omada variables are present ansible.builtin.assert: that: - omada_base_url is defined - omada_id is defined - omada_client_id is defined - omada_client_secret is defined - omada_base_url | length > 0 - omada_id | length > 0 - omada_client_id | length > 0 - omada_client_secret | length > 0 fail_msg: "Missing Omada variables. Check group_vars/all.yml and group_vars/vault/all.yml." - name: Request Omada access token (client credentials) ansible.builtin.uri: url: "{{ omada_base_url }}/openapi/authorize/token?grant_type=client_credentials" method: POST validate_certs: "{{ omada_validate_certs }}" headers: Content-Type: application/json body_format: json body: omadacId: "{{ omada_id }}" client_id: "{{ omada_client_id }}" client_secret: "{{ omada_client_secret }}" return_content: true status_code: 200 register: omada_token_response no_log: true failed_when: - omada_token_response.json is not defined - omada_token_response.json.errorCode | default(-1) != 0 - name: Save access token from auth response ansible.builtin.set_fact: omada_access_token: "{{ omada_token_response.json.result.accessToken }}" no_log: true - name: Query Omada sites ansible.builtin.uri: url: "{{ omada_base_url }}/openapi/v1/{{ omada_id }}/sites?page=1&pageSize={{ omada_page_size }}" method: GET validate_certs: "{{ omada_validate_certs }}" headers: Content-Type: application/json Authorization: "AccessToken={{ omada_access_token }}" return_content: true status_code: 200 register: omada_sites_response no_log: true failed_when: - omada_sites_response.json is not defined - omada_sites_response.json.errorCode | default(-1) != 0 - name: Save site list ansible.builtin.set_fact: omada_sites: "{{ omada_sites_response.json.result.data | default([]) }}" - name: Gather device summary per site ansible.builtin.uri: url: "{{ omada_base_url }}/openapi/v1/{{ omada_id }}/sites/{{ item.siteId }}/devices?page=1&pageSize={{ omada_page_size }}" method: GET validate_certs: "{{ omada_validate_certs }}" headers: Content-Type: application/json Authorization: "AccessToken={{ omada_access_token }}" return_content: true status_code: 200 loop: "{{ omada_sites }}" loop_control: label: "{{ item.name | default(item.siteId) }}" register: omada_devices_by_site no_log: true failed_when: false - name: Gather client summary per site ansible.builtin.uri: url: "{{ omada_base_url }}/openapi/v1/{{ omada_id }}/sites/{{ item.siteId }}/clients?page=1&pageSize={{ omada_page_size }}" method: GET validate_certs: "{{ omada_validate_certs }}" headers: Content-Type: application/json Authorization: "AccessToken={{ omada_access_token }}" return_content: true status_code: 200 loop: "{{ omada_sites }}" loop_control: label: "{{ item.name | default(item.siteId) }}" register: omada_clients_by_site no_log: true failed_when: false - name: Gather event summary per site ansible.builtin.uri: url: "{{ omada_base_url }}/openapi/v1/{{ omada_id }}/sites/{{ item.siteId }}/events?page=1&pageSize=50" method: GET validate_certs: "{{ omada_validate_certs }}" headers: Content-Type: application/json Authorization: "AccessToken={{ omada_access_token }}" return_content: true status_code: 200 loop: "{{ omada_sites }}" loop_control: label: "{{ item.name | default(item.siteId) }}" register: omada_events_by_site no_log: true failed_when: false - name: Build human-readable health summary ansible.builtin.set_fact: omada_health_summary: "{{ omada_health_summary | default([]) + [ { 'site_name': item.name | default(item.siteId), 'site_id': item.siteId, 'devices_total': ( (omada_devices_by_site.results[ansible_loop.index0].json.result.totalRows | default(0)) if (omada_devices_by_site.results[ansible_loop.index0].json is defined and omada_devices_by_site.results[ansible_loop.index0].json.errorCode | default(-1) == 0) else 'n/a' ), 'devices_http_status': omada_devices_by_site.results[ansible_loop.index0].status | default('n/a'), 'devices_error_code': omada_devices_by_site.results[ansible_loop.index0].json.errorCode | default('n/a'), 'devices_error_msg': omada_devices_by_site.results[ansible_loop.index0].json.msg | default('n/a'), 'clients_total': ( (omada_clients_by_site.results[ansible_loop.index0].json.result.totalRows | default(0)) if (omada_clients_by_site.results[ansible_loop.index0].json is defined and omada_clients_by_site.results[ansible_loop.index0].json.errorCode | default(-1) == 0) else 'n/a' ), 'clients_http_status': omada_clients_by_site.results[ansible_loop.index0].status | default('n/a'), 'clients_error_code': omada_clients_by_site.results[ansible_loop.index0].json.errorCode | default('n/a'), 'clients_error_msg': omada_clients_by_site.results[ansible_loop.index0].json.msg | default('n/a'), 'events_page_rows': ( (omada_events_by_site.results[ansible_loop.index0].json.result.currentSize | default(0)) if (omada_events_by_site.results[ansible_loop.index0].json is defined and omada_events_by_site.results[ansible_loop.index0].json.errorCode | default(-1) == 0) else 'n/a' ), 'events_http_status': omada_events_by_site.results[ansible_loop.index0].status | default('n/a'), 'events_error_code': omada_events_by_site.results[ansible_loop.index0].json.errorCode | default('n/a'), 'events_error_msg': omada_events_by_site.results[ansible_loop.index0].json.msg | default('n/a') } ] }}" loop: "{{ omada_sites }}" loop_control: extended: true label: "{{ item.name | default(item.siteId) }}" - name: Print Omada health inventory summary ansible.builtin.debug: var: omada_health_summary