Files
AWatch-rus/ansible/deploy_grafana_dashboards.yml
T

128 lines
5.0 KiB
YAML

---
- name: Import AW-rus Grafana dashboards through HTTP API
hosts: grafana
gather_facts: false
connection: local
run_once: true
vars:
aw_repo_root: "{{ playbook_dir | dirname }}"
grafana_api_url: "{{ grafana_url | regex_replace('/+$', '') }}"
grafana_validate_tls_eff: "{{ grafana_validate_tls | default(true) }}"
grafana_folder_uid_eff: "{{ grafana_folder_uid | default('awatch-rus') }}"
grafana_folder_title_eff: "{{ grafana_folder_title | default('AWatch-rus') }}"
grafana_dashboards_import_overwrite_eff: "{{ grafana_dashboards_import_overwrite | default(true) }}"
grafana_dashboards:
- file: "grafana/detmir-rdp-user-activity-dashboard.json"
uid: "detmir-rdp-user-activity"
title: "DetMir: Работа пользователей в RDP"
- file: "grafana/detmir-dlp-security-dashboard.json"
uid: "detmir-dlp-security"
title: "DetMir: DLP и ИБ обзор"
- file: "grafana/detmir-dlp-management-dashboard.json"
uid: "detmir-dlp-management"
title: "DetMir: ИБ сводка для руководства"
- file: "grafana/dlp-dashboard.json"
uid: "awatch-dlp-overview"
title: "AW-rus: DLP обзор"
tasks:
- name: Validate required Grafana settings
ansible.builtin.assert:
that:
- grafana_url is defined
- grafana_url | length > 0
- grafana_admin_user is defined
- grafana_admin_user | length > 0
- grafana_admin_password is defined
- grafana_admin_password | length > 0
fail_msg: "Заполните grafana_url, grafana_admin_user и grafana_admin_password."
- name: Check Grafana health endpoint
ansible.builtin.uri:
url: "{{ grafana_api_url }}/api/health"
method: GET
user: "{{ grafana_admin_user }}"
password: "{{ grafana_admin_password }}"
force_basic_auth: true
validate_certs: "{{ grafana_validate_tls_eff | bool }}"
return_content: true
status_code: 200
- name: Lookup Grafana folder by uid
ansible.builtin.uri:
url: "{{ grafana_api_url }}/api/folders/{{ grafana_folder_uid_eff }}"
method: GET
user: "{{ grafana_admin_user }}"
password: "{{ grafana_admin_password }}"
force_basic_auth: true
validate_certs: "{{ grafana_validate_tls_eff | bool }}"
return_content: true
status_code:
- 200
- 404
register: grafana_folder_lookup
- name: Create Grafana folder when absent
ansible.builtin.uri:
url: "{{ grafana_api_url }}/api/folders"
method: POST
user: "{{ grafana_admin_user }}"
password: "{{ grafana_admin_password }}"
force_basic_auth: true
validate_certs: "{{ grafana_validate_tls_eff | bool }}"
body_format: json
status_code: 200
body:
uid: "{{ grafana_folder_uid_eff }}"
title: "{{ grafana_folder_title_eff }}"
when: grafana_folder_lookup.status == 404
- name: Update Grafana folder title when it already exists
ansible.builtin.uri:
url: "{{ grafana_api_url }}/api/folders/{{ grafana_folder_uid_eff }}"
method: PUT
user: "{{ grafana_admin_user }}"
password: "{{ grafana_admin_password }}"
force_basic_auth: true
validate_certs: "{{ grafana_validate_tls_eff | bool }}"
body_format: json
status_code: 200
body:
title: "{{ grafana_folder_title_eff }}"
version: "{{ (grafana_folder_lookup.json.version | default(0) | int) + 1 }}"
when:
- grafana_folder_lookup.status == 200
- (grafana_folder_lookup.json.title | default('')) != grafana_folder_title_eff
- name: Import Grafana dashboards from repository JSON
ansible.builtin.uri:
url: "{{ grafana_api_url }}/api/dashboards/db"
method: POST
user: "{{ grafana_admin_user }}"
password: "{{ grafana_admin_password }}"
force_basic_auth: true
validate_certs: "{{ grafana_validate_tls_eff | bool }}"
body_format: json
status_code: 200
body:
dashboard: "{{ (lookup('file', aw_repo_root ~ '/' ~ item.file) | from_json) | combine({'id': None}, recursive=True) }}"
folderUid: "{{ grafana_folder_uid_eff }}"
overwrite: "{{ grafana_dashboards_import_overwrite_eff | bool }}"
message: "Imported by Ansible from {{ item.file }}"
loop: "{{ grafana_dashboards }}"
loop_control:
label: "{{ item.title }}"
- name: Verify imported dashboards by uid
ansible.builtin.uri:
url: "{{ grafana_api_url }}/api/dashboards/uid/{{ item.uid }}"
method: GET
user: "{{ grafana_admin_user }}"
password: "{{ grafana_admin_password }}"
force_basic_auth: true
validate_certs: "{{ grafana_validate_tls_eff | bool }}"
status_code: 200
loop: "{{ grafana_dashboards }}"
loop_control:
label: "{{ item.uid }}"