
Экспортирование zabbix templates
В последнее время, я начал плотно изучать python и zabbix API для автоматизации различных процессов. Последнее что пришло на ум — это выполнить экспорт всех zabbix шаблонов.
Для этой цели, я создал скрипт:
# cat Export_Templates_from_Zabbix.py
Который имеет следующее содержание:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import requests import time import os import xml.dom.minidom import argparse import gitlab import glob import sys from datetime import datetime from pyzabbix import ZabbixAPI, ZabbixAPIException # from setuptools import setup, find_packages from sys import exit 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(z_host, z_user, z_password): # You can use the connection__timeout connection__timeout = 45 # Verify SSL verify__ssl = False # Connect to zabbix-server zapi = ZabbixAPI(z_host, 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(z_user, z_password) zapi.session.auth = (z_user, z_password) # You can re-define connection__timeout after zapi.timeout = connection__timeout return zapi def get_template(z_host, z_user, z_password, template): zapi = login_to_zabbix(z_host, z_user, z_password) get__template = zapi.template.get(filter={"name": template}, output=['templateid', 'name']) return get__template def export_template(z_host, z_user, z_password, dir_path, template): zapi = login_to_zabbix(z_host, z_user, z_password) get_template_name = get_template(template) if not os.path.exists(dir_path): os.makedirs(dir_path) template_id = get_template_name[0]['templateid'] template_name = get_template_name[0]['name'] rules = { "options": { "templates": [template_id] }, "format": "xml" } template_name_out = dir_path + '/' + template_name + '.xml' result = zapi.do_request('configuration.export', rules) template = xml.dom.minidom.parseString(result['result'].encode('utf-8')) date = template.getElementsByTagName("date")[0] # We are backing these up to git, steralize date so it doesn't appear to change # each time we export the templates date.firstChild.replaceWholeText('1970-01-01T01:01:01Z') try: f = open(template_name_out, 'wb') f.write(template.toprettyxml().encode('utf-8')) f.close() print (template_name + '.xml', 'file has been created') except ValueError: print ('I cant write to file: ', ValueError) return export_template def get_templates(z_host, z_user, z_password): templates = [] zapi = login_to_zabbix(z_host, z_user, z_password) get__templates = zapi.template.get(output=['templateid', 'name']) for template in get__templates: templates.append(template) return templates def export_templates(z_host, z_user, z_password, dir_path): zapi = login_to_zabbix(z_host, z_user, z_password) templates = get_templates(z_host, z_user, z_password) if not os.path.exists(dir_path): os.makedirs(dir_path) for template in templates: template_id = template['templateid'] template_name = template['name'] template_name_out = dir_path + '/' + template_name + '.xml' result = zapi.configuration.export( options={"templates": [template_id]}, format='xml' ) template = xml.dom.minidom.parseString(result.encode('utf-8')) date = template.getElementsByTagName("date")[0] # We are backing these up to git, steralize date so it doesn't appear to change # each time we export the templates date.firstChild.replaceWholeText('1970-01-01T01:01:01Z') try: f = open(template_name_out, 'wb') f.write(template.toprettyxml().encode('utf-8')) f.close() print (template_name + '.xml', 'file has been created') except ValueError: print('I cant write to file') return export_templates def import_templates(z_host, z_user, z_password, dir_path, templates): global files zapi = login_to_zabbix(z_host, z_user, z_password) rules = { 'applications': { 'createMissing': 'true', 'updateExisting': 'true' }, 'discoveryRules': { 'createMissing': 'true', 'updateExisting': 'true' }, 'graphs': { 'createMissing': 'true', 'updateExisting': 'true' }, 'groups': { 'createMissing': 'true' }, 'hosts': { 'createMissing': 'true', 'updateExisting': 'true' }, 'images': { 'createMissing': 'true', 'updateExisting': 'true' }, 'items': { 'createMissing': 'true', 'updateExisting': 'true' }, 'maps': { 'createMissing': 'true', 'updateExisting': 'true' }, 'screens': { 'createMissing': 'true', 'updateExisting': 'true' }, 'templateLinkage': { 'createMissing': 'true', 'updateExisting': 'true' }, 'templates': { 'createMissing': 'true', 'updateExisting': 'true' }, 'templateScreens': { 'createMissing': 'true', 'updateExisting': 'true' }, 'triggers': { 'createMissing': 'true', 'updateExisting': 'true' }, } if templates == 'all': files = glob.glob(dir_path + "/" + "*.xml") else: for template in templates: files = glob.glob(str(dir_path) + "/" + str(template) + ".xml") for f in files: with open(f, 'r') as file: template = file.read() try: zapi.confimport('xml', template, rules) except ZabbixAPIException as e: print(e) return import_templates def export_groups(z_host, z_user, z_password): file_out = 'exported_groups.txt' if os.path.isfile(file_out): os.remove(file_out) zapi = login_to_zabbix(z_host, z_user, z_password) get__groups = zapi.hostgroup.get(output=['groupid', 'name']) try: for group in get__groups: f = open(file_out, 'a') f.write(str(group['name'] + '\n')) f.close() print("All groups has been exported to %s!" % file_out) except ValueError: print('I cant write to file') return export_groups def export_autodiscovery_rules(z_host, z_user, z_password): file_out = 'exported_autodiscovery_rules.txt' if os.path.isfile(file_out): os.remove(file_out) zapi = login_to_zabbix(z_host, z_user, z_password) get__actions = zapi.action.get(selectOperations='extend', selectFilter='extend', filter={"eventsource": 2}) try: for action in get__actions: print (action) # f = open(file_out, 'a') # f.write(json.loads(action)) # f.close() # print("All autodiscovery rules has been exported to %s!" % file_out) except TypeError: print('I cant write to file') return export_autodiscovery_rules 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('--t', '--template', nargs='+', dest='template', help='Indicate a template(s)', default='all') parser.add_argument('--d', '--dir', dest='templates_dir', help='Indicate a folder for template(s)', default='exported_templates', metavar='folder') parser.add_argument('--zabbix-host', dest='zabbix_host', help='Zabbix host', default=None) parser.add_argument('--zabbix-user', dest='zabbix_user', help='Zabbix user', default=None) parser.add_argument('--zabbix-password', dest='zabbix_password', help='Zabbix password of user', default=None) group = parser.add_mutually_exclusive_group(required=False) group.add_argument('--i', dest='imports', help='Import function', action='store_true') group.add_argument('--import', dest='imports', help='Import function', action='store_true') group2 = parser.add_mutually_exclusive_group(required=False) group2.add_argument('--e', dest='exports', help='Export function', action='store_true', default=argparse.SUPPRESS) group2.add_argument('--export', dest='exports', help='Export function', action='store_true') results = parser.parse_args() template = results.template templates_dir = results.templates_dir # host, login, password to connect to zabbix-server zabbix__host = results.zabbix_host zabbix__user = results.zabbix_user zabbix__password = results.zabbix_password if (zabbix__host is not None) and (zabbix__user is not None) and (zabbix__password is not None): zapi = login_to_zabbix(zabbix__host, zabbix__user, zabbix__password) zabbix__version = zapi.do_request('apiinfo.version') print( Bgcolors().get['OKGREEN'], "============================================================", Bgcolors().get['ENDC']) print( Bgcolors().get['OKGREEN'], 'Zabbix Version:', zabbix__version['result'] + Bgcolors().get['ENDC']) print( Bgcolors().get['OKGREEN'], "============================================================", Bgcolors().get['ENDC']) if results.exports: print ('EXPORT function!') if template == 'all': export_templates(zabbix__host, zabbix__user, zabbix__password, templates_dir) else: export_template(zabbix__host, zabbix__user, zabbix__password, templates_dir, template) export_groups(zabbix__host, zabbix__user, zabbix__password) #export_autodiscovery_rules(zabbix__host, zabbix__user, zabbix__password) elif results.imports: print('IMPORT function') import_templates(zabbix__host, zabbix__user, zabbix__password, templates_dir, template) else: print('Please add [--e] for export or [--i] for import') print('For help, use: script_name.py -h') exit(0) else: print('Please add [--zabbix-host] or [--zabbix-user] or [--zabbix-password]') 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()
Запускаем:
# python3 Export_Templates_from_Zabbix.py --zabbix-host "https://zabbix.local" --zabbix-user "cleanup_apiuser" --zabbix-password "fdsfsdff" --dir exported_zabbix_templates_PROD_OLD --e
Вывод получим:
============================================================ Zabbix Version: 2.4.8 ============================================================ Template OS Linux.xml file has been created Template App Zabbix Server.xml file has been created Template App Zabbix Proxy.xml file has been created Template App Zabbix Agent.xml file has been created Template SNMP Interfaces.xml file has been created Template SNMP Generic.xml file has been created Template SNMP Device.xml file has been created Template SNMP OS Windows.xml file has been created Template SNMP Disks.xml file has been created Template SNMP OS Linux.xml file has been created Template SNMP Processors.xml file has been created Template IPMI Intel SR1530.xml file has been created Template IPMI Intel SR1630.xml file has been created Template App MySQL.xml file has been created Template OS OpenBSD.xml file has been created Template OS FreeBSD.xml file has been created Template OS AIX.xml file has been created Template OS HP-UX.xml file has been created Template OS Solaris.xml file has been created Template OS Mac OS X.xml file has been created Template OS Windows.xml file has been created Template JMX Generic.xml file has been created Template JMX Tomcat.xml file has been created Template Virt VMware.xml file has been created Template Virt VMware Guest.xml file has been created Template Virt VMware Hypervisor.xml file has been created Template App FTP Service.xml file has been created Template App HTTP Service.xml file has been created Template App HTTPS Service.xml file has been created Template App IMAP Service.xml file has been created Template App LDAP Service.xml file has been created Template App NNTP Service.xml file has been created Template App NTP Service.xml file has been created Template App POP Service.xml file has been created Template App SMTP Service.xml file has been created Template App SSH Service.xml file has been created Template_role_App_Puppet.xml file has been created Template_AWS_RDS.xml file has been created --- 223.18 seconds --- ============================================================ ==========================FINISHED========================== ============================================================
PS: Данный скрипт поддерживает и импорт дашбордов. Но кое-что в нем все еще чтоит оптимизировать!
Для поддержки, можно выполнить:
$ python3 Export_Templates_from_Zabbix.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 --t TEMPLATE [TEMPLATE ...], --template TEMPLATE [TEMPLATE ...] Indicate a template(s) --d folder, --dir folder Indicate a folder for template(s) --zabbix-host ZABBIX_HOST Zabbix host --zabbix-user ZABBIX_USER Zabbix user --zabbix-password ZABBIX_PASSWORD Zabbix password of user --i Import function --import Import function --e Export function --export Export function created by Vitalii Natarov
Такой скрипт, можно закинуть в crontab, чтобы выполнялся бэкап автоматически. У меня появилась идея — это в указанную папку, установить GIT, который будет коммитить (версионировать) ваши шаблоны в определенную, созданную ветку. При необходимости, можно будет смерджить в мастер (как вариант). Это даст возможность откатить все изменения до нужного состояния.
На этом у меня все, статья «Экспортирование zabbix templates» завершена.