From 500e6fa3743951a9e73b42fc5d6244ac80fb8dd7 Mon Sep 17 00:00:00 2001 From: Greg Buehler Date: Tue, 6 Aug 2013 09:19:06 -0700 Subject: [PATCH] Added Zabbix inventory plugin --- plugins/inventory/zabbix.ini | 11 ++++ plugins/inventory/zabbix.py | 113 +++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 plugins/inventory/zabbix.ini create mode 100755 plugins/inventory/zabbix.py diff --git a/plugins/inventory/zabbix.ini b/plugins/inventory/zabbix.ini new file mode 100644 index 00000000000..7dd02430f85 --- /dev/null +++ b/plugins/inventory/zabbix.ini @@ -0,0 +1,11 @@ +# Ansible Zabbix external inventory script settings +# + +[zabbix] + +# Server location +server = http://192.168.0.1/zabbix + +# Login +username = +password = diff --git a/plugins/inventory/zabbix.py b/plugins/inventory/zabbix.py new file mode 100755 index 00000000000..f3f3652aad0 --- /dev/null +++ b/plugins/inventory/zabbix.py @@ -0,0 +1,113 @@ +#!/usr/bin/python + +# (c) 2013, Greg Buehler +# +# This file is part of Ansible, +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +###################################################################### + +""" +Zabbix external inventory script. Returns hosts and hostgroups from Zabbix. + + +""" + +import os, sys +import json +import argparse +import ConfigParser +from zabbix_api import ZabbixAPI + +try: + import json +except: + import simplejson as json + +class ZabbixInventory(object): + + def read_settings(self): + config = ConfigParser.SafeConfigParser() + config.read(os.path.dirname(os.path.realpath(__file__)) + '/zabbix.ini') + # server + if config.has_option('zabbix', 'server'): + self.zabbix_server = config.get('zabbix', 'server') + + # login + if config.has_option('zabbix', 'username'): + self.zabbix_username = config.get('zabbix', 'username') + if config.has_option('zabbix', 'password'): + self.zabbix_password = config.get('zabbix', 'password') + + def read_cli(self): + parser = argparse.ArgumentParser() + parser.add_argument('--host') + parser.add_argument('--list', action='store_true') + self.options = parser.parse_args() + + def hoststub(self): + return { + 'hosts': [] + } + + def get_host(self, api, name): + data = {} + return data + + def get_list(self, api): + hostsData = api.host.get({'output': 'extend', 'selectGroups': 'extend'}) + + data = {} + data[self.defaultgroup] = self.hoststub() + + for host in hostsData: + hostname = host['name'] + data[self.defaultgroup]['hosts'].append(hostname) + + for group in host['groups']: + groupname = group['name'] + + if not groupname in data: + data[groupname] = self.hoststub() + + data[groupname]['hosts'].append(hostname) + + return data + + def __init__(self): + + self.defaultgroup = 'group_all' + self.zabbix_server = None + self.zabbix_username = None + self.zabbix_password = None + + self.read_settings() + self.read_cli() + + if self.zabbix_server and self.zabbix_username: + api = ZabbixAPI(server=self.zabbix_server) + api.login(user=self.zabbix_username, password=self.zabbix_password) + + if self.options.host: + data = self.get_host(api, self.options.host) + print json.dumps(data, indent=2) + + elif self.options.list: + data = self.get_list(api) + print json.dumps(data, indent=2) + else: + print "Configuration of server and credentials is required" + +ZabbixInventory() \ No newline at end of file