Управление пользователями в Grafana через Python

Управление пользователями в Grafana через Python

Когда-то писал скрипт для работы с пользователями в Grafana. Нашел немного времени чтобы поделится данным скриптом с миром. Не всегда есть время, но желание и материал всегда имеется! И так, приступим…

Полезное чтиво:

Установка grafana в Unix/Linux

Настройка Grafana с Graphite/Zabbix/Prometheus/MySQL/InfluxDB/Elasticsearch/CloudWatch для сбора и отображения метрик в Unix/Linux

Экспорт дашбордов из grafana в Unix/Linux

Собственно, катаю скрипт:

$ cat work_with_users_in_grafana.py

Скрипт содержит:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import requests
import time
import argparse
import json


class Bgcolors:
    def __init__(self):
        self.get = {
            'HEADER': '\033[95m',
            'OKBLUE': '\033[94m',
            'OKGREEN': '\033[92m',
            'WARNING': '\033[93m',
            'FAIL': '\033[91m',
            'ENDC': '\033[0m',
            'BOLD': '\033[1m',
            'UNDERLINE': '\033[4m'
        }


def search_grafana_user(gurl, g_user, g_password, email):
    g_protocol = gurl.split(':')[0]
    g_url = gurl.split('//')[1]

    get_data_req = requests.get(
        g_protocol + '://' + g_user + ':' + g_password + '@' + g_url + '/api/users?perpage=10&page=1')
    pars_json = json.loads(get_data_req.text)
    for user in pars_json:
        if user['email'] == email:
            account_id = user['id']
        else:
            account_id = -1

    return account_id


def get_grafana_users(gurl, g_user, g_password):
    users_array = []

    g_protocol = gurl.split(':')[0]
    g_url = gurl.split('//')[1]

    get_data_req = requests.get(g_protocol + '://' + g_user + ':' + g_password + '@' + g_url + '/api/users')
    pars_json = json.loads(get_data_req.text)
    for user in pars_json:
        users_array.append(user['email'])
        # print (user)

    return users_array


def add_grafana_user(gurl, g_user, g_password, created_email, created_password):
    g_protocol = gurl.split(':')[0]
    g_url = gurl.split('//')[1]

    grafana_users = get_grafana_users(gurl, g_user, g_password)
    for user in grafana_users:
        if user == created_email:
            print(Bgcolors().get['FAIL'] + 'User already exist: ', user, '\nUse another name!' + Bgcolors().get['ENDC'])
            exit(0)
    data = {"name": created_email,
            "email": created_email,
            "login": created_email,
            "password": created_password,
            }

    get_data_req = requests.post(g_protocol + '://' + g_user + ':' + g_password + '@' + g_url + '/api/admin/users',
                                 data)
    pars_json = json.loads(get_data_req.text)
    print(pars_json)
    print('URL: ' + gurl, '\nemail: ' + created_email, '\npassword: ' + created_password)

    return add_grafana_user


def update_grafana_users(gurl, g_user, g_password, email):
    g_protocol = gurl.split(':')[0]
    g_url = gurl.split('//')[1]

    state_of_admin = str.lower('True')
    data_put = {"Accept": "application/json",
                "Content-Type": "application/json",
                "isGrafanaAdmin": state_of_admin,
                }

    account_id = search_grafana_user(gurl, g_user, g_password, email)
    if account_id != -1:
        get_data_req = requests.put(
            g_protocol + '://' + g_user + ':' + g_password + '@' + g_url + '/api/admin/users/%s/permissions' % account_id,
            data=data_put)
        pars_json = json.loads(get_data_req.text)
        print(pars_json)

        get_data_req = requests.get(
            g_protocol + '://' + g_user + ':' + g_password + '@' + g_url + '/api/users?perpage=10&page=1')
        pars_json = json.loads(get_data_req.text)
        for user in pars_json:
            if user['email'] == email:
                print(user)
    else:
        print('Unfortunately, I cant find [%s] email in grafana to update role!' % email)
        print('Please, use current EMAIL!')
        exit(0)

    return update_grafana_users


def update_grafana_user_password(gurl, g_user, g_password, email):
    g_protocol = gurl.split(':')[0]
    g_url = gurl.split('//')[1]

    data_put = {"password": "password"}
    account_id = search_grafana_user(gurl, g_user, g_password, email)
    if account_id != -1:
        get_data_req = requests.put(
            g_protocol + '://' + g_user + ':' + g_password + '@' + g_url + '/api/admin/users/%s/password' % account_id,
            data=data_put)
        pars_json = json.loads(get_data_req.text)
        print(pars_json)

    else:
        print('Unfortunately, I cant find [%s] email in grafana to update PW!' % email)
        print('Please, use current EMAIL!')
        exit(0)

    return update_grafana_users


def delete_grafana_users(gurl, g_user, g_password, email):
    g_protocol = gurl.split(':')[0]
    g_url = gurl.split('//')[1]

    account_id = search_grafana_user(gurl, g_user, g_password, email)
    get_data_req = requests.delete(
        g_protocol + '://' + g_user + ':' + g_password + '@' + g_url + '/api/admin/users/%s' % account_id)
    pars_json = json.loads(get_data_req.text)
    print(pars_json)

    get_data_req = requests.get(g_protocol + '://' + g_user + ':' + g_password + '@' + g_url + '/api/users')
    pars_json = json.loads(get_data_req.text)
    for user in pars_json:
        print(user)

    return update_grafana_users


def main():
    start__time = time.time()
    parser = argparse.ArgumentParser(prog='python3 script_name.py -h',
                                     usage='python3 script_name.py {ARGS}',
                                     add_help=True,
                                     prefix_chars='--/',
                                     epilog='''created by Vitalii Natarov''')
    parser.add_argument('--version', action='version', version='v1.0.5')
    parser.add_argument('--gtoken', '--token', dest='gtoken', help='Token of grafana server', default=None)
    parser.add_argument('--gurl', '--url', dest='gurl', help='URL from grafana', default=None)
    parser.add_argument('--glogin', dest='glogin', help='A login to grafana', default=None)
    parser.add_argument('--gpassword', dest='gpassword', help='A password of grafana user', default=None)
    parser.add_argument('--email', dest='email', help='A email to create a new user in grafana', default=None)
    parser.add_argument('--password', dest='password', help='A password of grafana user which need to create',
                        default=None)

    group = parser.add_mutually_exclusive_group(required=False)
    group.add_argument('--show', dest='show', help='Show grafana users', action='store_true')
    group.add_argument('--s', dest='show', help='Show grafana users', action='store_true')

    group2 = parser.add_mutually_exclusive_group(required=False)
    group2.add_argument('--add', dest='add', help='Add grafana user', action='store_true')
    group2.add_argument('--a', dest='add', help='Add grafana user', action='store_true')

    group3 = parser.add_mutually_exclusive_group(required=False)
    group3.add_argument('--update', dest='update', help='Update grafana user', action='store_true')
    group3.add_argument('--u', dest='update', help='Update grafana user', action='store_true')

    group4 = parser.add_mutually_exclusive_group(required=False)
    group4.add_argument('--cpassword', dest='changepassword', help='Change grafana user PW', action='store_true')
    group4.add_argument('--changepw', dest='changepassword', help='Change grafana user PW', action='store_true')

    group5 = parser.add_mutually_exclusive_group(required=False)
    group5.add_argument('--delete', dest='delete', help='Delete grafana user', action='store_true')
    group5.add_argument('--d', dest='delete', help='Delete grafana user', action='store_true')

    results = parser.parse_args()
    grafana_url = results.gurl
    grafana_login = results.glogin
    grafana_password = results.gpassword
    user_email = results.email
    user_password = results.password

    if results.add:
        if (grafana_url is not None) and (user_email is not None) and (user_password is not None):
            add_grafana_user(grafana_url, grafana_login, grafana_password, user_email, user_password)
        else:
            print('Please add [--gurl] or [--email] or [--password]')
            print('For help, use: script_name.py -h')
            exit(0)

    elif results.update:
        if user_email is not None:
            update_grafana_users(grafana_url, grafana_login, grafana_password, user_email)
        else:
            print('Please add [--gurl] or [--email]')
            print('For help, use: script_name.py -h')
            exit(0)

    elif results.changepassword:
        if user_email is not None:
            update_grafana_user_password(grafana_url, grafana_login, grafana_password, user_email)
        else:
            print('Please add [--gurl] or [--email]')
            print('For help, use: script_name.py -h')
            exit(0)
    elif results.delete:
        if user_email is not None:
            delete_grafana_users(grafana_url, grafana_login, grafana_password, user_email)
        else:
            print('Please add [--gurl] or [--email]')
            print('For help, use: script_name.py -h')
            exit(0)
    elif results.show:
        if (grafana_url is not None) and (grafana_login is not None) and (grafana_password is not None):
            # print(get_grafana_users(grafana_url, grafana_login, grafana_password))
            users = get_grafana_users(grafana_url, grafana_login, grafana_password)
            for user in users:
                print(user)
        else:
            print('Please add [--gurl] or [--email] or [--password]')
            print('For help, use: script_name.py -h')
            exit(0)
    else:
        print('For help, use: script_name.py -h')
        exit(0)

    end__time = round(time.time() - start__time, 2)
    print("--- %s seconds ---" % end__time)

    print(
        Bgcolors().get['OKGREEN'], "============================================================",
        Bgcolors().get['ENDC'])
    print(
        Bgcolors().get['OKGREEN'], "==========================FINISHED==========================",
        Bgcolors().get['ENDC'])
    print(
        Bgcolors().get['OKGREEN'], "============================================================",
        Bgcolors().get['ENDC'])


if __name__ == '__main__':
    main()

Для помощи можно воспользоватся следующей командой:

$ work_with_users_in_grafana.py -h

usage: python3 script_name.py {ARGS}

optional arguments:
  -h, --help            show this help message and exit
  --version             show program's version number and exit
  --gtoken GTOKEN, --token GTOKEN
                        Token of grafana server
  --gurl GURL, --url GURL
                        URL from grafana
  --glogin GLOGIN       A login to grafana
  --gpassword GPASSWORD
                        A password of grafana user
  --email EMAIL         A email to create a new user in grafana
  --password PASSWORD   A password of grafana user which need to create
  --show                Show grafana users
  --s                   Show grafana users
  --add                 Add grafana user
  --a                   Add grafana user
  --update              Update grafana user
  --u                   Update grafana user
  --cpassword           Change grafana user PW
  --changepw            Change grafana user PW
  --delete              Delete grafana user
  --d                   Delete grafana user

created by Vitalii Natarov

Собственно, скрипт умеет:

  • —show — Показывает всех пользователей графана.
  • —add — Добавляет пользователя.
  • —update — Обновляет роль (пока не работает)….
  • —cpassword — Служит функцией для смены пароля.
  • — delete — Удаляет пользователя.
$ python3 work_with_users_in_grafana.py --gurl="https://grafana.local" --glogin "grafana_login" --gpassword "grafana_password" --add --email="vnatarov@ololo.com" --password="my_passWD"

Кому будет не понятно как использовать или возникнут ошибки, — пишите в комментариях, помогу. Я по мере необходимости, переписываю куски кода во всех моих скриптах и всегда обновляю материал на сайте.

Вот и все, статья «Управление пользователями в Grafana через Python» завершена.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.