homelab/ansible/ansible-old/playbooks/network/omada_health_inventory.yml

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