浏览代码

Merge pull request #602 from kwoodson/tmp1

Adding support for prototypes and discoveryrules
Matt Woodson 9 年之前
父节点
当前提交
dfa3c0c22e
共有 2 个文件被更改,包括 76 次插入16 次删除
  1. 32 4
      roles/lib_zabbix/library/zbx_discoveryrule.py
  2. 44 12
      roles/lib_zabbix/library/zbx_itemprototype.py

+ 32 - 4
roles/lib_zabbix/library/zbx_discoveryrule.py

@@ -85,6 +85,7 @@ def main():
     Ansible module for zabbix discovery rules
     '''
 
+
     module = AnsibleModule(
         argument_spec=dict(
             zbx_server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
@@ -113,18 +114,27 @@ def main():
     idname = "itemid"
     dname = module.params['name']
     state = module.params['state']
+    template = get_template(zapi, module.params['template_name'])
 
     # selectInterfaces doesn't appear to be working but is needed.
     content = zapi.get_content(zbx_class_name,
                                'get',
                                {'search': {'name': dname},
+                                'templateids': template['templateid'],
                                 #'selectDServices': 'extend',
                                 #'selectDChecks': 'extend',
                                 #'selectDhosts': 'dhostid',
                                })
+
+    #******#
+    # GET
+    #******#
     if state == 'list':
         module.exit_json(changed=False, results=content['result'], state="list")
 
+    #******#
+    # DELETE
+    #******#
     if state == 'absent':
         if not exists(content):
             module.exit_json(changed=False, state="absent")
@@ -132,8 +142,9 @@ def main():
         content = zapi.get_content(zbx_class_name, 'delete', [content['result'][0][idname]])
         module.exit_json(changed=True, results=content['result'], state="absent")
 
+
+    # Create and Update
     if state == 'present':
-        template = get_template(zapi, module.params['template_name'])
         params = {'name': dname,
                   'key_':  module.params['key'],
                   'hostid':  template['templateid'],
@@ -144,12 +155,23 @@ def main():
         if params['type'] in [2, 5, 7, 11]:
             params.pop('interfaceid')
 
+        # Remove any None valued params
+        _ = [params.pop(key, None) for key in params.keys() if params[key] is None]
+
+        #******#
+        # CREATE
+        #******#
         if not exists(content):
-            # if we didn't find it, create it
             content = zapi.get_content(zbx_class_name, 'create', params)
+
+            if content.has_key('error'):
+                module.exit_json(failed=True, changed=True, results=content['error'], state="present")
+
             module.exit_json(changed=True, results=content['result'], state='present')
-        # already exists, we need to update it
-        # let's compare properties
+
+        ########
+        # UPDATE
+        ########
         differences = {}
         zab_results = content['result'][0]
         for key, value in params.items():
@@ -161,8 +183,14 @@ def main():
             module.exit_json(changed=False, results=zab_results, state="present")
 
         # We have differences and need to update
+        module.exit_json(failed=True, changed=False, results=differences, state="present")
+
         differences[idname] = zab_results[idname]
         content = zapi.get_content(zbx_class_name, 'update', differences)
+
+        if content.has_key('error'):
+            module.exit_json(failed=True, changed=False, results=content['error'], state="present")
+
         module.exit_json(changed=True, results=content['result'], state="present")
 
     module.exit_json(failed=True,

+ 44 - 12
roles/lib_zabbix/library/zbx_itemprototype.py

@@ -38,13 +38,14 @@ def exists(content, key='result'):
 
     return True
 
-def get_rule_id(zapi, discoveryrule_name):
+def get_rule_id(zapi, discoveryrule_name, templateid):
     '''get a discoveryrule by name
     '''
     content = zapi.get_content('discoveryrule',
                                'get',
                                {'search': {'name': discoveryrule_name},
                                 'output': 'extend',
+                                'templateids': templateid,
                                })
     if not content['result']:
         return None
@@ -53,6 +54,9 @@ def get_rule_id(zapi, discoveryrule_name):
 def get_template(zapi, template_name):
     '''get a template by name
     '''
+    if not template_name:
+        return None
+
     content = zapi.get_content('template',
                                'get',
                                {'search': {'host': template_name},
@@ -134,6 +138,7 @@ def get_app_ids(zapi, application_names):
             app_ids.append(content['result'][0]['applicationid'])
     return app_ids
 
+# pylint: disable=too-many-branches
 def main():
     '''
     Ansible module for zabbix discovery rules
@@ -152,10 +157,10 @@ def main():
             value_type=dict(default='float', type='str'),
             delay=dict(default=60, type='int'),
             lifetime=dict(default=30, type='int'),
-            template_name=dict(default=[], type='list'),
+            template_name=dict(default=None, required=True, type='str'),
             state=dict(default='present', type='str'),
             status=dict(default='enabled', type='str'),
-            discoveryrule_name=dict(default=None, type='str'),
+            discoveryrule_name=dict(default=None, required=True, type='str'),
             applications=dict(default=[], type='list'),
         ),
         #supports_check_mode=True
@@ -169,20 +174,26 @@ def main():
     #Set the instance and the template for the rest of the calls
     zbx_class_name = 'itemprototype'
     idname = "itemid"
-    dname = module.params['name']
     state = module.params['state']
+    template = get_template(zapi, module.params['template_name'])
 
     # selectInterfaces doesn't appear to be working but is needed.
     content = zapi.get_content(zbx_class_name,
                                'get',
-                               {'search': {'name': dname},
+                               {'search': {'name': module.params['name']},
                                 'selectApplications': 'applicationid',
                                 'selectDiscoveryRule': 'itemid',
-                                #'selectDhosts': 'dhostid',
                                })
+
+    #******#
+    # GET
+    #******#
     if state == 'list':
         module.exit_json(changed=False, results=content['result'], state="list")
 
+    #******#
+    # DELETE
+    #******#
     if state == 'absent':
         if not exists(content):
             module.exit_json(changed=False, state="absent")
@@ -190,26 +201,38 @@ def main():
         content = zapi.get_content(zbx_class_name, 'delete', [content['result'][0][idname]])
         module.exit_json(changed=True, results=content['result'], state="absent")
 
+    # Create and Update
     if state == 'present':
-        template = get_template(zapi, module.params['template_name'])
-        params = {'name': dname,
+        params = {'name': module.params['name'],
                   'key_':  module.params['key'],
                   'hostid':  template['templateid'],
                   'interfaceid': module.params['interfaceid'],
-                  'ruleid': get_rule_id(zapi, module.params['discoveryrule_name']),
+                  'ruleid': get_rule_id(zapi, module.params['discoveryrule_name'], template['templateid']),
                   'type': get_type(module.params['ztype']),
                   'value_type': get_value_type(module.params['value_type']),
                   'applications': get_app_ids(zapi, module.params['applications']),
                  }
+
         if params['type'] in [2, 5, 7, 8, 11, 15]:
             params.pop('interfaceid')
 
+        # Remove any None valued params
+        _ = [params.pop(key, None) for key in params.keys() if params[key] is None]
+
+        #******#
+        # CREATE
+        #******#
         if not exists(content):
-            # if we didn't find it, create it
             content = zapi.get_content(zbx_class_name, 'create', params)
+
+            if content.has_key('error'):
+                module.exit_json(failed=True, changed=True, results=content['error'], state="present")
+
             module.exit_json(changed=True, results=content['result'], state='present')
-        # already exists, we need to update it
-        # let's compare properties
+
+        #******#
+        # UPDATE
+        #******#
         differences = {}
         zab_results = content['result'][0]
         for key, value in params.items():
@@ -218,6 +241,11 @@ def main():
                 if value != zab_results['discoveryRule']['itemid']:
                     differences[key] = value
 
+            elif key == 'applications':
+                app_ids = [app['applicationid'] for app in zab_results[key]]
+                if set(app_ids) - set(value):
+                    differences[key] = value
+
             elif zab_results[key] != value and zab_results[key] != str(value):
                 differences[key] = value
 
@@ -227,6 +255,10 @@ def main():
         # We have differences and need to update
         differences[idname] = zab_results[idname]
         content = zapi.get_content(zbx_class_name, 'update', differences)
+
+        if content.has_key('error'):
+            module.exit_json(failed=True, changed=False, results=content['error'], state="present")
+
         module.exit_json(changed=True, results=content['result'], state="present")
 
     module.exit_json(failed=True,