Управление пользователями в Grafana через Python
Когда-то писал скрипт для работы с пользователями в Grafana. Нашел немного времени чтобы поделится данным скриптом с миром. Не всегда есть время, но желание и материал всегда имеется! И так, приступим…
Полезное чтиво:
Установка grafana в 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» завершена.