Link zabbix template using SaltStack Events & Reactor
How to use SaltStack, Event, Reactor and pyzabbix to link zabbix template to host.
-
Enable Reactor on your SaltStack master:
Edit your master configuration file and add reactor configuration location.
For example:
In
/etc/salt/master
adddefault_include: master.d/*.conf
.More on SaltStack Reactor System
-
Reactor configuration
In our example, in/etc/salt/master.d/reactor.conf:
reactor:
- 'link-template-zabbix':
- /srv/salt/reactor/link-template-zabbix.sls
- Create a sls state:
Replace TARGET with minion_id where python script is located.
link_template_zabbix:
local.cmd.run:
- tgt: TARGET
- arg:
- /usr/local/bin/zabbix_linktemplate.py {{ data.id }} '{{ data.data.zabbix_template }}'
- Python script to link zabbix template using pyzabbix
#!/usr/bin/env python
import socket
import os
import sys
from pyzabbix import ZabbixAPI
ZABBIX_SERVER = 'https://zabbix.example.com/'
ZABBIX_USER = 'User'
ZABBIX_PASSWORD = 'PassWord'
# Create connection to the zabbix api
zapi = ZabbixAPI(ZABBIX_SERVER)
zapi.login(ZABBIX_USER, ZABBIX_PASSWORD)
def get_host_id(fqdn):
response = zapi.host.get(
output='extend',
filter={"host": fqdn}
)
if not response:
return "not found"
else:
result = response[0]["hostid"]
return result
def get_template_id(template_name):
response = zapi.template.get(
output='extend',
filter={"host": template_name}
)
if not response:
return "not found"
else:
result = response[0]["templateid"]
return result
if __name__ == '__main__':
fqdn = str(sys.argv[1])
template = str(sys.argv[2])
host_id = get_host_id(fqdn)
template_id = get_template_id(template)
if host_id == "not found":
print 'Host not found in Zabbix : %s' % fqdn
sys.exit(42)
elif template_id == "Not found":
print 'Template not found in Zabbix : %s' % template
sys.exit(42)
else:
response = zapi.template.massadd(
hosts=[host_id],
templates=[template_id]
)
print '%s is now linked to %s on zabbix server' % (fqdn, template)
- Add an event to your state:
link-template-zabbix:
event:
- send
- data:
zabbix_template: 'Template Name'
If your host in Zabbix is the same as your minion_id, it's enough. Or you can add hostname to data:
link-template-zabbix:
event:
- send
- data:
zabbix_template: 'Template Name'
hostname: 'hostname'
In this case, you will have to replace {{ data.id }}
by {{ data.data.hostname }}
in reactor sls state.
More on SaltStack Event System
Now when you apply state which includes event, reactor will match tag, and apply sls to link Zabbix Template Name associated.