Экспорт zabbix triggers
У меня на работе, появилась задача — выполнить проверку всех имеющихся триггеров в заббиксе + обновить документацию. Я очень ленивый и всегда стараюсь оптимизировать процесс так, чтобы в последующие разы я тратил как можно меньше времени. Так произошло и в этот раз! 🙂
Для этой цели, я создал скрипт:
# cat get_triggers.py
Который имеет следующее содержание:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
import argparse
import time
import os
from datetime import datetime
from pyzabbix import ZabbixAPI
from pathlib import Path
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 login_to_zabbix(url, user, password):
# You can use the connection__timeout
connection__timeout = 45
# Verify SSL
verify__ssl = False
# Connect to zabbix-server
zapi = ZabbixAPI(url, timeout=connection__timeout)
zapi.session.verify = verify__ssl
if not verify__ssl:
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
zapi.login(user, password)
zapi.session.auth = (user, password)
# You can re-define connection__timeout after
zapi.timeout = connection__timeout
return zapi
def get_needed_groups(z_host, z_user, z_password, z_group):
needed_groups = []
zapi = login_to_zabbix(z_host, z_user, z_password)
if z_group is None:
get_groups = zapi.hostgroup.get(filter={"name": z_group}, output=['groupid', 'name'])
for group_name in get_groups:
needed_groups.append(group_name)
else:
get_groups = zapi.hostgroup.get(search={"name": z_group}, output=['groupid', 'name'])
for group_name in get_groups:
needed_groups.append(group_name)
return needed_groups
def get_needed_templates(z_host, z_user, z_password, z_group):
needed_templates = []
zapi = login_to_zabbix(z_host, z_user, z_password)
groups = get_needed_groups(z_host, z_user, z_password, z_group)
needed_group_ids = []
for group in groups:
needed_group_ids.append(group['groupid'])
get_templates = zapi.template.get(groupids=needed_group_ids, output=['templateid', 'name'])
for template in get_templates:
needed_templates.append(template)
return needed_templates
def get_needed_triggers(z_host, z_user, z_password, z_group):
needed_triggers = []
zapi = login_to_zabbix(z_host, z_user, z_password)
templates = get_needed_templates(z_host, z_user, z_password, z_group)
needed_template_ids = []
for template in templates:
needed_template_ids.append(template['templateid'])
get_triggers = zapi.trigger.get(templateids=needed_template_ids,
output=['status', 'priority', 'description'],
sortfield='priority',
sortorder='DESC'
)
for trigger in get_triggers:
needed_triggers.append({'status': trigger['status'],
'priority': trigger['priority'],
'description': trigger['description']})
return needed_triggers
def write_data_to_file(z_host, z_user, z_password, z_group, z_severity):
severity = {'Not_classified': '0', 'Information': '1', 'Warning': '2', 'Average': '3', 'High': '4', 'Disaster': '5'}
name_out = './' + str(z_group) + '.txt'
my_file = Path(name_out)
if my_file.is_file():
os.remove(name_out)
triggers = get_needed_triggers(z_host, z_user, z_password, z_group)
sorted_triggers = []
for trigger in triggers:
if trigger['priority'] >= severity[z_severity]:
if trigger not in sorted_triggers:
sorted_triggers.append(trigger)
for trigger in sorted_triggers:
try:
f = open(name_out, 'a')
f.write(trigger['description'] + '\n')
f.close()
except ValueError:
print ('I cant write to file: ', ValueError)
return write_data_to_file
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.0')
parser.add_argument('--group', dest='group', help='Group name', default=None)
parser.add_argument('--zabbix-host', dest='zabbix_host',
help='Zabbix host',
default='https://zabbix.local')
parser.add_argument('--zabbix-user', dest='zabbix_user',
help='Zabbix user',
default='Vitalii_Natarov')
parser.add_argument('--zabbix-password', dest='zabbix_password',
help='Zabbix password of user',
default='PASSWORD')
parser.add_argument('--zabbix-severity', dest='zabbix_severity', help='Set Zabbix severity for triggers',
default='Average')
# group = parser.add_mutually_exclusive_group(required=False)
# group.add_argument('--show-acc', dest='show_acc', help='Show account names', action='store_true')
# group.add_argument('--s', dest='show_acc', help='Show account names', action='store_true')
results = parser.parse_args()
group_name = results.group
# host, login, password to connect to zabbix-server
zabbix__host = results.zabbix_host
zabbix__user = results.zabbix_user
zabbix__password = results.zabbix_password
zabbix__trigger_severity = results.zabbix_severity
write_data_to_file(zabbix__host, zabbix__user, zabbix__password, group_name, zabbix__trigger_severity)
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()
Запускаем:
# python3 get_triggers.py --group "CM-Shared"
Вывод получим:
--- 2.97 seconds --- ============================================================ ==========================FINISHED========================== ============================================================
Т.е за 3 секунды, мой скрипт прошелся по всем группам (которая имеет вхождение — «CM-Shared»), нашел какие прилинкованы к группам шаблоны. И по каждому шаблону, вывел триггеры. Конечно, чтобы не было повторений, я отсеял мусор. Есть идея дописать скрипт так, чтобы он генерировал полностью пейджу для конфлюенса. Не сложно, но было бы желание — появится и результат! 😉
На данный скрипт ушло около 2-х часов моего времени. Если бы я руками все это делал — часов 5, не меньше!
Полезные статьи:
Экспортирование zabbix templates
Импортирование zabbix templates
На этом у меня все, статья «Экспорт zabbix triggers» завершена.