From 1e7e1f829c01b6c44bc914ae237c399f4fa4c97a Mon Sep 17 00:00:00 2001
From: anima
Date: Sun, 2 Feb 2025 02:35:29 +0100
Subject: [PATCH] setup full autodeployment for icingaweb with grafana
---
README.md | 63 ++++---
compose.yml | 53 +++++-
grafana/default.dashboard.yml | 7 +
grafana/default.source.yml | 14 ++
grafana/icinga2-default.json | 307 ++++++++++++++++++++++++++++++++++
5 files changed, 420 insertions(+), 24 deletions(-)
create mode 100644 grafana/default.dashboard.yml
create mode 100644 grafana/default.source.yml
create mode 100644 grafana/icinga2-default.json
diff --git a/README.md b/README.md
index 5e6da77..f263716 100644
--- a/README.md
+++ b/README.md
@@ -20,20 +20,15 @@ If you run the setup without any environment vars the setup token will be printe
## understand environment
For the configuration (primarily the initial setup) I use a similar method as: https://hub.docker.com/r/icinga/icingaweb2
* In my case a prefix like `ICINGAWEB2_CONF` refers a configuration file.
-* As a separator I no (longer) use `.` rather `__` (2x `_`)
+* As a separator I not (longer) use `.` rather `__` (2x `_`)
* After the first `__` it follows the `Section` from this ini file.
* After the second `__` it follows the `Key` from this `Section` before.
* And after the `=` is comes the `value`.
-* As long as you don't need `.` in `Section`'s or `Key`'s you can use both spellings of docker compose environment
So will this:
```
ICINGAWEB2_CONF__global__config_backend=db
```
-or
-```
-ICINGAWEB2_CONF__global__config_backend: db
-```
create this:
```ini
@@ -52,7 +47,6 @@ ICINGAWEB2_AUTH | /etc/icingaweb2/authentication.ini | [Authentication](https://
ICINGAWEB2_GROUPS | /etc/icingaweb2/groups.ini | [Groups](https://icinga.com/docs/icinga-web/latest/doc/05-Authentication/#groups)
ICINGAWEB2_ROLES | /etc/icingaweb2/roles.ini | [Roles](https://icinga.com/docs/icinga-web/latest/doc/06-Security/#roles)
-
### vars modules
prefix | module | file | ref
--- | --- | --- | ---
@@ -60,10 +54,12 @@ ICINGAWEB2_ICINGADB_CONF | icingadb | /etc/icingaweb2/modules/icingadb/config.in
ICINGAWEB2_ICINGADB_REDIS | icingadb | /etc/icingaweb2/modules/icingadb/redis.ini | [RedisĀ® Configuration](https://icinga.com/docs/icinga-db-web/latest/doc/03-Configuration/#redis-configuration)
ICINGAWEB2_ICINGADB_API | icingadb | /etc/icingaweb2/modules/icingadb/commandtransports.ini | [Command Transport Configuration](https://icinga.com/docs/icinga-db-web/latest/doc/03-Configuration/#command-transport-configuration)
ICINGAWEB2_GRAFANA_CONF | grafana | /etc/icingaweb2/modules/grafana/config.ini | [General Configuration](https://github.com/NETWAYS/icingaweb2-module-grafana/blob/main/doc/03-module-configuration.md)
-ICINGAWEB2_GRAFANA_AUTH | grafana | /etc/icingaweb2/modules/grafana/grafana.ini | [Grafana Preparations](https://github.com/NETWAYS/icingaweb2-module-grafana/blob/main/doc/02-installation.md)
ICINGAWEB2_GRAFANA_GRAPH | grafana | /etc/icingaweb2/modules/grafana/graphs.ini | [Graph Configuration](https://github.com/NETWAYS/icingaweb2-module-grafana/blob/main/doc/04-graph-configuration.md)
---
+### external vars
+See sources below
+
### static vars
var | description
--- | ---
@@ -117,22 +113,49 @@ services:
- ICINGAWEB2_ICINGADB_CONF__icingadb__resource=icingadb
- ICINGAWEB2_ICINGADB_REDIS__redis1__host=redis
- ICINGAWEB2_ICINGADB_REDIS__redis1__port=6379
- - ICINGAWEB2_ICINGADB_API__icinga2__transport=api
- - ICINGAWEB2_ICINGADB_API__icinga2__host=icinga2
- - ICINGAWEB2_ICINGADB_API__icinga2__port=5665
- - ICINGAWEB2_ICINGADB_API__icinga2__username=icingaweb
- - ICINGAWEB2_ICINGADB_API__icinga2__password=icingaweb
+ - ICINGAWEB2_ICINGADB_CMD__icinga2__transport=api
+ - ICINGAWEB2_ICINGADB_CMD__icinga2__host=icinga2
+ - ICINGAWEB2_ICINGADB_CMD__icinga2__port=5665
+ - ICINGAWEB2_ICINGADB_CMD__icinga2__username=icingaweb
+ - ICINGAWEB2_ICINGADB_CMD__icinga2__password=icingaweb
- ICINGAWEB2_DB_RESOURCE_NAME=${ICINGAWEB_DB_RESOURCE_NAME:-icingaweb_db}
- ICINGAWEB2_DEFAULT_ADMIN_USER=${ICINGAWEB_DEFAULT_ADMIN_USER:-icingaadmin}
- ICINGAWEB2_DEFAULT_ADMIN_PASS=${ICINGAWEB_DEFAULT_ADMIN_PASS:-icingaadmin}
+ - ICINGAWEB2_GRAFANA_CONF__grafana__host=grafana
+ - ICINGAWEB2_GRAFANA_CONF__grafana__defaultdashboard=
+ - ICINGAWEB2_GRAFANA_CONF__grafana__defaultdashboarduid=
+ - ICINGAWEB2_GRAFANA_CONF__grafana__defaultdashboardpanelid=1
+ - ICINGAWEB2_GRAFANA_CONF__grafana__defaultorgid=1
+ - ICINGAWEB2_GRAFANA_CONF__grafana__timerange=12h
+ - ICINGAWEB2_GRAFANA_GRAPH__check_command__name=
+ - ICINGAWEB2_GRAFANA_GRAPH__check_command__dashboard=
+ - ICINGAWEB2_GRAFANA_GRAPH__check_command__dashboarduid=
+ - ICINGAWEB2_GRAFANA_GRAPH__check_command__panelId=
```
-If you ask why the hell vars with `.` :
-- Due to the dynamic translation of variables to ini files, some modules use this peculiarity.
- - currently in the module `grafana` in file `grafana.ini`
-- https://stackoverflow.com/questions/2821043/allowed-characters-in-linux-environment-variable-names
-
-
You can remove the environment var `ICINGAWEB2_CONF_ONCE` whan will changes in `compose.yml` environment deploy every time if the container starts.
You can use this for future config changes, but this isn't tested and i am not sure i will recommend this...
-For now be save and use it only for inital setup.
\ No newline at end of file
+For now be save and use it only for inital setup.
+
+
+## Sources
+### Icingaweb2
+* [Install Icinga Web 2](https://icinga.com/docs/icinga-web/latest/doc/02-Installation/01-Debian/)
+* [Installing Icinga DB Web](https://icinga.com/docs/icinga-db-web/latest/doc/02-Installation/Debian/#installing-icinga-db-web-package)
+* [Feature: InfluxdbWriter ](https://icinga.com/docs/icinga-2/latest/doc/14-features/#influxdb-writer)
+* [Object Type: InfluxdbWriter ](https://icinga.com/docs/icinga-2/latest/doc/09-object-types/#influxdbwriter)
+* [Grafana Integration](https://icinga.com/docs/icinga-for-windows/latest/doc/110-Installation/40-Grafana-Integration/)
+
+### Grafana
+* [Run Grafana Docker image](https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/)
+* [Override configuration with environment variable](https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#override-configuration-with-environment-variables)
+* [Provision Grafana](https://grafana.com/docs/grafana/latest/administration/provisioning/)
+* [Dashboard JSON model](https://grafana.com/docs/grafana/latest/dashboards/build-dashboards/view-dashboard-json-model/)
+* [Original JSON: icinga2-default.json](https://grafana.com/docs/grafana/latest/dashboards/build-dashboards/view-dashboard-json-model/)
+* [Tutorial: Provision dashboards and data sources](https://grafana.com/tutorials/provision-dashboards-and-data-sources/)
+* [Anonymous authentication](https://grafana.com/docs/grafana/latest/setup-grafana/configure-security/configure-authentication/anonymous-auth/)
+* [Docker Hub: grafana/grafana-oos](https://hub.docker.com/r/grafana/grafana-oss)
+* [Docker Hub: grafana/grafana](https://hub.docker.com/r/grafana/grafana)
+* [Image Rendering](https://github.com/grafana/grafana-image-renderer?tab=readme-ov-file#remote-rendering-service-installation) (if you dont want grafana direct accessable, but have many cons)
+* [Docker Hub: grafana/grafana-image-renderer](https://hub.docker.com/r/grafana/grafana-image-renderer)
+* [Grafana Plugin: grafana-image-renderer](https://grafana.com/grafana/plugins/grafana-image-renderer/)
\ No newline at end of file
diff --git a/compose.yml b/compose.yml
index 72602d3..5875f3e 100644
--- a/compose.yml
+++ b/compose.yml
@@ -1,6 +1,6 @@
services:
icingaweb2:
- image: git.ao-it.net/docker/icingaweb2
+ image: git.ao-it.net/docker/icingaweb2:latest
hostname: icingaweb2
depends_on:
- db_icingaweb
@@ -10,7 +10,7 @@ services:
ports:
- 8080:8080
networks:
- - icingaweb
+ - icinga
environment:
## icingaweb2 general
- ICINGAWEB2_DB_RESOURCE_NAME=${ICINGAWEB_DB_RESOURCE_NAME:-icingaweb_db}
@@ -61,6 +61,16 @@ services:
#- ICINGAWEB2_ICINGADB_CMD__icinga2__port=${ICINGA_API_PORT:-5665}
#- ICINGAWEB2_ICINGADB_CMD__icinga2__username=${ICINGA_API_ICINGAWEB_USER:-icingaweb}
#- ICINGAWEB2_ICINGADB_CMD__icinga2__password=${ICINGA_API_ICINGAWEB_PASS:-icingaweb}
+ ## module: grafana
+ ### grafana: conf.ini
+ - ICINGAWEB2_GRAFANA_CONF__grafana__host=${GRAFANA_HOST:-grafana}:${GRAFANA_PORT:-3000}
+ - ICINGAWEB2_GRAFANA_CONF__grafana__defaultdashboard=${GRAFANA_DASHBOARD_NAME:-icinga2-default}
+ - ICINGAWEB2_GRAFANA_CONF__grafana__defaultdashboarduid=${GRAFANA_DASHBOARD_UID:-icinga2-default}
+ - ICINGAWEB2_GRAFANA_CONF__grafana__defaultdashboardpanelid=1
+ - ICINGAWEB2_GRAFANA_CONF__grafana__defaultorgid=1
+ - ICINGAWEB2_GRAFANA_CONF__grafana__timerange=12h
+ - ICINGAWEB2_GRAFANA_CONF__grafana__shadows="1"
+ - ICINGAWEB2_GRAFANA_CONF__grafana__accessmode=iframe
db_icingaweb:
image: mariadb:latest
@@ -69,12 +79,47 @@ services:
volumes:
- ./files/dbs/icingaweb:/var/lib/mysql
networks:
- - icingaweb
+ - icinga
environment:
MARIADB_RANDOM_ROOT_PASSWORD: yes
MARIADB_DATABASE: ${ICINGAWEB_DB:-icingaweb}
MARIADB_USER: ${ICINGAWEB_DB_USER:-icingaweb}
MARIADB_PASSWORD: ${ICINGAWEB_DB_PASS:-icingaweb}
+ grafana:
+ image: grafana/grafana:latest
+ hostname: grafana
+ depends_on:
+ - icingaweb2
+ restart: always
+ #user: '0'
+ ports:
+ - ${GRAFANA_PORT:-3000}:3000
+ networks:
+ - icinga
+ volumes:
+ - ./grafana/default.source.yml:/etc/grafana/provisioning/datasources/default.yml
+ - ./grafana/default.dashboard.yml:/etc/grafana/provisioning/dashboards/default.yml
+ - ./grafana/icinga2-default.json:/var/lib/grafana/dashboards/${GRAFANA_DASHBOARD_FILE:-icinga2-default.json}
+ environment:
+ ## required configs
+ GF_AUTH_ANONYMOUS_ENABLED: true
+ GF_SECURITY_ALLOW_EMBEDDING: true
+ #GF_AUTH_ANONYMOUS_ORG_NAME: Main Org.
+ GF_AUTH_ANONYMOUS_ORG_ROLE: Viewer
+ GF_AUTH_ANONYMOUS_HIDE_VERSION: true
+ ## user settings
+ GF_SECURITY_ADMIN_USER: ${GRAFANA_ADMIN_USER:-grafanaadmin}
+ GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_ADMIN_PASS:-grafanaadmin}
+ ## default data source
+ GRAFANA_DEFAULT_SOURCE_NAME: ${ICINGA_INFLUX_HOST:-influxdb}
+ GRAFANA_DEFAULT_SOURCE_UID: ${ICINGA_INFLUX_HOST:-influxdb}
+ GRAFANA_DEFAULT_SOURCE_USER: ${ICINGA_INFLUX_USER:-icinga}
+ GRAFANA_DEFAULT_SOURCE_DB: ${ICINGA_INFLUX_DB:-icinga}
+ GRAFANA_DEFAULT_SOURCE_PASS: ${ICINGA_INFLUX_PASS:-icinga}
+ ## default dashboard
+ GRAFANA_DEFAULT_DASHBOARD_NAME: ${GRAFANA_DASHBOARD_NAME:-icinga2-default}
+ GRAFANA_DEFAULT_DASHBOARD_FILE: ${GRAFANA_DASHBOARD_FILE:-icinga2-default.json}
+
networks:
- icingaweb:
\ No newline at end of file
+ icinga:
\ No newline at end of file
diff --git a/grafana/default.dashboard.yml b/grafana/default.dashboard.yml
new file mode 100644
index 0000000..12a9cf6
--- /dev/null
+++ b/grafana/default.dashboard.yml
@@ -0,0 +1,7 @@
+apiVersion: 1
+
+providers:
+ - name: $GRAFANA_DEFAULT_DASHBOARD_NAME
+ type: file
+ options:
+ path: /var/lib/grafana/dashboards/$GRAFANA_DEFAULT_DASHBOARD_FILE
\ No newline at end of file
diff --git a/grafana/default.source.yml b/grafana/default.source.yml
new file mode 100644
index 0000000..07d1e64
--- /dev/null
+++ b/grafana/default.source.yml
@@ -0,0 +1,14 @@
+apiVersion: 1
+
+datasources:
+ - name: $GRAFANA_DEFAULT_SOURCE_NAME
+ type: influxdb
+ uid: $GRAFANA_DEFAULT_SOURCE_UID
+ access: proxy
+ user: $GRAFANA_DEFAULT_SOURCE_USER
+ url: http://influxdb:8086
+ jsonData:
+ dbName: $GRAFANA_DEFAULT_SOURCE_DB
+ httpMode: GET
+ secureJsonData:
+ password: $GRAFANA_DEFAULT_SOURCE_PASS
\ No newline at end of file
diff --git a/grafana/icinga2-default.json b/grafana/icinga2-default.json
new file mode 100644
index 0000000..048c1da
--- /dev/null
+++ b/grafana/icinga2-default.json
@@ -0,0 +1,307 @@
+{
+ "__inputs": [
+ {
+ "name": "DS_ICINGA2",
+ "label": "Icinga2",
+ "description": "",
+ "type": "datasource",
+ "pluginId": "influxdb",
+ "pluginName": "InfluxDB"
+ },
+ {
+ "name": "VAR_HOSTNAME",
+ "type": "constant",
+ "label": "hostname",
+ "value": "null",
+ "description": ""
+ },
+ {
+ "name": "VAR_SERVICE",
+ "type": "constant",
+ "label": "service",
+ "value": "null",
+ "description": ""
+ },
+ {
+ "name": "VAR_COMMAND",
+ "type": "constant",
+ "label": "command",
+ "value": "null",
+ "description": ""
+ }
+ ],
+ "__requires": [
+ {
+ "type": "grafana",
+ "id": "grafana",
+ "name": "Grafana",
+ "version": "4.6.3"
+ },
+ {
+ "type": "panel",
+ "id": "graph",
+ "name": "Graph",
+ "version": ""
+ },
+ {
+ "type": "datasource",
+ "id": "influxdb",
+ "name": "InfluxDB",
+ "version": "1.0.0"
+ }
+ ],
+ "annotations": {
+ "list": [
+ {
+ "builtIn": 1,
+ "datasource": "-- Grafana --",
+ "enable": true,
+ "hide": true,
+ "iconColor": "rgba(0, 211, 255, 1)",
+ "name": "Annotations & Alerts",
+ "type": "dashboard"
+ }
+ ]
+ },
+ "description": "Show all metrics from a Icinga2 service or host",
+ "editable": true,
+ "gnetId": null,
+ "graphTooltip": 0,
+ "hideControls": false,
+ "id": null,
+ "links": [],
+ "rows": [
+ {
+ "collapse": false,
+ "height": "250px",
+ "panels": [
+ {
+ "aliasColors": {},
+ "bars": false,
+ "dashLength": 10,
+ "dashes": false,
+ "datasource": "influxdb",
+ "fill": 1,
+ "id": 1,
+ "legend": {
+ "alignAsTable": false,
+ "avg": false,
+ "current": false,
+ "max": false,
+ "min": false,
+ "rightSide": false,
+ "show": true,
+ "total": false,
+ "values": false
+ },
+ "lines": true,
+ "linewidth": 1,
+ "links": [],
+ "nullPointMode": "null",
+ "percentage": false,
+ "pointradius": 1,
+ "points": false,
+ "renderer": "flot",
+ "seriesOverrides": [],
+ "spaceLength": 10,
+ "span": 12,
+ "stack": false,
+ "steppedLine": false,
+ "targets": [
+ {
+ "alias": "$tag_metric",
+ "dsType": "influxdb",
+ "groupBy": [
+ {
+ "params": [
+ "$__interval"
+ ],
+ "type": "time"
+ },
+ {
+ "params": [
+ "metric"
+ ],
+ "type": "tag"
+ },
+ {
+ "params": [
+ "none"
+ ],
+ "type": "fill"
+ }
+ ],
+ "measurement": "/^$command$/",
+ "orderByTime": "ASC",
+ "policy": "default",
+ "refId": "A",
+ "resultFormat": "time_series",
+ "select": [
+ [
+ {
+ "params": [
+ "value"
+ ],
+ "type": "field"
+ },
+ {
+ "params": [],
+ "type": "mean"
+ }
+ ]
+ ],
+ "tags": [
+ {
+ "key": "hostname",
+ "operator": "=~",
+ "value": "/^$hostname$/"
+ },
+ {
+ "condition": "AND",
+ "key": "service",
+ "operator": "=~",
+ "value": "/^$service$/"
+ }
+ ]
+ }
+ ],
+ "thresholds": [],
+ "timeFrom": null,
+ "timeShift": null,
+ "title": "$service",
+ "tooltip": {
+ "shared": true,
+ "sort": 1,
+ "value_type": "individual"
+ },
+ "type": "graph",
+ "xaxis": {
+ "buckets": null,
+ "mode": "time",
+ "name": null,
+ "show": true,
+ "values": []
+ },
+ "yaxes": [
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": true
+ },
+ {
+ "format": "short",
+ "label": null,
+ "logBase": 1,
+ "max": null,
+ "min": null,
+ "show": false
+ }
+ ]
+ }
+ ],
+ "repeat": null,
+ "repeatIteration": null,
+ "repeatRowId": null,
+ "showTitle": false,
+ "title": "Default",
+ "titleSize": "h6"
+ }
+ ],
+ "schemaVersion": 14,
+ "style": "dark",
+ "tags": [
+ "Icinga2",
+ "influxdb"
+ ],
+ "templating": {
+ "list": [
+ {
+ "current": {
+ "value": "${VAR_HOSTNAME}",
+ "text": "${VAR_HOSTNAME}"
+ },
+ "hide": 2,
+ "label": null,
+ "name": "hostname",
+ "options": [
+ {
+ "value": "${VAR_HOSTNAME}",
+ "text": "${VAR_HOSTNAME}"
+ }
+ ],
+ "query": "${VAR_HOSTNAME}",
+ "type": "custom"
+ },
+ {
+ "current": {
+ "value": "${VAR_SERVICE}",
+ "text": "${VAR_SERVICE}"
+ },
+ "hide": 2,
+ "label": null,
+ "name": "service",
+ "options": [
+ {
+ "value": "${VAR_SERVICE}",
+ "text": "${VAR_SERVICE}"
+ }
+ ],
+ "query": "${VAR_SERVICE}",
+ "type": "custom"
+ },
+ {
+ "current": {
+ "value": "${VAR_COMMAND}",
+ "text": "${VAR_COMMAND}"
+ },
+ "hide": 2,
+ "label": null,
+ "name": "command",
+ "options": [
+ {
+ "value": "${VAR_COMMAND}",
+ "text": "${VAR_COMMAND}"
+ }
+ ],
+ "query": "${VAR_COMMAND}",
+ "type": "custom"
+ }
+ ]
+ },
+ "time": {
+ "from": "now-6h",
+ "to": "now"
+ },
+ "timepicker": {
+ "refresh_intervals": [
+ "5s",
+ "10s",
+ "30s",
+ "1m",
+ "5m",
+ "15m",
+ "30m",
+ "1h",
+ "2h",
+ "1d"
+ ],
+ "time_options": [
+ "5m",
+ "15m",
+ "1h",
+ "6h",
+ "12h",
+ "24h",
+ "2d",
+ "7d",
+ "30d"
+ ]
+ },
+ "timezone": "",
+ "title": "icinga2-default",
+ "uid": "icinga-default",
+ "version": 3
+}
\ No newline at end of file