
Экспорт 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» завершена.