162 lines
6.7 KiB
YAML
162 lines
6.7 KiB
YAML
---
|
|
- 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 |