Экспорт zabbix triggers

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

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

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

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