Initial Grafana role, split out of ansible-role-eom
Moves the Grafana Helm deployment and LDAP template out of ericomeehan.eom into its own role, and: - maps cn=DevOps Members,ou=Teams to Editor in the DevOps org (org 2), after DevOps Owners so owners keep Admin - pins chart 11.4.2 from Bitnami's OCI registry (the HTTP index no longer carries it) so redeploys don't upgrade to Grafana 12 - pins the bitnamilegacy/grafana image the cluster is already running Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
ansible-role-grafana
|
||||
====================
|
||||
|
||||
Deploys Grafana to the eom.dev Kubernetes cluster with the Bitnami Helm chart,
|
||||
with LDAP sign-in mapped to Grafana organizations.
|
||||
|
||||
Requirements
|
||||
------------
|
||||
|
||||
- `kubernetes.core` collection, Helm on the target host
|
||||
- OpenLDAP at `openldap.openldap.svc.cluster.local`
|
||||
- Prometheus and Alertmanager in the `prometheus` namespace
|
||||
|
||||
Role Variables
|
||||
--------------
|
||||
|
||||
Required (from `secrets.yaml`):
|
||||
|
||||
- `grafana_admin_password`
|
||||
- `openldap_readonly_password`
|
||||
|
||||
Defaults (`defaults/main.yml`):
|
||||
|
||||
| Variable | Default |
|
||||
|---|---|
|
||||
| `grafana_chart_ref` | `oci://registry-1.docker.io/bitnamicharts/grafana` |
|
||||
| `grafana_chart_version` | `11.4.2` |
|
||||
| `grafana_image_repository` | `bitnamilegacy/grafana` |
|
||||
| `grafana_image_tag` | `11.4.0-debian-12-r0` |
|
||||
| `grafana_domain` | `grafana.eom.dev` |
|
||||
|
||||
LDAP group mappings
|
||||
-------------------
|
||||
|
||||
Defined in `templates/ldap.toml.j2`. Grafana uses the first mapping that
|
||||
matches per organization, so owner groups must come before member groups.
|
||||
|
||||
| LDAP group | Org | Role |
|
||||
|---|---|---|
|
||||
| Grafana Administrators | 1 (Main) | Admin + server admin |
|
||||
| Grafana Users | 1 (Main) | Viewer |
|
||||
| DevOps Owners | 2 (DevOps) | Admin |
|
||||
| DevOps Members | 2 (DevOps) | Editor |
|
||||
| Finance Owners | 3 (Finance) | Admin |
|
||||
|
||||
Example Playbook
|
||||
----------------
|
||||
|
||||
- hosts: alpha-control-plane
|
||||
become: true
|
||||
vars_files:
|
||||
- ../secrets.yaml
|
||||
roles:
|
||||
- role: ericomeehan.grafana
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
MIT-0
|
||||
@@ -0,0 +1,15 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
---
|
||||
# defaults file for ansible-role-grafana
|
||||
|
||||
# Bitnami removed old chart versions from charts.bitnami.com; pull the pinned
|
||||
# version from the OCI registry so redeploys don't silently upgrade Grafana.
|
||||
grafana_chart_ref: oci://registry-1.docker.io/bitnamicharts/grafana
|
||||
grafana_chart_version: 11.4.2
|
||||
|
||||
# Bitnami moved its free images to bitnamilegacy; the old bitnami/grafana tag
|
||||
# referenced by the chart no longer pulls.
|
||||
grafana_image_repository: bitnamilegacy/grafana
|
||||
grafana_image_tag: 11.4.0-debian-12-r0
|
||||
|
||||
grafana_domain: grafana.eom.dev
|
||||
@@ -0,0 +1,3 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
---
|
||||
# handlers file for ansible-role-grafana
|
||||
@@ -0,0 +1,13 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
galaxy_info:
|
||||
author: Eric Meehan
|
||||
description: Deploy Grafana on the eom.dev Kubernetes cluster with LDAP sign-in
|
||||
company: eom.dev
|
||||
license: MIT-0
|
||||
min_ansible_version: "2.15"
|
||||
galaxy_tags:
|
||||
- grafana
|
||||
- monitoring
|
||||
- kubernetes
|
||||
|
||||
dependencies: []
|
||||
@@ -0,0 +1,66 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
---
|
||||
# tasks file for ansible-role-grafana
|
||||
- name: Deploy Grafana
|
||||
kubernetes.core.helm:
|
||||
name: grafana
|
||||
chart_ref: "{{ grafana_chart_ref }}"
|
||||
chart_version: "{{ grafana_chart_version }}"
|
||||
release_namespace: grafana
|
||||
create_namespace: true
|
||||
values:
|
||||
image:
|
||||
repository: "{{ grafana_image_repository }}"
|
||||
tag: "{{ grafana_image_tag }}"
|
||||
metrics:
|
||||
enabled: true
|
||||
admin:
|
||||
user: grafana_admin
|
||||
password: "{{ grafana_admin_password }}"
|
||||
persistence:
|
||||
size: 64Gi
|
||||
grafana:
|
||||
extraEnvVars:
|
||||
- name: GF_SERVER_DOMAIN
|
||||
value: "{{ grafana_domain }}"
|
||||
- name: GF_SERVER_ROOT_URL
|
||||
value: "https://{{ grafana_domain }}/"
|
||||
smtp:
|
||||
enabled: true
|
||||
user: grafana
|
||||
password: "{{ grafana_admin_password }}"
|
||||
host: mail.eom.dev:587
|
||||
fromAddress: grafana@eom.dev
|
||||
fromName: Grafana
|
||||
ldap:
|
||||
enabled: true
|
||||
allowSignUp: true
|
||||
configuration: "{{ lookup('template', 'ldap.toml.j2') }}"
|
||||
ingress:
|
||||
enabled: true
|
||||
pathType: Prefix
|
||||
hostname: "{{ grafana_domain }}"
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: ca-issuer
|
||||
ingressClassName: nginx
|
||||
tls: true
|
||||
datasources:
|
||||
secretDefinition:
|
||||
apiVersion: 1
|
||||
datasources:
|
||||
- name: Prometheus
|
||||
type: prometheus
|
||||
access: proxy
|
||||
orgId: 1
|
||||
url: http://prometheus-server.prometheus.svc.cluster.local
|
||||
version: 1
|
||||
editable: true
|
||||
isDefault: true
|
||||
- name: Alertmanager
|
||||
uid: alertmanager
|
||||
type: alertmanager
|
||||
access: proxy
|
||||
orgId: 1
|
||||
url: http://prometheus-alertmanager.prometheus.svc.cluster.local
|
||||
version: 1
|
||||
editable: true
|
||||
@@ -0,0 +1,75 @@
|
||||
[[servers]]
|
||||
# Ldap server host (specify multiple hosts space separated)
|
||||
host = "openldap.openldap.svc.cluster.local"
|
||||
# Default port is 389 or 636 if use_ssl = true
|
||||
port = 389
|
||||
# Set to true if LDAP server should use an encrypted TLS connection (either with STARTTLS or LDAPS)
|
||||
use_ssl = false
|
||||
# If set to true, use LDAP with STARTTLS instead of LDAPS
|
||||
start_tls = false
|
||||
# The value of an accepted TLS cipher. By default, this value is empty. Example value: ["TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"])
|
||||
# For a complete list of supported ciphers and TLS versions, refer to: https://go.dev/src/crypto/tls/cipher_suites.go
|
||||
# Starting with Grafana v11.0 only ciphers with ECDHE support are accepted for TLS 1.2 connections.
|
||||
tls_ciphers = []
|
||||
# This is the minimum TLS version allowed. By default, this value is empty. Accepted values are: TLS1.1 (only for Grafana v10.4 or earlier), TLS1.2, TLS1.3.
|
||||
min_tls_version = ""
|
||||
# set to true if you want to skip SSL cert validation
|
||||
ssl_skip_verify = false
|
||||
# set to the path to your root CA certificate or leave unset to use system defaults
|
||||
# root_ca_cert = "/path/to/certificate.crt"
|
||||
# Authentication against LDAP servers requiring client certificates
|
||||
# client_cert = "/path/to/client.crt"
|
||||
# client_key = "/path/to/client.key"
|
||||
|
||||
# Search user bind dn
|
||||
bind_dn = "cn=readonly,dc=eom,dc=dev"
|
||||
# Search user bind password
|
||||
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
|
||||
bind_password = "{{ openldap_readonly_password }}"
|
||||
# We recommend using variable expansion for the bind_password, for more info https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#variable-expansion
|
||||
# bind_password = '$__env{LDAP_BIND_PASSWORD}'
|
||||
|
||||
# Timeout in seconds. Applies to each host specified in the 'host' entry (space separated).
|
||||
timeout = 30
|
||||
|
||||
# User search filter, for example "(cn=%s)" or "(sAMAccountName=%s)" or "(uid=%s)"
|
||||
# Allow login from email or username, example "(|(sAMAccountName=%s)(userPrincipalName=%s))"
|
||||
search_filter = "(&(objectClass=posixAccount)(uid=%s)(memberOf=cn=Grafana Users,ou=Grafana,ou=Services,dc=eom,dc=dev))"
|
||||
|
||||
# An array of base dns to search through
|
||||
search_base_dns = ["dc=eom,dc=dev"]
|
||||
|
||||
# Specify names of the LDAP attributes your LDAP uses
|
||||
[servers.attributes]
|
||||
username = "uid"
|
||||
email = "mail"
|
||||
name = "givenName"
|
||||
surname = "sn"
|
||||
member_of = "memberOf"
|
||||
|
||||
[[servers.group_mappings]]
|
||||
group_dn = "cn=Grafana Administrators,ou=Grafana,ou=Services,dc=eom,dc=dev"
|
||||
org_id = 1
|
||||
org_role = "Admin"
|
||||
grafana_admin = true
|
||||
|
||||
[[servers.group_mappings]]
|
||||
group_dn = "cn=Grafana Users,ou=Grafana,ou=Services,dc=eom,dc=dev"
|
||||
org_id = 1
|
||||
org_role = "Viewer"
|
||||
|
||||
[[servers.group_mappings]]
|
||||
group_dn = "cn=DevOps Owners,ou=Teams,dc=eom,dc=dev"
|
||||
org_id = 2
|
||||
org_role = "Admin"
|
||||
|
||||
# Must stay after DevOps Owners: Grafana applies the first matching mapping per org.
|
||||
[[servers.group_mappings]]
|
||||
group_dn = "cn=DevOps Members,ou=Teams,dc=eom,dc=dev"
|
||||
org_id = 2
|
||||
org_role = "Editor"
|
||||
|
||||
[[servers.group_mappings]]
|
||||
group_dn = "cn=Finance Owners,ou=Teams,dc=eom,dc=dev"
|
||||
org_id = 3
|
||||
org_role = "Admin"
|
||||
@@ -0,0 +1,3 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
localhost
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
---
|
||||
- hosts: localhost
|
||||
remote_user: root
|
||||
roles:
|
||||
- ansible-role-grafana
|
||||
@@ -0,0 +1,3 @@
|
||||
#SPDX-License-Identifier: MIT-0
|
||||
---
|
||||
# vars file for ansible-role-grafana
|
||||
Reference in New Issue
Block a user