Добавление RDS хостов в zabbix c использованием boto3 + python3
На работе потребовалось добавлять RDS хосты (с различных учеток AWS) в заббикс. Руками делать, — это конечно нормальное явление, но я люблю оптимизацию и автоматизацию. И для этого готов был написать скрипт. Пал выбор на питон.
Полезное чтиво:
Установка Zabbix + nginx+php-fpm + mariaDB в Unix/Linux
Установка Zabbix-agent в Unix/Linux
Установка pip/setuptools/wheel в Unix/Linux
Автоматическое выключение хостов в zabbix
Автоматическое удаление хостов в zabbix
Открываем файл:
# vim Add_Hosts_from_AWS_RDS_to_Zabbix.py
Он выглядит следующим образом:
#!/bin/env python3
# -*- coding: utf-8 -*-
import requests
import sys
import boto3
import glob
import smtplib
from pyzabbix import ZabbixAPI, ZabbixAPIException
#
class bgcolors:
def __init__(self):
self.colors = {
'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 get_creds_from_assum_role():
auth_params = []
# create an STS client object that represents a live connection to the
# STS service
#sts_client = boto3.setup_default_session(region_name='us-east-1')
sts_client = boto3.client('sts', region_name='us-east-1')
#
Assum_Roles = ['arn:aws:iam::93388403184:role/CW-RDS-READ-ONLY'
, 'arn:aws:iam::4131648289989:role/CLOUDWATCH-READONLY-ACCESS-CMSHARED'
, 'arn:aws:iam::067785372661:role/CLOUDWATCH-READONLY-ACCESS-DEV'
, 'arn:aws:iam::66803035257:role/CLOUDWATCH-READONLY-ACCESS-CMSHARED'
, 'arn:aws:iam::505163668321:role/CLOUDWATCH-READONLY-ACCESS-ZABBIX'
, 'arn:aws:iam::378494444851:role/CLOUDWATCH-READONLY-ACCESS-ZABBIX']
# Call the assume_role method of the STSConnection object and pass the role
# ARN and a role session name.
for Assum_Role in Assum_Roles:
assumedRoleObject = sts_client.assume_role(
RoleArn=Assum_Role,
RoleSessionName="ElastiCache"
)
# From the response that contains the assumed role, get the temporary
# credentials that can be used to make subsequent API calls
credentials = assumedRoleObject['Credentials']
auth_param = {
'access_key': credentials['AccessKeyId'],
'secret_key': credentials['SecretAccessKey'],
'session_token': credentials['SessionToken']
}
auth_params.append(auth_param)
# print(auth_params)
return auth_params
def get_rds_hosts_from_assum_role():
hosts_from_rds = []
# RDS
Creds_Data = get_creds_from_assum_role()
for get_greds_from_acc in Creds_Data:
access_key = get_greds_from_acc['access_key']
secret_key = get_greds_from_acc['secret_key']
session_token = get_greds_from_acc['session_token']
#
rds_client = boto3.setup_default_session(region_name='us-east-1'
, aws_access_key_id=access_key
, aws_secret_access_key=secret_key
, aws_session_token=session_token)
rds_client = boto3.client('rds'
, region_name='us-east-1'
, aws_access_key_id=access_key
, aws_secret_access_key=secret_key
, aws_session_token=session_token)
try:
# get all of the db instances
rdses = rds_client.describe_db_instances()
for rds in rdses['DBInstances']:
hosts_from_rds.append(rds['Endpoint']['Address'])
except Exception as error:
print (error)
# print(hosts_from_rds)
return hosts_from_rds # def get_elasticache_hosts_from_assum_role():
def login_to_zabbix():
# host, login, password to connect to DEV zabbix-server
Zabbix_Host = 'https://zabbix.com/'
Zabbix_User = 'apiuser'
Zabbix_Password = 'gkjhjhvjh5uigkjhg'
# You can use the Connection_Timeout
Connection_Timeout = 25
# Verify SSL
Verify_SSL = False
# Connect to zabbix-server
zapi = ZabbixAPI(Zabbix_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)
r = requests.get(Zabbix_Host, verify=Verify_SSL)
#
zapi.login(Zabbix_User, Zabbix_Password)
zapi.session.auth = (Zabbix_User, Zabbix_Password)
# You can re-define Connection_Timeout after
zapi.timeout = Connection_Timeout
return zapi
def add_group_to_zabbix(group):
zapi = login_to_zabbix()
zapi.hostgroup.create(name=group)
return add_group_to_zabbix
def add_host_to_zabbix(host, group, template, port=666):
zapi = login_to_zabbix()
Get_Templates = zapi.template.get(search={"name": template})
for template in Get_Templates:
# print(template['templateid'])
templateid = template['templateid']
Get_Groups = zapi.hostgroup.get(search={"name": group})
for group in Get_Groups:
if len(host) > 64:
print ('Host is more than 64 characters: ', host)
sender = 'captain@localhost'
receivers = 'vitalii_natarov@epam.com'
message = ('Host is more than 64 characters: %s' % host)
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message)
else:
zapi.host.create({"host": host,
"interfaces": [{
"type": 1,
"main": 1,
"useip": 0,
"ip": "",
"dns": host,
"port": port,
}],
"groups": [{
"groupid": group['groupid'],
}],
"templates": [{
"templateid": templateid,
}],
})
return add_host_to_zabbix
def add_template_to_zabbix():
zapi = login_to_zabbix()
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'
},
}
path = 'Zabbix_Templates/Template_AWS_RDS.xml'
files = glob.glob(path)
for file in files:
with open(file, 'r') as f:
template = f.read()
try:
zapi.confimport('xml', template, rules)
except ZabbixAPIException as e:
print(e)
return add_template_to_zabbix
def main():
zapi = login_to_zabbix()
Zabbix_Version = zapi.do_request('apiinfo.version')
print(bgcolors().colors['OKGREEN'],"============================================================", bgcolors().colors['ENDC'])
print(bgcolors().colors['OKGREEN'],'Zabbix Version:', Zabbix_Version['result'] + bgcolors().colors['ENDC'])
print(bgcolors().colors['OKGREEN'],"============================================================", bgcolors().colors['ENDC'])
# find needed group, template, host
Needed_groups = ['AWS RDS']
Needed_IPs = get_rds_hosts_from_assum_role()
Needed_Templates = ['Template_AWS_RDS']
Get_Templates = zapi.template.get(search={"name": Needed_Templates})
for template in Get_Templates:
Needed_Template = template['name']
for Needed_group in Needed_groups:
Get_Groups = zapi.hostgroup.get(search={"name": Needed_group})
if (len(Get_Groups)) is not 0:
# check host in provided group
for Needed_IP in Needed_IPs:
Get_Hosts = zapi.host.get(search={"name": Needed_IP})
if (len(Get_Hosts)) is 0:
#for h in Get_Hosts:
add_host_to_zabbix(Needed_IP, Needed_group, Needed_Template)
print('Added ', Needed_IP, 'host to zabbix')
else:
#pass
print ('The', Needed_IP, 'already exist')
else:
add_group_to_zabbix(Needed_group)
print ('Added the', Needed_group, 'group to zabbix')
# find needed template
for Needed_Template in Needed_Templates:
Get_Templates = zapi.hostgroup.get(filter={"name": Needed_Templates})
if (len(Get_Templates)) is 0:
add_template_to_zabbix()
print('Added', Needed_Template, 'template to zabbix')
else:
pass
for Needed_IP in Needed_IPs:
Get_Hosts = zapi.host.get(filter={"name": Needed_IP}, output=['hostid', 'host', 'name', 'status'])
if (len(Get_Hosts)) is 0:
add_host_to_zabbix(Needed_IP, Needed_group, Needed_Template)
print('Added ', Needed_IP, 'host to zabbix')
else:
pass
print(bgcolors().colors['OKGREEN'], "============================================================", bgcolors().colors['ENDC'])
print(bgcolors().colors['OKGREEN'], "==========================FINISHED==========================", bgcolors().colors['ENDC'])
print(bgcolors().colors['OKGREEN'], "============================================================", bgcolors().colors['ENDC'])
if __name__ == '__main__':
main()
В теле скрипта нужно изменить некоторые переменные. Я не буду рассказывать что нужно менять, думаю и так очевидно, если нет — то можете написать в комментариях и я помогу с этим.
Создаем темплейт:
# mkdir Zabbix_Templates
Открываем файл:
# vim Zabbix_Templates/Template_AWS_RDS.xml
И вставляем в него:
<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
<version>2.0</version>
<date>2017-08-18T17:25:33Z</date>
<groups>
<group>
<name>AWS RDS</name>
</group>
<group>
<name>Templates</name>
</group>
</groups>
<templates>
<template>
<template>Template_AWS_RDS</template>
<name>Template_AWS_RDS</name>
<description>AWS RDS monitoring</description>
<groups>
<group>
<name>AWS RDS</name>
</group>
<group>
<name>Templates</name>
</group>
</groups>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<items>
<item>
<name>RDS::BinLogDiskUsage</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.BinLogDiskUsage.Average</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>B</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The amount of disk space occupied by binary logs on the master. Applies to MySQL read replicas.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::CPUUtilization</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.CPUUtilization.Average</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>%</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The percentage of CPU utilization.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::DatabaseConnections</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.DatabaseConnections.Average</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units/>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The number of database connections in use.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::DiskQueueDepth</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.DiskQueueDepth.Average</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units/>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The number of outstanding IOs (read/write requests) waiting to access the disk.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::FreeableMemory</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.FreeableMemory.Minimum</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>B</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The amount of available random access memory.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::FreeStorageSpace</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.FreeStorageSpace.Minimum</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>B</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The amount of available storage space.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::NetworkReceiveThroughput</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.NetworkReceiveThroughput.Average</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>B/s</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The incoming (Receive) network traffic on the DB instance, including both customer database traffic and Amazon RDS traffic used for monitoring and replication.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::NetworkTransmitThroughput</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.NetworkTransmitThroughput.Average</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>B/s</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The outgoing (Transmit) network traffic on the DB instance, including both customer database traffic and Amazon RDS traffic used for monitoring and replication.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::ReadIOPS</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.ReadIOPS.Average</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>ops/s</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The average number of disk I/O operations per second.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::ReadLatency</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.ReadLatency.Average</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>s</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The average amount of time taken per disk I/O operation.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::ReadThroughput</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.ReadThroughput.Average</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>B/s</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The average number of bytes read from disk per second.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::ReplicaLag</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.ReplicaLag.Average</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>s</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The amount of time a Read Replica DB Instance lags behind the source DB Instance. Applies to MySQL read replicas.
The ReplicaLag metric reports the value of the Seconds_Behind_Master field of the MySQL SHOW SLAVE STATUS command.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::SwapUsage</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.SwapUsage.Average</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>B</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The amount of swap space used on the DB Instance.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::WriteIOPS</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.WriteIOPS.Average</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>ops/s</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The average number of disk I/O operations per second.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::WriteLatency</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.WriteLatency.Average</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>s</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The average amount of time taken per disk I/O operation.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
<item>
<name>RDS::WriteThroughput</name>
<type>2</type>
<snmp_community/>
<multiplier>0</multiplier>
<snmp_oid/>
<key>RDS.WriteThroughput.Average</key>
<delay>0</delay>
<history>15</history>
<trends>365</trends>
<status>0</status>
<value_type>0</value_type>
<allowed_hosts/>
<units>B/s</units>
<delta>0</delta>
<snmpv3_contextname/>
<snmpv3_securityname/>
<snmpv3_securitylevel>0</snmpv3_securitylevel>
<snmpv3_authprotocol>0</snmpv3_authprotocol>
<snmpv3_authpassphrase/>
<snmpv3_privprotocol>0</snmpv3_privprotocol>
<snmpv3_privpassphrase/>
<formula>1</formula>
<delay_flex/>
<params/>
<ipmi_sensor/>
<data_type>0</data_type>
<authtype>0</authtype>
<username/>
<password/>
<publickey/>
<privatekey/>
<port/>
<description>The average number of bytes written to disk per second.</description>
<inventory_link>0</inventory_link>
<applications>
<application>
<name>RDS</name>
</application>
</applications>
<valuemap/>
<logtimefmt/>
</item>
</items>
<discovery_rules/>
<macros>
<macro>
<macro>{$TH_P2_FREE_STORAGE}</macro>
<value>1G</value>
</macro>
<macro>
<macro>{$TH_P2_LATENCY}</macro>
<value>0.2</value>
</macro>
<macro>
<macro>{$TH_P3_CPU_USAGE}</macro>
<value>90</value>
</macro>
<macro>
<macro>{$TH_P3_FREE_STORAGE}</macro>
<value>2G</value>
</macro>
<macro>
<macro>{$TH_P3_LATENCY}</macro>
<value>0.1</value>
</macro>
<macro>
<macro>{$TH_P4_CPU_USAGE}</macro>
<value>85</value>
</macro>
</macros>
<templates/>
<screens>
<screen>
<name>RDS::Statistics</name>
<hsize>2</hsize>
<vsize>3</vsize>
<screen_items>
<screen_item>
<resourcetype>0</resourcetype>
<width>500</width>
<height>100</height>
<x>0</x>
<y>0</y>
<colspan>1</colspan>
<rowspan>1</rowspan>
<elements>0</elements>
<valign>1</valign>
<halign>2</halign>
<style>0</style>
<url/>
<dynamic>0</dynamic>
<sort_triggers>0</sort_triggers>
<resource>
<name>RDS::DB Connections</name>
<host>Template_AWS_RDS</host>
</resource>
<max_columns>3</max_columns>
<application/>
</screen_item>
<screen_item>
<resourcetype>0</resourcetype>
<width>500</width>
<height>100</height>
<x>1</x>
<y>0</y>
<colspan>1</colspan>
<rowspan>1</rowspan>
<elements>0</elements>
<valign>1</valign>
<halign>1</halign>
<style>0</style>
<url/>
<dynamic>0</dynamic>
<sort_triggers>0</sort_triggers>
<resource>
<name>RDS::Latency</name>
<host>Template_AWS_RDS</host>
</resource>
<max_columns>3</max_columns>
<application/>
</screen_item>
<screen_item>
<resourcetype>0</resourcetype>
<width>500</width>
<height>100</height>
<x>0</x>
<y>1</y>
<colspan>1</colspan>
<rowspan>1</rowspan>
<elements>0</elements>
<valign>1</valign>
<halign>2</halign>
<style>0</style>
<url/>
<dynamic>0</dynamic>
<sort_triggers>0</sort_triggers>
<resource>
<name>RDS::Storage Stats</name>
<host>Template_AWS_RDS</host>
</resource>
<max_columns>3</max_columns>
<application/>
</screen_item>
<screen_item>
<resourcetype>0</resourcetype>
<width>500</width>
<height>100</height>
<x>1</x>
<y>1</y>
<colspan>1</colspan>
<rowspan>1</rowspan>
<elements>0</elements>
<valign>1</valign>
<halign>1</halign>
<style>0</style>
<url/>
<dynamic>0</dynamic>
<sort_triggers>0</sort_triggers>
<resource>
<name>RDS::System Stats</name>
<host>Template_AWS_RDS</host>
</resource>
<max_columns>3</max_columns>
<application/>
</screen_item>
<screen_item>
<resourcetype>0</resourcetype>
<width>500</width>
<height>100</height>
<x>0</x>
<y>2</y>
<colspan>1</colspan>
<rowspan>1</rowspan>
<elements>0</elements>
<valign>1</valign>
<halign>2</halign>
<style>0</style>
<url/>
<dynamic>0</dynamic>
<sort_triggers>0</sort_triggers>
<resource>
<name>RDS::Network Stats</name>
<host>Template_AWS_RDS</host>
</resource>
<max_columns>3</max_columns>
<application/>
</screen_item>
<screen_item>
<resourcetype>0</resourcetype>
<width>500</width>
<height>100</height>
<x>1</x>
<y>2</y>
<colspan>1</colspan>
<rowspan>1</rowspan>
<elements>0</elements>
<valign>1</valign>
<halign>1</halign>
<style>0</style>
<url/>
<dynamic>0</dynamic>
<sort_triggers>0</sort_triggers>
<resource>
<name>RDS::IO Stats</name>
<host>Template_AWS_RDS</host>
</resource>
<max_columns>3</max_columns>
<application/>
</screen_item>
</screen_items>
</screen>
</screens>
</template>
</templates>
<triggers>
<trigger>
<expression>{Template_AWS_RDS:RDS.CPUUtilization.Average.min(#3)}>{$TH_P4_CPU_USAGE} and {Template_AWS_RDS:RDS.CPUUtilization.Average.max(#3)}<{$TH_P3_CPU_USAGE}</expression>
<name>RDS::High CPU Usage (LV={ITEM.VALUE})</name>
<url/>
<status>0</status>
<priority>2</priority>
<description/>
<type>0</type>
<dependencies/>
</trigger>
<trigger>
<expression>{Template_AWS_RDS:RDS.CPUUtilization.Average.min(#3)}>{$TH_P3_CPU_USAGE}</expression>
<name>RDS::High CPU Usage (LV={ITEM.VALUE})</name>
<url/>
<status>0</status>
<priority>3</priority>
<description/>
<type>0</type>
<dependencies/>
</trigger>
<trigger>
<expression>{Template_AWS_RDS:RDS.ReadLatency.Average.last()}>{$TH_P3_LATENCY} and {Template_AWS_RDS:RDS.ReadLatency.Average.last()}<{$TH_P2_LATENCY}</expression>
<name>RDS::High Read Latency (LV={ITEM.VALUE})</name>
<url/>
<status>0</status>
<priority>3</priority>
<description/>
<type>0</type>
<dependencies/>
</trigger>
<trigger>
<expression>{Template_AWS_RDS:RDS.ReadLatency.Average.last()}>{$TH_P2_LATENCY}</expression>
<name>RDS::High Read Latency (LV={ITEM.VALUE})</name>
<url/>
<status>0</status>
<priority>4</priority>
<description/>
<type>0</type>
<dependencies/>
</trigger>
<trigger>
<expression>{Template_AWS_RDS:RDS.WriteLatency.Average.last()}>{$TH_P2_LATENCY}</expression>
<name>RDS::High Write Latency (LV={ITEM.VALUE})</name>
<url/>
<status>0</status>
<priority>4</priority>
<description/>
<type>0</type>
<dependencies/>
</trigger>
<trigger>
<expression>{Template_AWS_RDS:RDS.WriteLatency.Average.last()}>{$TH_P3_LATENCY} and {Template_AWS_RDS:RDS.WriteLatency.Average.last()}<{$TH_P2_LATENCY}</expression>
<name>RDS::High Write Latency (LV={ITEM.VALUE})</name>
<url/>
<status>0</status>
<priority>3</priority>
<description/>
<type>0</type>
<dependencies/>
</trigger>
<trigger>
<expression>{Template_AWS_RDS:RDS.FreeStorageSpace.Minimum.last()}<{$TH_P3_FREE_STORAGE} and {Template_AWS_RDS:RDS.FreeStorageSpace.Minimum.last()}>{$TH_P2_FREE_STORAGE}</expression>
<name>RDS::Low free storage space (LV={ITEM.VALUE})</name>
<url/>
<status>0</status>
<priority>3</priority>
<description/>
<type>0</type>
<dependencies/>
</trigger>
<trigger>
<expression>{Template_AWS_RDS:RDS.FreeStorageSpace.Minimum.last()}<{$TH_P2_FREE_STORAGE}</expression>
<name>RDS::Low free storage space (LV={ITEM.VALUE})</name>
<url/>
<status>0</status>
<priority>4</priority>
<description/>
<type>0</type>
<dependencies/>
</trigger>
</triggers>
<graphs>
<graph>
<name>RDS::DB Connections</name>
<width>800</width>
<height>200</height>
<yaxismin>0.0000</yaxismin>
<yaxismax>100.0000</yaxismax>
<show_work_period>1</show_work_period>
<show_triggers>1</show_triggers>
<type>0</type>
<show_legend>1</show_legend>
<show_3d>0</show_3d>
<percent_left>0.0000</percent_left>
<percent_right>0.0000</percent_right>
<ymin_type_1>1</ymin_type_1>
<ymax_type_1>0</ymax_type_1>
<ymin_item_1>0</ymin_item_1>
<ymax_item_1>0</ymax_item_1>
<graph_items>
<graph_item>
<sortorder>0</sortorder>
<drawtype>5</drawtype>
<color>00C800</color>
<yaxisside>1</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.DatabaseConnections.Average</key>
</item>
</graph_item>
</graph_items>
</graph>
<graph>
<name>RDS::IO Stats</name>
<width>800</width>
<height>200</height>
<yaxismin>0.0000</yaxismin>
<yaxismax>100.0000</yaxismax>
<show_work_period>1</show_work_period>
<show_triggers>1</show_triggers>
<type>0</type>
<show_legend>1</show_legend>
<show_3d>0</show_3d>
<percent_left>0.0000</percent_left>
<percent_right>0.0000</percent_right>
<ymin_type_1>1</ymin_type_1>
<ymax_type_1>0</ymax_type_1>
<ymin_item_1>0</ymin_item_1>
<ymax_item_1>0</ymax_item_1>
<graph_items>
<graph_item>
<sortorder>0</sortorder>
<drawtype>5</drawtype>
<color>00CC00</color>
<yaxisside>1</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.ReadIOPS.Average</key>
</item>
</graph_item>
<graph_item>
<sortorder>1</sortorder>
<drawtype>5</drawtype>
<color>DDDD00</color>
<yaxisside>1</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.WriteIOPS.Average</key>
</item>
</graph_item>
<graph_item>
<sortorder>2</sortorder>
<drawtype>0</drawtype>
<color>CC0000</color>
<yaxisside>0</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.DiskQueueDepth.Average</key>
</item>
</graph_item>
</graph_items>
</graph>
<graph>
<name>RDS::Latency</name>
<width>800</width>
<height>200</height>
<yaxismin>0.0000</yaxismin>
<yaxismax>100.0000</yaxismax>
<show_work_period>1</show_work_period>
<show_triggers>1</show_triggers>
<type>0</type>
<show_legend>1</show_legend>
<show_3d>0</show_3d>
<percent_left>0.0000</percent_left>
<percent_right>0.0000</percent_right>
<ymin_type_1>1</ymin_type_1>
<ymax_type_1>0</ymax_type_1>
<ymin_item_1>0</ymin_item_1>
<ymax_item_1>0</ymax_item_1>
<graph_items>
<graph_item>
<sortorder>0</sortorder>
<drawtype>5</drawtype>
<color>00CC00</color>
<yaxisside>1</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.ReadThroughput.Average</key>
</item>
</graph_item>
<graph_item>
<sortorder>1</sortorder>
<drawtype>5</drawtype>
<color>DDDD00</color>
<yaxisside>1</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.WriteThroughput.Average</key>
</item>
</graph_item>
<graph_item>
<sortorder>2</sortorder>
<drawtype>0</drawtype>
<color>0000DD</color>
<yaxisside>0</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.ReadLatency.Average</key>
</item>
</graph_item>
<graph_item>
<sortorder>3</sortorder>
<drawtype>0</drawtype>
<color>DD0000</color>
<yaxisside>0</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.WriteLatency.Average</key>
</item>
</graph_item>
</graph_items>
</graph>
<graph>
<name>RDS::Network Stats</name>
<width>800</width>
<height>200</height>
<yaxismin>0.0000</yaxismin>
<yaxismax>100.0000</yaxismax>
<show_work_period>1</show_work_period>
<show_triggers>1</show_triggers>
<type>0</type>
<show_legend>1</show_legend>
<show_3d>0</show_3d>
<percent_left>0.0000</percent_left>
<percent_right>0.0000</percent_right>
<ymin_type_1>1</ymin_type_1>
<ymax_type_1>0</ymax_type_1>
<ymin_item_1>0</ymin_item_1>
<ymax_item_1>0</ymax_item_1>
<graph_items>
<graph_item>
<sortorder>0</sortorder>
<drawtype>5</drawtype>
<color>0000DD</color>
<yaxisside>1</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.NetworkReceiveThroughput.Average</key>
</item>
</graph_item>
<graph_item>
<sortorder>1</sortorder>
<drawtype>5</drawtype>
<color>00CC00</color>
<yaxisside>1</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.NetworkTransmitThroughput.Average</key>
</item>
</graph_item>
</graph_items>
</graph>
<graph>
<name>RDS::Storage Stats</name>
<width>800</width>
<height>200</height>
<yaxismin>0.0000</yaxismin>
<yaxismax>100.0000</yaxismax>
<show_work_period>1</show_work_period>
<show_triggers>1</show_triggers>
<type>0</type>
<show_legend>1</show_legend>
<show_3d>0</show_3d>
<percent_left>0.0000</percent_left>
<percent_right>0.0000</percent_right>
<ymin_type_1>1</ymin_type_1>
<ymax_type_1>0</ymax_type_1>
<ymin_item_1>0</ymin_item_1>
<ymax_item_1>0</ymax_item_1>
<graph_items>
<graph_item>
<sortorder>0</sortorder>
<drawtype>5</drawtype>
<color>0000DD</color>
<yaxisside>1</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.BinLogDiskUsage.Average</key>
</item>
</graph_item>
<graph_item>
<sortorder>1</sortorder>
<drawtype>5</drawtype>
<color>00CC00</color>
<yaxisside>1</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.FreeStorageSpace.Minimum</key>
</item>
</graph_item>
</graph_items>
</graph>
<graph>
<name>RDS::System Stats</name>
<width>800</width>
<height>200</height>
<yaxismin>0.0000</yaxismin>
<yaxismax>100.0000</yaxismax>
<show_work_period>1</show_work_period>
<show_triggers>1</show_triggers>
<type>0</type>
<show_legend>1</show_legend>
<show_3d>0</show_3d>
<percent_left>0.0000</percent_left>
<percent_right>0.0000</percent_right>
<ymin_type_1>1</ymin_type_1>
<ymax_type_1>0</ymax_type_1>
<ymin_item_1>0</ymin_item_1>
<ymax_item_1>0</ymax_item_1>
<graph_items>
<graph_item>
<sortorder>0</sortorder>
<drawtype>5</drawtype>
<color>0000EE</color>
<yaxisside>1</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.SwapUsage.Average</key>
</item>
</graph_item>
<graph_item>
<sortorder>1</sortorder>
<drawtype>5</drawtype>
<color>00C800</color>
<yaxisside>1</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.FreeableMemory.Minimum</key>
</item>
</graph_item>
<graph_item>
<sortorder>2</sortorder>
<drawtype>2</drawtype>
<color>EE0000</color>
<yaxisside>0</yaxisside>
<calc_fnc>7</calc_fnc>
<type>0</type>
<item>
<host>Template_AWS_RDS</host>
<key>RDS.CPUUtilization.Average</key>
</item>
</graph_item>
</graph_items>
</graph>
</graphs>
</zabbix_export>
Запускаем скрипт:
# python3 Add_Hosts_from_AWS_RDS_to_Zabbix.py
PS: Не забываем ставить зависимости через pip3.
Вот и все, статья «Добавление RDS хостов в zabbix c использованием boto3 + python3» завершена.