How to manage your Grafana instance using Ansible

  • Create a user for your ansible playbook
  • Give it “Grafana Admin permissions” in `/admin/users/edit/:uid`

2. Create a sample playbook like

- name: Deploy user/team/folder/dashboard in Grafana for customer
hosts: localhost
gather_facts: False
connection: local
collections:
- community.grafana
vars:
grafana_url: https://metrics.enterprise.com
# user with "Grafana Admin" permissions
# requires login as admin to set it
grafana_user: ansible
grafana_pass: my-secure-password
grafana_team: gothamgrafana_users:
- name: Bruce Wayne
email: batman@gotham.city
login: batman
# Password update is not supported at the time
# generate random password (you can forward it to the user on the first run)
pass: "{{ lookup('password', '/dev/null chars=ascii_lowercase,digits length=32') }}"
- name: Bruce Wayne 4
email: batman4@gotham.city
login: bat4man
# Password update is not supported at the time
# generate random password (you can forward it to the user on the first run)
pass: "{{ lookup('password', '/dev/null chars=ascii_lowercase,digits length=32') }}"
tasks:

tasks:
- name: Create or update a Grafana user
community.grafana.grafana_user:
url: "{{ grafana_url }}"
# user method doesn't support API??
url_username: "{{ grafana_user }}"
url_password: "{{ grafana_pass }}"
name: "{{ item.name }}"
email: "{{ item.email }}"
login: "{{ item.login }}"
password: "{{ item.pass }}"
state: present
with_items: "{{ grafana_users }}"
register: changed_users

- name: Create a team with members and enforce the list of members
community.grafana.grafana_team:
grafana_url: "{{ grafana_url }}"
# grafana_api_key: "{{ key }}"
url_username: "{{ grafana_user }}"
url_password: "{{ grafana_pass }}"
name: "{{ grafana_team }}"
email: "{{ grafana_users | first | map(attribute='email') }}"
members: "{{ grafana_users | map(attribute='email') | list }}"
enforce_members: yes
state: present
register: team

- name: Create a folder
community.grafana.grafana_folder:
url: "{{ grafana_url }}"
grafana_api_key: "{{ key }}"
title: "{{ grafana_team }}"
state: present
register: folder

- name: Set folder permissions
uri:
url: "{{ grafana_url }}/api/folders/{{ folder.folder.uid }}/permissions"
method: POST
body: | # 1 - viewer | 2 - editor # teamId requires int here, otherwise returns 400
{"items": [{"role": "Editor", "permission": 2}, {"teamId": {{ team.team.id | int }}, "permission": 1}]}
body_format: json
return_content: yes
headers:
Authorization: "Bearer {{ key }}"
register: folder_perms

- name: Generate foo dashboard for customer X
template:
src: foo.json.j2
dest: /tmp/foo.json
# default {{ }} conflicts with grafana
variable_start_string: "{|"
variable_end_string: "|}"
register: template_changed

- name: Import Grafana dashboard
community.grafana.grafana_dashboard:
grafana_url: "{{ grafana_url }}"
grafana_api_key: "{{ key }}"
state: present
commit_message: Updated by ansible
overwrite: yes
path: /tmp/foo.json
folder: "gotham.city"
when: template_changed is changed

--

--

--

https://gomes.sh/

Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

Simple React Development in 2020

Highlights from Chain React Conference 2017

Making JavaScript “typeof()” work

Part 3-Routing In Angular

What happens when you flatten an array using recursion.

Most Common Javascript Math functions

Bizcharts: How To show/hide axis Grid Line

All you need to know about JavaScript

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Pedro Gomes

Pedro Gomes

https://gomes.sh/

More from Medium

Ansible Basics

Ansible Playbook📃 which will Dynamically load Variable file named the same as OS_Name

Step by Step guide to install Ansible Tower

Ansible Tutorial for Beginners: Playbook & Examples