zabbix.py 3.88 KB
Newer Older
1
#!/usr/bin/env python
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

# (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 <http://www.gnu.org/licenses/>.

######################################################################

"""
23 24
Zabbix Server external inventory script. 
========================================
25

26
Returns hosts and hostgroups from Zabbix Server.
27

28 29 30
Configuration is read from `zabbix.ini`.

Tested with Zabbix Server 2.0.6.
31 32 33 34 35 36
"""

import os, sys
import json
import argparse
import ConfigParser
37 38 39 40

try:
    from zabbix_api import ZabbixAPI
except:
41
    print >> sys.stderr, "Error: Zabbix API library must be installed: pip install zabbix-api."
42
    sys.exit(1)
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109

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:
110 111 112 113
            try:
                api = ZabbixAPI(server=self.zabbix_server)
                api.login(user=self.zabbix_username, password=self.zabbix_password)
            except BaseException, e:
114
                print >> sys.stderr, "Error: Could not login to Zabbix server. Check your zabbix.ini."
115
                sys.exit(1)
116 117 118 119 120 121 122 123

            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)
124 125

            else:
126
                print >> sys.stderr, "usage: --list  ..OR.. --host <hostname>"
127 128
                sys.exit(1)

129
        else:
130
            print >> sys.stderr, "Error: Configuration of server and credentials are required. See zabbix.ini."
131
            sys.exit(1)
132

133
ZabbixInventory()