Browse Source

Updates for zbx ans module

Kenny Woodson 9 years ago
parent
commit
693be4802c
40 changed files with 836 additions and 527 deletions
  1. 22 2
      filter_plugins/oo_filters.py
  2. 29 0
      filter_plugins/oo_zabbix_filters.py
  3. 1 1
      git/pylint.sh
  4. 32 25
      playbooks/adhoc/zabbix_setup/clean_zabbix.yml
  5. 0 57
      playbooks/adhoc/zabbix_setup/create_template.yml
  6. 0 31
      playbooks/adhoc/zabbix_setup/create_user.yml
  7. 0 1
      playbooks/adhoc/zabbix_setup/filter_plugins
  8. 0 1
      playbooks/adhoc/zabbix_setup/roles
  9. 0 38
      playbooks/adhoc/zabbix_setup/setup_zabbix.yml
  10. 38 0
      roles/lib_zabbix/README.md
  11. 3 0
      roles/lib_zabbix/library/__init__.py
  12. 13 9
      roles/os_zabbix/library/zbx_application.py
  13. 8 8
      roles/os_zabbix/library/zbx_discoveryrule.py
  14. 8 8
      roles/os_zabbix/library/zbx_host.py
  15. 8 8
      roles/os_zabbix/library/zbx_hostgroup.py
  16. 17 9
      roles/os_zabbix/library/zbx_item.py
  17. 8 8
      roles/os_zabbix/library/zbx_itemprototype.py
  18. 28 9
      roles/os_zabbix/library/zbx_mediatype.py
  19. 14 9
      roles/os_zabbix/library/zbx_template.py
  20. 8 10
      roles/os_zabbix/library/zbx_trigger.py
  21. 44 23
      roles/os_zabbix/library/zbx_user.py
  22. 245 0
      roles/lib_zabbix/library/zbx_user_media.py
  23. 71 23
      roles/os_zabbix/library/zbx_usergroup.py
  24. 61 0
      roles/lib_zabbix/tasks/create_template.yml
  25. 11 0
      roles/lib_zabbix/tasks/create_user.yml
  26. 40 0
      roles/os_zabbix/README.md
  27. 1 0
      roles/os_zabbix/defaults/main.yml
  28. 1 0
      roles/os_zabbix/handlers/main.yml
  29. 0 0
      roles/os_zabbix/library/__init__.py
  30. 0 115
      roles/os_zabbix/library/get_drule.yml
  31. 0 131
      roles/os_zabbix/library/test.yml
  32. 9 0
      roles/os_zabbix/meta/main.yml
  33. 30 0
      roles/os_zabbix/tasks/main.yml
  34. 1 0
      roles/os_zabbix/vars/main.yml
  35. 2 1
      playbooks/adhoc/zabbix_setup/vars/template_heartbeat.yml
  36. 0 0
      roles/os_zabbix/vars/template_host.yml
  37. 0 0
      roles/os_zabbix/vars/template_master.yml
  38. 0 0
      roles/os_zabbix/vars/template_node.yml
  39. 83 0
      playbooks/adhoc/zabbix_setup/vars/template_os_linux.yml
  40. 0 0
      roles/os_zabbix/vars/template_router.yml

+ 22 - 2
filter_plugins/oo_filters.py

@@ -73,7 +73,7 @@ class FilterModule(object):
 
         if filters is not None:
             if not issubclass(type(filters), dict):
-                raise errors.AnsibleFilterError("|fialed expects filter to be a"
+                raise errors.AnsibleFilterError("|failed expects filter to be a"
                                                 " dict")
             retval = [FilterModule.get_attr(d, attribute) for d in data if (
                 all([d.get(key, None) == filters[key] for key in filters]))]
@@ -83,6 +83,25 @@ class FilterModule(object):
         return retval
 
     @staticmethod
+    def oo_select_keys_from_list(data, keys):
+        ''' This returns a list, which contains the value portions for the keys
+            Ex: data = { 'a':1, 'b':2, 'c':3 }
+                keys = ['a', 'c']
+                returns [1, 3]
+        '''
+
+        if not issubclass(type(data), list):
+            raise errors.AnsibleFilterError("|failed expects to filter on a list")
+
+        if not issubclass(type(keys), list):
+            raise errors.AnsibleFilterError("|failed expects first param is a list")
+
+        # Gather up the values for the list of keys passed in
+        retval = [FilterModule.oo_select_keys(item, keys) for item in data]
+
+        return FilterModule.oo_flatten(retval)
+
+    @staticmethod
     def oo_select_keys(data, keys):
         ''' This returns a list, which contains the value portions for the keys
             Ex: data = { 'a':1, 'b':2, 'c':3 }
@@ -97,7 +116,7 @@ class FilterModule(object):
             raise errors.AnsibleFilterError("|failed expects first param is a list")
 
         # Gather up the values for the list of keys passed in
-        retval = [data[key] for key in keys]
+        retval = [data[key] for key in keys if data.has_key(key)]
 
         return retval
 
@@ -312,6 +331,7 @@ class FilterModule(object):
         ''' returns a mapping of filters to methods '''
         return {
             "oo_select_keys": self.oo_select_keys,
+            "oo_select_keys_from_list": self.oo_select_keys_from_list,
             "oo_collect": self.oo_collect,
             "oo_flatten": self.oo_flatten,
             "oo_pdb": self.oo_pdb,

+ 29 - 0
filter_plugins/oo_zabbix_filters.py

@@ -60,6 +60,17 @@ class FilterModule(object):
         return None
 
     @staticmethod
+    def oo_build_zabbix_collect(data, string, value):
+        ''' Build a list of dicts from a list of data matched on string attribute
+        '''
+        rval = []
+        for item in data:
+            if item[string] == value:
+                rval.append(item)
+
+        return rval
+
+    @staticmethod
     def oo_build_zabbix_list_dict(values, string):
         ''' Build a list of dicts with string as key for each value
         '''
@@ -68,6 +79,22 @@ class FilterModule(object):
             rval.append({string: value})
         return rval
 
+    @staticmethod
+    def oo_remove_attr_from_list_dict(data, attr):
+        ''' Remove a specific attribute from a dict
+        '''
+        attrs = []
+        if isinstance(attr, str):
+            attrs.append(attr)
+        else:
+            attrs = attr
+
+        for attribute in attrs:
+            for _entry in data:
+                _entry.pop(attribute, None)
+
+        return data
+
     def filters(self):
         ''' returns a mapping of filters to methods '''
         return {
@@ -76,4 +103,6 @@ class FilterModule(object):
             "oo_set_zbx_trigger_triggerid": self.oo_set_zbx_trigger_triggerid,
             "oo_build_zabbix_list_dict": self.oo_build_zabbix_list_dict,
             "create_data": self.create_data,
+            "oo_build_zabbix_collect": self.oo_build_zabbix_collect,
+            "oo_remove_attr_from_list_dict": self.oo_remove_attr_from_list_dict,
         }

+ 1 - 1
git/pylint.sh

@@ -13,7 +13,7 @@ OLDREV=$1
 NEWREV=$2
 #TRG_BRANCH=$3
 
-PYTHON=/var/lib/jenkins/python27/bin/python
+PYTHON=$(which python)
 
 set +e
 PY_DIFF=$(/usr/bin/git diff --name-only $OLDREV $NEWREV --diff-filter=ACM | grep ".py$")

+ 32 - 25
playbooks/adhoc/zabbix_setup/clean_zabbix.yml

@@ -2,50 +2,57 @@
 - hosts: localhost
   gather_facts: no
   vars:
-    g_zserver: http://localhost/zabbix/api_jsonrpc.php
-    g_zuser: Admin
-    g_zpassword: zabbix
+    g_server: http://localhost:8080/zabbix/api_jsonrpc.php
+    g_user: ''
+    g_password: ''
+
   roles:
-  - ../../../roles/os_zabbix
-  post_tasks:
+  - lib_zabbix
 
-  - zbx_template:
-      server: "{{ g_zserver }}"
-      user: "{{ g_zuser }}"
-      password: "{{ g_zpassword }}"
+  post_tasks:
+  - name: CLEAN List template for heartbeat
+    zbx_template:
+      zbx_server: "{{ g_server }}"
+      zbx_user: "{{ g_user }}"
+      zbx_password: "{{ g_password }}"
       state: list
       name: 'Template Heartbeat'
     register: templ_heartbeat
 
-  - zbx_template:
-      server: "{{ g_zserver }}"
-      user: "{{ g_zuser }}"
-      password: "{{ g_zpassword }}"
+  - name: CLEAN List template app zabbix server
+    zbx_template:
+      zbx_server: "{{ g_server }}"
+      zbx_user: "{{ g_user }}"
+      zbx_password: "{{ g_password }}"
       state: list
       name: 'Template App Zabbix Server'
     register: templ_zabbix_server
 
-  - zbx_template:
-      server: "{{ g_zserver }}"
-      user: "{{ g_zuser }}"
-      password: "{{ g_zpassword }}"
+  - name: CLEAN List template app zabbix server
+    zbx_template:
+      zbx_server: "{{ g_server }}"
+      zbx_user: "{{ g_user }}"
+      zbx_password: "{{ g_password }}"
       state: list
       name: 'Template App Zabbix Agent'
     register: templ_zabbix_agent
 
-  - zbx_template:
-      server: "{{ g_zserver }}"
-      user: "{{ g_zuser }}"
-      password: "{{ g_zpassword }}"
+  - name: CLEAN List all templates
+    zbx_template:
+      zbx_server: "{{ g_server }}"
+      zbx_user: "{{ g_user }}"
+      zbx_password: "{{ g_password }}"
       state: list
     register: templates
 
   - debug: var=templ_heartbeat.results
 
-  - zbx_template:
-      server: "{{ g_zserver }}"
-      user: "{{ g_zuser }}"
-      password: "{{ g_zpassword }}"
+  - name: Remove templates if heartbeat template is missing
+    zbx_template:
+      zbx_server: "{{ g_server }}"
+      zbx_user: "{{ g_user }}"
+      zbx_password: "{{ g_password }}"
+      name: "{{ item }}"
       state: absent
     with_items: "{{ templates.results | difference(templ_zabbix_agent.results) | difference(templ_zabbix_server.results) | oo_collect('host') }}"
     when:  templ_heartbeat.results | length == 0

+ 0 - 57
playbooks/adhoc/zabbix_setup/create_template.yml

@@ -1,57 +0,0 @@
----
-- debug: var=ctp_template
-
-- name: Create Template
-  zbx_template:
-    server: "{{ ctp_zserver }}"
-    user: "{{ ctp_zuser }}"
-    password: "{{ ctp_zpassword }}"
-    name: "{{ ctp_template.name }}"
-  register: ctp_created_template
-
-- debug: var=ctp_created_template
-
-#- name: Create Application
-#  zbxapi:
-#    server: "{{ ctp_zserver }}"
-#    user: "{{ ctp_zuser }}"
-#    password: "{{ ctp_zpassword }}"
-#    zbx_class: Application
-#    state: present
-#    params:
-#      name: "{{ ctp_template.application.name}}"
-#      hostid: "{{ ctp_created_template.results[0].templateid }}"
-#      search:
-#        name: "{{ ctp_template.application.name}}"
-#  register: ctp_created_application
-
-#- debug: var=ctp_created_application
-
-- name: Create Items
-  zbx_item:
-    server: "{{ ctp_zserver }}"
-    user: "{{ ctp_zuser }}"
-    password: "{{ ctp_zpassword }}"
-    key: "{{ item.key }}"
-    name: "{{ item.name | default(item.key, true) }}"
-    value_type: "{{ item.value_type | default('int') }}"
-    template_name: "{{ ctp_template.name }}"
-  with_items: ctp_template.zitems
-  register: ctp_created_items
-
-#- debug: var=ctp_created_items
-
-- name: Create Triggers
-  zbx_trigger:
-    server: "{{ ctp_zserver }}"
-    user: "{{ ctp_zuser }}"
-    password: "{{ ctp_zpassword }}"
-    description: "{{ item.description }}"
-    expression: "{{ item.expression }}"
-    priority: "{{ item.priority }}"
-  with_items: ctp_template.ztriggers
-  when: ctp_template.ztriggers is defined
-
-#- debug: var=ctp_created_triggers
-
-

+ 0 - 31
playbooks/adhoc/zabbix_setup/create_user.yml

@@ -1,31 +0,0 @@
----
-# export PYTHONPATH='/usr/lib/python2.7/site-packages/:/home/kwoodson/git/openshift-tools'
-# ansible-playbook -e 'cli_password=zabbix' -e 'cli_new_password=new-zabbix' create_user.yml
-- hosts: localhost
-  gather_facts: no
-  vars_files:
-  - vars/template_heartbeat.yml
-  - vars/template_os_linux.yml
-  vars:
-    g_zserver: http://localhost/zabbix/api_jsonrpc.php
-    g_zuser: admin
-    g_zpassword: "{{ cli_password }}"
-  roles:
-  - ../../../roles/os_zabbix
-  post_tasks:
-  - zbx_user:
-      server: "{{ g_zserver }}"
-      user: "{{ g_zuser }}"
-      password: "{{ g_zpassword }}"
-      state: list
-    register: users
-
-  - debug: var=users
-
-  - name: Update zabbix creds for admin
-    zbx_user:
-      server: "{{ g_zserver }}"
-      user: "{{ g_zuser }}"
-      password: "{{ g_zpassword }}"
-      alias: Admin
-      passwd: "{{ cli_new_password | default(g_zpassword, true) }}"

+ 0 - 1
playbooks/adhoc/zabbix_setup/filter_plugins

@@ -1 +0,0 @@
-../../../filter_plugins

+ 0 - 1
playbooks/adhoc/zabbix_setup/roles

@@ -1 +0,0 @@
-../../../roles/

+ 0 - 38
playbooks/adhoc/zabbix_setup/setup_zabbix.yml

@@ -1,38 +0,0 @@
----
-- hosts: localhost
-  gather_facts: no
-  vars_files:
-  - vars/template_heartbeat.yml
-  - vars/template_os_linux.yml
-  vars:
-    g_zserver: http://localhost/zabbix/api_jsonrpc.php
-    g_zuser: Admin
-    g_zpassword: zabbix
-  roles:
-  - ../../../roles/os_zabbix
-  post_tasks:
-  - zbx_template:
-      server: "{{ g_zserver }}"
-      user: "{{ g_zuser }}"
-      password: "{{ g_zpassword }}"
-      state: list
-    register: templates
-
-  - debug: var=templates
-
-  - name: Include Template
-    include: create_template.yml
-    vars:
-      ctp_template: "{{ g_template_heartbeat }}"
-      ctp_zserver: "{{ g_zserver }}"
-      ctp_zuser: "{{ g_zuser }}"
-      ctp_zpassword: "{{ g_zpassword }}"
-
-  - name: Include Template
-    include: create_template.yml
-    vars:
-      ctp_template: "{{ g_template_os_linux }}"
-      ctp_zserver: "{{ g_zserver }}"
-      ctp_zuser: "{{ g_zuser }}"
-      ctp_zpassword: "{{ g_zpassword }}"
-

+ 38 - 0
roles/lib_zabbix/README.md

@@ -0,0 +1,38 @@
+zabbix
+=========
+
+Automate zabbix tasks.
+
+Requirements
+------------
+
+This requires the openshift_tools rpm be installed for the zbxapi.py library.  It can be found here: https://github.com/openshift/openshift-tools under openshift_tools/monitoring/zbxapi.py for now.
+
+Role Variables
+--------------
+
+None
+
+Dependencies
+------------
+
+This depeonds on the zbxapi.py library located here: https://github.com/openshift/openshift-tools under openshift_tools/monitoring/zbxapi.py for now.
+
+Example Playbook
+----------------
+
+  - zbx_host:
+      server: zab_server
+      user: zab_user
+      password: zab_password
+      name: 'myhost'
+
+License
+-------
+
+ASL 2.0
+
+Author Information
+------------------
+
+OpenShift operations, Red Hat, Inc

+ 3 - 0
roles/lib_zabbix/library/__init__.py

@@ -0,0 +1,3 @@
+'''
+ZabbixAPI ansible module
+'''

+ 13 - 9
roles/os_zabbix/library/zbx_application.py

@@ -59,21 +59,21 @@ def main():
 
     module = AnsibleModule(
         argument_spec=dict(
-            server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
-            user=dict(default=None, type='str'),
-            password=dict(default=None, type='str'),
+            zbx_server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
+            zbx_user=dict(default=os.environ['ZABBIX_USER'], type='str'),
+            zbx_password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),
+            zbx_debug=dict(default=False, type='bool'),
             name=dict(default=None, type='str'),
             template_name=dict(default=None, type='list'),
-            debug=dict(default=False, type='bool'),
             state=dict(default='present', type='str'),
         ),
         #supports_check_mode=True
     )
 
-    user = module.params.get('user', os.environ['ZABBIX_USER'])
-    passwd = module.params.get('password', os.environ['ZABBIX_PASSWORD'])
-
-    zapi = ZabbixAPI(ZabbixConnection(module.params['server'], user, passwd, module.params['debug']))
+    zapi = ZabbixAPI(ZabbixConnection(module.params['zbx_server'],
+                                      module.params['zbx_user'],
+                                      module.params['zbx_password'],
+                                      module.params['zbx_debug']))
 
     #Set the instance and the application for the rest of the calls
     zbx_class_name = 'application'
@@ -83,7 +83,7 @@ def main():
     # get a applicationid, see if it exists
     content = zapi.get_content(zbx_class_name,
                                'get',
-                               {'search': {'host': aname},
+                               {'search': {'name': aname},
                                 'selectHost': 'hostid',
                                })
     if state == 'list':
@@ -121,6 +121,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,

+ 8 - 8
roles/os_zabbix/library/zbx_discoveryrule.py

@@ -87,9 +87,10 @@ def main():
 
     module = AnsibleModule(
         argument_spec=dict(
-            server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
-            user=dict(default=os.environ['ZABBIX_USER'], type='str'),
-            password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),
+            zbx_server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
+            zbx_user=dict(default=os.environ['ZABBIX_USER'], type='str'),
+            zbx_password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),
+            zbx_debug=dict(default=False, type='bool'),
             name=dict(default=None, type='str'),
             key=dict(default=None, type='str'),
             interfaceid=dict(default=None, type='int'),
@@ -97,16 +98,15 @@ def main():
             delay=dict(default=60, type='int'),
             lifetime=dict(default=30, type='int'),
             template_name=dict(default=[], type='list'),
-            debug=dict(default=False, type='bool'),
             state=dict(default='present', type='str'),
         ),
         #supports_check_mode=True
     )
 
-    user = module.params['user']
-    passwd = module.params['password']
-
-    zapi = ZabbixAPI(ZabbixConnection(module.params['server'], user, passwd, module.params['debug']))
+    zapi = ZabbixAPI(ZabbixConnection(module.params['zbx_server'],
+                                      module.params['zbx_user'],
+                                      module.params['zbx_password'],
+                                      module.params['zbx_debug']))
 
     #Set the instance and the template for the rest of the calls
     zbx_class_name = 'discoveryrule'

+ 8 - 8
roles/os_zabbix/library/zbx_host.py

@@ -70,23 +70,23 @@ def main():
 
     module = AnsibleModule(
         argument_spec=dict(
-            server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
-            user=dict(default=os.environ['ZABBIX_USER'], type='str'),
-            password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),
+            zbx_server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
+            zbx_user=dict(default=os.environ['ZABBIX_USER'], type='str'),
+            zbx_password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),
+            zbx_debug=dict(default=False, type='bool'),
             name=dict(default=None, type='str'),
             hostgroup_names=dict(default=[], type='list'),
             template_names=dict(default=[], type='list'),
-            debug=dict(default=False, type='bool'),
             state=dict(default='present', type='str'),
             interfaces=dict(default=None, type='list'),
         ),
         #supports_check_mode=True
     )
 
-    user = module.params['user']
-    passwd = module.params['password']
-
-    zapi = ZabbixAPI(ZabbixConnection(module.params['server'], user, passwd, module.params['debug']))
+    zapi = ZabbixAPI(ZabbixConnection(module.params['zbx_server'],
+                                      module.params['zbx_user'],
+                                      module.params['zbx_password'],
+                                      module.params['zbx_debug']))
 
     #Set the instance and the template for the rest of the calls
     zbx_class_name = 'host'

+ 8 - 8
roles/os_zabbix/library/zbx_hostgroup.py

@@ -46,20 +46,20 @@ def main():
 
     module = AnsibleModule(
         argument_spec=dict(
-            server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
-            user=dict(default=None, type='str'),
-            password=dict(default=None, type='str'),
+            zbx_server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
+            zbx_user=dict(default=os.environ['ZABBIX_USER'], type='str'),
+            zbx_password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),
+            zbx_debug=dict(default=False, type='bool'),
             name=dict(default=None, type='str'),
-            debug=dict(default=False, type='bool'),
             state=dict(default='present', type='str'),
         ),
         #supports_check_mode=True
     )
 
-    user = module.params.get('user', os.environ['ZABBIX_USER'])
-    passwd = module.params.get('password', os.environ['ZABBIX_PASSWORD'])
-
-    zapi = ZabbixAPI(ZabbixConnection(module.params['server'], user, passwd, module.params['debug']))
+    zapi = ZabbixAPI(ZabbixConnection(module.params['zbx_server'],
+                                      module.params['zbx_user'],
+                                      module.params['zbx_password'],
+                                      module.params['zbx_debug']))
 
     #Set the instance and the template for the rest of the calls
     zbx_class_name = 'hostgroup'

+ 17 - 9
roles/os_zabbix/library/zbx_item.py

@@ -63,6 +63,8 @@ def get_value_type(value_type):
 def get_app_ids(zapi, application_names):
     ''' get application ids from names
     '''
+    if isinstance(application_names, str):
+        application_names = [application_names]
     app_ids = []
     for app_name in application_names:
         content = zapi.get_content('application', 'get', {'search': {'name': app_name}})
@@ -77,25 +79,25 @@ def main():
 
     module = AnsibleModule(
         argument_spec=dict(
-            server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
-            user=dict(default=None, type='str'),
-            password=dict(default=None, type='str'),
+            zbx_server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
+            zbx_user=dict(default=os.environ['ZABBIX_USER'], type='str'),
+            zbx_password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),
+            zbx_debug=dict(default=False, type='bool'),
             name=dict(default=None, type='str'),
             key=dict(default=None, type='str'),
             template_name=dict(default=None, type='str'),
             zabbix_type=dict(default=2, type='int'),
             value_type=dict(default='int', type='str'),
             applications=dict(default=[], type='list'),
-            debug=dict(default=False, type='bool'),
             state=dict(default='present', type='str'),
         ),
         #supports_check_mode=True
     )
 
-    user = module.params.get('user', os.environ['ZABBIX_USER'])
-    passwd = module.params.get('password', os.environ['ZABBIX_PASSWORD'])
-
-    zapi = ZabbixAPI(ZabbixConnection(module.params['server'], user, passwd, module.params['debug']))
+    zapi = ZabbixAPI(ZabbixConnection(module.params['zbx_server'],
+                                      module.params['zbx_user'],
+                                      module.params['zbx_password'],
+                                      module.params['zbx_debug']))
 
     #Set the instance and the template for the rest of the calls
     zbx_class_name = 'item'
@@ -118,6 +120,7 @@ def main():
                                {'search': {'key_': key},
                                 'selectApplications': 'applicationid',
                                })
+
     if state == 'list':
         module.exit_json(changed=False, results=content['result'], state="list")
 
@@ -147,7 +150,12 @@ def main():
         zab_results = content['result'][0]
         for key, value in params.items():
 
-            if zab_results[key] != value and zab_results[key] != str(value):
+            if key == 'applications':
+                zab_apps = set([item['applicationid'] for item in zab_results[key]])
+                if zab_apps != set(value):
+                    differences[key] = zab_apps
+
+            elif zab_results[key] != value and zab_results[key] != str(value):
                 differences[key] = value
 
         if not differences:

+ 8 - 8
roles/os_zabbix/library/zbx_itemprototype.py

@@ -141,9 +141,10 @@ def main():
 
     module = AnsibleModule(
         argument_spec=dict(
-            server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
-            user=dict(default=os.environ['ZABBIX_USER'], type='str'),
-            password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),
+            zbx_server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
+            zbx_user=dict(default=os.environ['ZABBIX_USER'], type='str'),
+            zbx_password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),
+            zbx_debug=dict(default=False, type='bool'),
             name=dict(default=None, type='str'),
             key=dict(default=None, type='str'),
             interfaceid=dict(default=None, type='int'),
@@ -152,7 +153,6 @@ def main():
             delay=dict(default=60, type='int'),
             lifetime=dict(default=30, type='int'),
             template_name=dict(default=[], type='list'),
-            debug=dict(default=False, type='bool'),
             state=dict(default='present', type='str'),
             status=dict(default='enabled', type='str'),
             discoveryrule_name=dict(default=None, type='str'),
@@ -161,10 +161,10 @@ def main():
         #supports_check_mode=True
     )
 
-    user = module.params['user']
-    passwd = module.params['password']
-
-    zapi = ZabbixAPI(ZabbixConnection(module.params['server'], user, passwd, module.params['debug']))
+    zapi = ZabbixAPI(ZabbixConnection(module.params['zbx_server'],
+                                      module.params['zbx_user'],
+                                      module.params['zbx_password'],
+                                      module.params['zbx_debug']))
 
     #Set the instance and the template for the rest of the calls
     zbx_class_name = 'itemprototype'

+ 28 - 9
roles/os_zabbix/library/zbx_mediatype.py

@@ -40,6 +40,7 @@ def exists(content, key='result'):
         return False
 
     return True
+
 def get_mtype(mtype):
     '''
     Transport used by the media type.
@@ -72,24 +73,28 @@ def main():
 
     module = AnsibleModule(
         argument_spec=dict(
-            server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
-            user=dict(default=None, type='str'),
-            password=dict(default=None, type='str'),
+            zbx_server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
+            zbx_user=dict(default=os.environ['ZABBIX_USER'], type='str'),
+            zbx_password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),
+            zbx_debug=dict(default=False, type='bool'),
             description=dict(default=None, type='str'),
             mtype=dict(default=None, type='str'),
             smtp_server=dict(default=None, type='str'),
             smtp_helo=dict(default=None, type='str'),
             smtp_email=dict(default=None, type='str'),
-            debug=dict(default=False, type='bool'),
+            passwd=dict(default=None, type='str'),
+            path=dict(default=None, type='str'),
+            username=dict(default=None, type='str'),
+            status=dict(default='enabled', type='str'),
             state=dict(default='present', type='str'),
         ),
         #supports_check_mode=True
     )
 
-    user = module.params.get('user', os.environ['ZABBIX_USER'])
-    passwd = module.params.get('password', os.environ['ZABBIX_PASSWORD'])
-
-    zapi = ZabbixAPI(ZabbixConnection(module.params['server'], user, passwd, module.params['debug']))
+    zapi = ZabbixAPI(ZabbixConnection(module.params['zbx_server'],
+                                      module.params['zbx_user'],
+                                      module.params['zbx_password'],
+                                      module.params['zbx_debug']))
 
     #Set the instance and the template for the rest of the calls
     zbx_class_name = 'mediatype'
@@ -109,16 +114,30 @@ def main():
         module.exit_json(changed=True, results=content['result'], state="absent")
 
     if state == 'present':
+        status = 1
+        if module.params['status']:
+            status = 0
         params = {'description': description,
-                  'type': get_mtype(module.params['media_type']),
+                  'type': get_mtype(module.params['mtype']),
                   'smtp_server': module.params['smtp_server'],
                   'smtp_helo': module.params['smtp_helo'],
                   'smtp_email': module.params['smtp_email'],
+                  'passwd': module.params['passwd'],
+                  'exec_path': module.params['path'],
+                  'username': module.params['username'],
+                  'status': status,
                  }
 
+        # Remove any None valued params
+        _ = [params.pop(key, None) for key in params.keys() if params[key] is None]
+
         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=False, 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

+ 14 - 9
roles/os_zabbix/library/zbx_template.py

@@ -47,21 +47,20 @@ def main():
 
     module = AnsibleModule(
         argument_spec=dict(
-            server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
-            user=dict(default=None, type='str'),
-            password=dict(default=None, type='str'),
+            zbx_server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
+            zbx_user=dict(default=os.environ['ZABBIX_USER'], type='str'),
+            zbx_password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),
+            zbx_debug=dict(default=False, type='bool'),
             name=dict(default=None, type='str'),
-            debug=dict(default=False, type='bool'),
             state=dict(default='present', type='str'),
         ),
         #supports_check_mode=True
     )
 
-    user = module.params.get('user', os.environ['ZABBIX_USER'])
-    passwd = module.params.get('password', os.environ['ZABBIX_PASSWORD'])
-
-    zbc = ZabbixConnection(module.params['server'], user, passwd, module.params['debug'])
-    zapi = ZabbixAPI(zbc)
+    zapi = ZabbixAPI(ZabbixConnection(module.params['zbx_server'],
+                                      module.params['zbx_user'],
+                                      module.params['zbx_password'],
+                                      module.params['zbx_debug']))
 
     #Set the instance and the template for the rest of the calls
     zbx_class_name = 'template'
@@ -84,6 +83,12 @@ def main():
         if not exists(content):
             module.exit_json(changed=False, state="absent")
 
+        if not tname:
+            module.exit_json(failed=True,
+                             changed=False,
+                             results='Must specifiy a template name.',
+                             state="absent")
+
         content = zapi.get_content(zbx_class_name, 'delete', [content['result'][0][idname]])
         module.exit_json(changed=True, results=content['result'], state="absent")
 

+ 8 - 10
roles/os_zabbix/library/zbx_trigger.py

@@ -41,7 +41,6 @@ def exists(content, key='result'):
 
     return True
 
-
 def get_priority(priority):
     ''' determine priority
     '''
@@ -94,24 +93,23 @@ def main():
 
     module = AnsibleModule(
         argument_spec=dict(
-            server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
-            user=dict(default=None, type='str'),
-            password=dict(default=None, type='str'),
+            zbx_server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
+            zbx_user=dict(default=os.environ['ZABBIX_USER'], type='str'),
+            zbx_password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),
+            zbx_debug=dict(default=False, type='bool'),
             expression=dict(default=None, type='str'),
             description=dict(default=None, type='str'),
             dependencies=dict(default=[], type='list'),
             priority=dict(default='avg', type='str'),
-            debug=dict(default=False, type='bool'),
             state=dict(default='present', type='str'),
         ),
         #supports_check_mode=True
     )
 
-    user = module.params.get('user', os.environ['ZABBIX_USER'])
-    passwd = module.params.get('password', os.environ['ZABBIX_PASSWORD'])
-
-
-    zapi = ZabbixAPI(ZabbixConnection(module.params['server'], user, passwd, module.params['debug']))
+    zapi = ZabbixAPI(ZabbixConnection(module.params['zbx_server'],
+                                      module.params['zbx_user'],
+                                      module.params['zbx_password'],
+                                      module.params['zbx_debug']))
 
     #Set the instance and the template for the rest of the calls
     zbx_class_name = 'trigger'

+ 44 - 23
roles/os_zabbix/library/zbx_user.py

@@ -56,6 +56,14 @@ def get_usergroups(zapi, usergroups):
 
     return ugroups or None
 
+def get_passwd(passwd):
+    '''Determine if password is set, if not, return 'zabbix'
+    '''
+    if passwd:
+        return passwd
+
+    return 'zabbix'
+
 def get_usertype(user_type):
     '''
     Determine zabbix user account type
@@ -80,54 +88,55 @@ def main():
 
     module = AnsibleModule(
         argument_spec=dict(
-            server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
-            user=dict(default=None, type='str'),
-            password=dict(default=None, type='str'),
-            alias=dict(default=None, type='str'),
-            name=dict(default=None, type='str'),
-            surname=dict(default=None, type='str'),
+            zbx_server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
+            zbx_user=dict(default=os.environ['ZABBIX_USER'], type='str'),
+            zbx_password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),
+            zbx_debug=dict(default=False, type='bool'),
+            login=dict(default=None, type='str'),
+            first_name=dict(default=None, type='str'),
+            last_name=dict(default=None, type='str'),
             user_type=dict(default=None, type='str'),
-            passwd=dict(default=None, type='str'),
-            usergroups=dict(default=[], type='list'),
-            debug=dict(default=False, type='bool'),
+            password=dict(default=None, type='str'),
+            update_password=dict(default=False, type='bool'),
+            user_groups=dict(default=[], type='list'),
             state=dict(default='present', type='str'),
         ),
         #supports_check_mode=True
     )
 
-    user = module.params.get('user', os.environ['ZABBIX_USER'])
-    password = module.params.get('password', os.environ['ZABBIX_PASSWORD'])
-
-    zapi = ZabbixAPI(ZabbixConnection(module.params['server'], user, password, module.params['debug']))
+    zapi = ZabbixAPI(ZabbixConnection(module.params['zbx_server'],
+                                      module.params['zbx_user'],
+                                      module.params['zbx_password'],
+                                      module.params['zbx_debug']))
 
     ## before we can create a user media and users with media types we need media
     zbx_class_name = 'user'
     idname = "userid"
-    alias = module.params['alias']
     state = module.params['state']
 
     content = zapi.get_content(zbx_class_name,
                                'get',
                                {'output': 'extend',
-                                'search': {'alias': alias},
+                                'search': {'alias': module.params['login']},
                                 "selectUsrgrps": 'usergrpid',
                                })
     if state == 'list':
         module.exit_json(changed=False, results=content['result'], state="list")
 
     if state == 'absent':
-        if not exists(content):
+        if not exists(content) or len(content['result']) == 0:
             module.exit_json(changed=False, state="absent")
 
         content = zapi.get_content(zbx_class_name, 'delete', [content['result'][0][idname]])
         module.exit_json(changed=True, results=content['result'], state="absent")
 
     if state == 'present':
-        params = {'alias': alias,
-                  'passwd': module.params['passwd'],
-                  'usrgrps': get_usergroups(zapi, module.params['usergroups']),
-                  'name': module.params['name'],
-                  'surname': module.params['surname'],
+
+        params = {'alias': module.params['login'],
+                  'passwd': get_passwd(module.params['password']),
+                  'usrgrps': get_usergroups(zapi, module.params['user_groups']),
+                  'name': module.params['first_name'],
+                  'surname': module.params['last_name'],
                   'type': get_usertype(module.params['user_type']),
                  }
 
@@ -137,14 +146,26 @@ def main():
         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=False, results=content, state='present')
+
             module.exit_json(changed=True, results=content['result'], state='present')
         # already exists, we need to update it
         # let's compare properties
         differences = {}
+
+        # Update password
+        if not module.params['update_password']:
+            params.pop('passwd', None)
+
         zab_results = content['result'][0]
         for key, value in params.items():
-            if key == 'passwd':
-                differences[key] = value
+
+            if key == 'usrgrps':
+                # this must be done as a list of ordered dictionaries fails comparison
+                if not all([True for _ in zab_results[key][0] if _ in value[0]]):
+                    differences[key] = value
 
             elif zab_results[key] != value and zab_results[key] != str(value):
                 differences[key] = value

+ 245 - 0
roles/lib_zabbix/library/zbx_user_media.py

@@ -0,0 +1,245 @@
+#!/usr/bin/env python
+'''
+ Ansible module for user media
+'''
+# vim: expandtab:tabstop=4:shiftwidth=4
+#
+#   Zabbix user media  ansible module
+#
+#
+#   Copyright 2015 Red Hat Inc.
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+#
+
+# This is in place because each module looks similar to each other.
+# These need duplicate code as their behavior is very similar
+# but different for each zabbix class.
+# pylint: disable=duplicate-code
+
+# pylint: disable=import-error
+from openshift_tools.monitoring.zbxapi import ZabbixAPI, ZabbixConnection
+
+def exists(content, key='result'):
+    ''' Check if key exists in content or the size of content[key] > 0
+    '''
+    if not content.has_key(key):
+        return False
+
+    if not content[key]:
+        return False
+
+    return True
+
+def get_mtype(zapi, mtype):
+    '''Get mediatype
+
+       If passed an int, return it as the mediatypeid
+       if its a string, then try to fetch through a description
+    '''
+    if isinstance(mtype, int):
+        return mtype
+    try:
+        return int(mtype)
+    except ValueError:
+        pass
+
+    content = zapi.get_content('mediatype', 'get', {'search': {'description': mtype}})
+    if content.has_key['result'] and content['result']:
+        return content['result'][0]['mediatypeid']
+
+    return None
+
+def get_user(zapi, user):
+    ''' Get userids from user aliases
+    '''
+    content = zapi.get_content('user', 'get', {'search': {'alias': user}})
+    if content['result']:
+        return content['result'][0]
+
+    return None
+
+def get_severity(severity):
+    ''' determine severity
+    '''
+    if isinstance(severity, int) or \
+       isinstance(severity, str):
+        return severity
+
+    val = 0
+    sev_map = {
+        'not': 2**0,
+        'inf': 2**1,
+        'war': 2**2,
+        'ave':  2**3,
+        'avg':  2**3,
+        'hig': 2**4,
+        'dis': 2**5,
+    }
+    for level in severity:
+        val |= sev_map[level[:3].lower()]
+    return val
+
+def get_zbx_user_query_data(zapi, user_name):
+    ''' If name exists, retrieve it, and build query params.
+    '''
+    query = {}
+    if user_name:
+        zbx_user = get_user(zapi, user_name)
+        query = {'userid': zbx_user['userid']}
+
+    return query
+
+def find_media(medias, user_media):
+    ''' Find the user media in the list of medias
+    '''
+    for media in medias:
+        if all([media[key] == user_media[key] for key in user_media.keys()]):
+            return media
+    return None
+
+def get_active(in_active):
+    '''Determine active value
+    '''
+    active = 1
+    if in_active:
+        active = 0
+
+    return active
+
+def get_mediatype(zapi, mediatype, mediatype_desc):
+    ''' Determine mediatypeid
+    '''
+    mtypeid = None
+    if mediatype:
+        mtypeid = get_mtype(zapi, mediatype)
+    elif mediatype_desc:
+        mtypeid = get_mtype(zapi, mediatype_desc)
+
+    return mtypeid
+
+def main():
+    '''
+    Ansible zabbix module for mediatype
+    '''
+
+    module = AnsibleModule(
+        argument_spec=dict(
+            zbx_server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
+            zbx_user=dict(default=os.environ['ZABBIX_USER'], type='str'),
+            zbx_password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),
+            zbx_debug=dict(default=False, type='bool'),
+            login=dict(default=None, type='str'),
+            active=dict(default=False, type='bool'),
+            medias=dict(default=None, type='list'),
+            mediaid=dict(default=None, type='int'),
+            mediatype=dict(default=None, type='str'),
+            mediatype_desc=dict(default=None, type='str'),
+            #d-d,hh:mm-hh:mm;d-d,hh:mm-hh:mm...
+            period=dict(default=None, type='str'),
+            sendto=dict(default=None, type='str'),
+            severity=dict(default=None, type='str'),
+            state=dict(default='present', type='str'),
+        ),
+        #supports_check_mode=True
+    )
+
+    zapi = ZabbixAPI(ZabbixConnection(module.params['zbx_server'],
+                                      module.params['zbx_user'],
+                                      module.params['zbx_password'],
+                                      module.params['zbx_debug']))
+
+    #Set the instance and the template for the rest of the calls
+    zbx_class_name = 'user'
+    idname = "mediaid"
+    state = module.params['state']
+
+    # User media is fetched through the usermedia.get
+    zbx_user_query = get_zbx_user_query_data(zapi, module.params['login'])
+    content = zapi.get_content('usermedia', 'get', zbx_user_query)
+
+    if state == 'list':
+        module.exit_json(changed=False, results=content['result'], state="list")
+
+    if state == 'absent':
+        if not exists(content) or len(content['result']) == 0:
+            module.exit_json(changed=False, state="absent")
+
+        if not module.params['login']:
+            module.exit_json(failed=True, changed=False, results='Must specifiy a user login.', state="absent")
+
+        content = zapi.get_content(zbx_class_name, 'deletemedia', [content['result'][0][idname]])
+
+        if content.has_key('error'):
+            module.exit_json(changed=False, results=content['error'], state="absent")
+
+        module.exit_json(changed=True, results=content['result'], state="absent")
+
+    if state == 'present':
+        active = get_active(module.params['active'])
+        mtypeid = get_mediatype(zapi, module.params['mediatype'], module.params['mediatype_desc'])
+
+        medias = module.params['medias']
+        if medias == None:
+            medias = [{'mediatypeid': mtypeid,
+                       'sendto': module.params['sendto'],
+                       'active': active,
+                       'severity': int(get_severity(module.params['severity'])),
+                       'period': module.params['period'],
+                      }]
+
+        params = {'users': [zbx_user_query],
+                  'medias': medias,
+                  'output': 'extend',
+                 }
+
+        if not exists(content):
+            # if we didn't find it, create it
+            content = zapi.get_content(zbx_class_name, 'addmedia', params)
+
+            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')
+
+        # mediaid signifies an update
+        # If user params exists, check to see if they already exist in zabbix
+        # if they exist, then return as no update
+        # elif they do not exist, then take user params only
+        diff = {'medias': [], 'users': {}}
+        _ = [diff['medias'].append(media) for media in params['medias'] if not find_media(content['result'], media)]
+
+        if not diff['medias']:
+            module.exit_json(changed=False, results=content['result'], state="present")
+
+        for user in params['users']:
+            diff['users']['userid'] = user['userid']
+
+        # We have differences and need to update
+        content = zapi.get_content(zbx_class_name, 'updatemedia', diff)
+
+        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,
+                     changed=False,
+                     results='Unknown state passed. %s' % state,
+                     state="unknown")
+
+# pylint: disable=redefined-builtin, unused-wildcard-import, wildcard-import, locally-disabled
+# import module snippets.  This are required
+from ansible.module_utils.basic import *
+
+main()

+ 71 - 23
roles/os_zabbix/library/zbx_usergroup.py

@@ -44,6 +44,9 @@ def exists(content, key='result'):
 def get_rights(zapi, rights):
     '''Get rights
     '''
+    if rights == None:
+        return None
+
     perms = []
     for right in rights:
         hstgrp = right.keys()[0]
@@ -59,16 +62,49 @@ def get_rights(zapi, rights):
                           'permission': permission})
     return perms
 
-def get_userids(zapi, users):
-    ''' Get userids from user aliases
+def get_gui_access(access):
+    ''' Return the gui_access for a usergroup
     '''
-    userids = []
-    for alias in users:
-        content = zapi.get_content('user', 'get', {'search': {'alias': alias}})
-        if content['result']:
-            userids.append(content['result'][0]['userid'])
+    access = access.lower()
+    if access == 'internal':
+        return 1
+    elif access == 'disabled':
+        return 2
+
+    return 0
+
+def get_debug_mode(mode):
+    ''' Return the debug_mode for a usergroup
+    '''
+    mode = mode.lower()
+    if mode == 'enabled':
+        return 1
+
+    return 0
+
+def get_user_status(status):
+    ''' Return the user_status for a usergroup
+    '''
+    status = status.lower()
+    if status == 'enabled':
+        return 0
 
-    return userids
+    return 1
+
+
+#def get_userids(zapi, users):
+#    ''' Get userids from user aliases
+#    '''
+#    if not users:
+#        return None
+#
+#    userids = []
+#    for alias in users:
+#        content = zapi.get_content('user', 'get', {'search': {'alias': alias}})
+#        if content['result']:
+#            userids.append(content['result'][0]['userid'])
+#
+#    return userids
 
 def main():
     ''' Ansible module for usergroup
@@ -78,22 +114,25 @@ def main():
 
     module = AnsibleModule(
         argument_spec=dict(
-            server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
-            user=dict(default=None, type='str'),
-            password=dict(default=None, type='str'),
-            name=dict(default=None, type='str'),
-            rights=dict(default=[], type='list'),
-            users=dict(default=[], type='list'),
-            debug=dict(default=False, type='bool'),
+            zbx_server=dict(default='https://localhost/zabbix/api_jsonrpc.php', type='str'),
+            zbx_user=dict(default=os.environ.get('ZABBIX_USER', None), type='str'),
+            zbx_password=dict(default=os.environ.get('ZABBIX_PASSWORD', None), type='str'),
+            zbx_debug=dict(default=False, type='bool'),
+            debug_mode=dict(default='disabled', type='str'),
+            gui_access=dict(default='default', type='str'),
+            status=dict(default='enabled', type='str'),
+            name=dict(default=None, type='str', required=True),
+            rights=dict(default=None, type='list'),
+            #users=dict(default=None, type='list'),
             state=dict(default='present', type='str'),
         ),
         #supports_check_mode=True
     )
 
-    user = module.params.get('user', os.environ['ZABBIX_USER'])
-    passwd = module.params.get('password', os.environ['ZABBIX_PASSWORD'])
-
-    zapi = ZabbixAPI(ZabbixConnection(module.params['server'], user, passwd, module.params['debug']))
+    zapi = ZabbixAPI(ZabbixConnection(module.params['zbx_server'],
+                                      module.params['zbx_user'],
+                                      module.params['zbx_password'],
+                                      module.params['zbx_debug']))
 
     zbx_class_name = 'usergroup'
     idname = "usrgrpid"
@@ -112,15 +151,24 @@ def main():
         if not exists(content):
             module.exit_json(changed=False, state="absent")
 
+        if not uname:
+            module.exit_json(failed=True, changed=False, results='Need to pass in a user.', state="error")
+
         content = zapi.get_content(zbx_class_name, 'delete', [content['result'][0][idname]])
         module.exit_json(changed=True, results=content['result'], state="absent")
 
     if state == 'present':
+
         params = {'name': uname,
                   'rights': get_rights(zapi, module.params['rights']),
-                  'userids': get_userids(zapi, module.params['users']),
+                  'users_status': get_user_status(module.params['status']),
+                  'gui_access': get_gui_access(module.params['gui_access']),
+                  'debug_mode': get_debug_mode(module.params['debug_mode']),
+                  #'userids': get_userids(zapi, module.params['users']),
                  }
 
+        _ = [params.pop(key, None) for key in params.keys() if params[key] == None]
+
         if not exists(content):
             # if we didn't find it, create it
             content = zapi.get_content(zbx_class_name, 'create', params)
@@ -133,9 +181,9 @@ def main():
             if key == 'rights':
                 differences['rights'] = value
 
-            elif key == 'userids' and zab_results.has_key('users'):
-                if zab_results['users'] != value:
-                    differences['userids'] = value
+            #elif key == 'userids' and zab_results.has_key('users'):
+                #if zab_results['users'] != value:
+                    #differences['userids'] = value
 
             elif zab_results[key] != value and zab_results[key] != str(value):
                 differences[key] = value

+ 61 - 0
roles/lib_zabbix/tasks/create_template.yml

@@ -0,0 +1,61 @@
+---
+- debug: var=template
+
+- name: Template Create Template
+  zbx_template:
+    zbx_server: "{{ server }}"
+    zbx_user: "{{ user }}"
+    zbx_password: "{{ password }}"
+    name: "{{ template.name }}"
+  register: created_template
+
+- debug: var=created_template
+
+- set_fact:
+    lzbx_applications: "{{ template.zitems | oo_select_keys_from_list(['applications']) | oo_flatten | unique }}"
+
+- debug: var=lzbx_applications
+
+- name: Create Application
+  zbx_application:
+    zbx_server: "{{ server }}"
+    zbx_user: "{{ user }}"
+    zbx_password: "{{ password }}"
+    name: "{{ item }}"
+    template_name: "{{ template.name }}"
+  with_items: lzbx_applications
+  register: created_application
+  when: template.zitems is defined
+
+- debug: var=created_application
+
+- name: Create Items
+  zbx_item:
+    zbx_server: "{{ server }}"
+    zbx_user: "{{ user }}"
+    zbx_password: "{{ password }}"
+    key: "{{ item.key }}"
+    name: "{{ item.name | default(item.key, true) }}"
+    value_type: "{{ item.value_type | default('int') }}"
+    template_name: "{{ template.name }}"
+    applications: "{{ item.applications }}"
+  with_items: template.zitems
+  register: created_items
+  when: template.zitems is defined
+
+#- debug: var=ctp_created_items
+
+- name: Create Triggers
+  zbx_trigger:
+    zbx_server: "{{ server }}"
+    zbx_user: "{{ user }}"
+    zbx_password: "{{ password }}"
+    description: "{{ item.description }}"
+    expression: "{{ item.expression }}"
+    priority: "{{ item.priority }}"
+  with_items: template.ztriggers
+  when: template.ztriggers is defined
+
+#- debug: var=ctp_created_triggers
+
+

+ 11 - 0
roles/lib_zabbix/tasks/create_user.yml

@@ -0,0 +1,11 @@
+---
+- name: Update zabbix credentialss for a user
+  zbx_user:
+    server: "{{ ozb_server }}"
+    user: "{{ ozb_user }}"
+    password: "{{ ozb_password }}"
+    alias: "{{ ozb_username }}"
+    passwd: "{{ ozb_new_password | default(ozb_password, true) }}"
+  register: user
+
+- debug: var=user.results

+ 40 - 0
roles/os_zabbix/README.md

@@ -0,0 +1,40 @@
+os_zabbix
+=========
+
+Automate zabbix tasks.
+
+Requirements
+------------
+
+This requires the openshift_tools rpm be installed for the zbxapi.py library.  It can be found here: https://github.com/openshift/openshift-tools under openshift_tools/monitoring/zbxapi.py for now.
+
+Role Variables
+--------------
+
+zab_server
+zab_username
+zab_password
+
+Dependencies
+------------
+
+This depeonds on the zbxapi.py library located here: https://github.com/openshift/openshift-tools under openshift_tools/monitoring/zbxapi.py for now.
+
+Example Playbook
+----------------
+
+  - zbx_host:
+      server: zab_server
+      user: zab_user
+      password: zab_password
+      name: 'myhost'
+
+License
+-------
+
+ASL 2.0
+
+Author Information
+------------------
+
+OpenShift operations, Red Hat, Inc

+ 1 - 0
roles/os_zabbix/defaults/main.yml

@@ -0,0 +1 @@
+---

+ 1 - 0
roles/os_zabbix/handlers/main.yml

@@ -0,0 +1 @@
+---

+ 0 - 0
roles/os_zabbix/library/__init__.py


+ 0 - 115
roles/os_zabbix/library/get_drule.yml

@@ -1,115 +0,0 @@
----
-# This is a test playbook to create one of each of the zabbix ansible modules.
-# ensure that the zbxapi module is installed
-# ansible-playbook test.yml
-- name: Test zabbix ansible module
-  hosts: localhost
-  gather_facts: no
-  vars:
-#zbx_server: https://localhost/zabbix/api_jsonrpc.php
-#zbx_user: Admin
-#zbx_password: zabbix
-
-  pre_tasks:
-  - name: Template Discovery rules
-    zbx_template:
-      server: "{{ zbx_server }}"
-      user: "{{ zbx_user }}"
-      password: "{{ zbx_password }}"
-      name: 'Template App HaProxy'
-      state: list
-    register: template_output
-
-  - debug: var=template_output
-
-  - name: Discovery rules
-    zbx_discovery_rule:
-      server: "{{ zbx_server }}"
-      user: "{{ zbx_user }}"
-      password: "{{ zbx_password }}"
-      name: 'haproxy.discovery sender'
-      state: list
-    register: drule
-
-  - debug: var=drule
-
-#  - name: Create an application
-#    zbx_application:
-#      server: "{{ zbx_server }}"
-#      user: "{{ zbx_user }}"
-#      password: "{{ zbx_password }}"
-#      name: 'Test App'
-#      template_name: "test template"
-#    register: item_output
-#
-#  - name: Create an item
-#    zbx_item:
-#      server: "{{ zbx_server }}"
-#      user: "{{ zbx_user }}"
-#      password: "{{ zbx_password }}"
-#      name: 'test item'
-#      key: 'kenny.item.1'
-#      applications:
-#      - 'Test App'
-#      template_name: "test template"
-#    register: item_output
-#
-#  - debug: var=item_output
-#
-#  - name: Create an trigger
-#    zbx_trigger:
-#      server: "{{ zbx_server }}"
-#      user: "{{ zbx_user }}"
-#      password: "{{ zbx_password }}"
-#      expression: '{test template:kenny.item.1.last()}>2'
-#      description: 'Kenny desc'
-#    register: trigger_output
-#
-#  - debug: var=trigger_output
-#
-#  - name: Create a hostgroup
-#    zbx_hostgroup:
-#      server: "{{ zbx_server }}"
-#      user: "{{ zbx_user }}"
-#      password: "{{ zbx_password }}"
-#      name: 'kenny hostgroup'
-#    register: hostgroup_output
-#
-#  - debug: var=hostgroup_output
-#
-#  - name: Create a host
-#    zbx_host:
-#      server: "{{ zbx_server }}"
-#      user: "{{ zbx_user }}"
-#      password: "{{ zbx_password }}"
-#      name: 'kenny host'
-#      template_names:
-#      - test template
-#      hostgroup_names:
-#      - kenny hostgroup
-#    register: host_output
-#
-#  - debug: var=host_output
-#
-#  - name: Create a usergroup
-#    zbx_usergroup:
-#      server: "{{ zbx_server }}"
-#      user: "{{ zbx_user }}"
-#      password: "{{ zbx_password }}"
-#      name: kenny usergroup
-#      rights:
-#      - 'kenny hostgroup': rw
-#    register: usergroup_output
-#
-#  - debug: var=usergroup_output
-#
-#  - name: Create a user
-#    zbx_user:
-#      server: "{{ zbx_server }}"
-#      user: "{{ zbx_user }}"
-#      password: "{{ zbx_password }}"
-#      alias: kwoodson
-#      state: list
-#    register: user_output
-#
-#  - debug: var=user_output

+ 0 - 131
roles/os_zabbix/library/test.yml

@@ -1,131 +0,0 @@
----
-# This is a test playbook to create one of each of the zabbix ansible modules.
-# ensure that the zbxapi module is installed
-# ansible-playbook test.yml
-- name: Test zabbix ansible module
-  hosts: localhost
-  gather_facts: no
-  vars:
-    zbx_server: http://localhost:8080/zabbix/api_jsonrpc.php
-    zbx_user: Admin
-    zbx_password: zabbix
-
-  pre_tasks:
-  - name: Create a template
-    zbx_template:
-      server: "{{ zbx_server }}"
-      user: "{{ zbx_user }}"
-      password: "{{ zbx_password }}"
-      name: 'test template'
-    register: template_output
-
-  - debug: var=template_output
-
-  - name: Create a discoveryrule
-    zbx_discoveryrule:
-      server: "{{ zbx_server }}"
-      user: "{{ zbx_user }}"
-      password: "{{ zbx_password }}"
-      name: test discoverule
-      key: test_listener
-      template_name: test template
-      lifetime: 14
-    register: discoveryrule
-
-  - debug: var=discoveryrule
-
-  - name: Create an itemprototype
-    zbx_itemprototype:
-      server: "{{ zbx_server }}"
-      user: "{{ zbx_user }}"
-      password: "{{ zbx_password }}"
-      name: 'Test itemprototype on {#TEST_LISTENER}'
-      key: 'test[{#TEST_LISTENER}]'
-      template_name: test template
-      discoveryrule_name: test discoverule
-    register: itemproto
-
-  - debug: var=itemproto
-
-  - name: Create an application
-    zbx_application:
-      server: "{{ zbx_server }}"
-      user: "{{ zbx_user }}"
-      password: "{{ zbx_password }}"
-      name: 'Test App'
-      template_name: "test template"
-    register: item_output
-
-  - name: Create an item
-    zbx_item:
-      server: "{{ zbx_server }}"
-      user: "{{ zbx_user }}"
-      password: "{{ zbx_password }}"
-      name: 'test item'
-      key: 'kenny.item.1'
-      applications:
-      - 'Test App'
-      template_name: "test template"
-    register: item_output
-
-  - debug: var=item_output
-
-  - name: Create an trigger
-    zbx_trigger:
-      server: "{{ zbx_server }}"
-      user: "{{ zbx_user }}"
-      password: "{{ zbx_password }}"
-      expression: '{test template:kenny.item.1.last()}>2'
-      description: 'Kenny desc'
-    register: trigger_output
-
-  - debug: var=trigger_output
-
-  - name: Create a hostgroup
-    zbx_hostgroup:
-      server: "{{ zbx_server }}"
-      user: "{{ zbx_user }}"
-      password: "{{ zbx_password }}"
-      name: 'kenny hostgroup'
-    register: hostgroup_output
-
-  - debug: var=hostgroup_output
-
-  - name: Create a host
-    zbx_host:
-      server: "{{ zbx_server }}"
-      user: "{{ zbx_user }}"
-      password: "{{ zbx_password }}"
-      name: 'kenny host'
-      template_names:
-      - test template
-      hostgroup_names:
-      - kenny hostgroup
-    register: host_output
-
-  - debug: var=host_output
-
-  - name: Create a usergroup
-    zbx_usergroup:
-      server: "{{ zbx_server }}"
-      user: "{{ zbx_user }}"
-      password: "{{ zbx_password }}"
-      name: kenny usergroup
-      rights:
-      - 'kenny hostgroup': rw
-    register: usergroup_output
-
-  - debug: var=usergroup_output
-
-  - name: Create a user
-    zbx_user:
-      server: "{{ zbx_server }}"
-      user: "{{ zbx_user }}"
-      password: "{{ zbx_password }}"
-      alias: kenny user
-      passwd: zabbix
-      usergroups:
-      - kenny usergroup
-    register: user_output
-
-  - debug: var=user_output

+ 9 - 0
roles/os_zabbix/meta/main.yml

@@ -0,0 +1,9 @@
+---
+galaxy_info:
+  author: OpenShift
+  description:  ZabbixAPI
+  company: Red Hat, Inc
+  license: ASL 2.0
+  min_ansible_version: 1.2
+dependencies:
+- lib_zabbix

+ 30 - 0
roles/os_zabbix/tasks/main.yml

@@ -0,0 +1,30 @@
+---
+- name: Main List all templates
+  zbx_template:
+    zbx_server: "{{ ozb_server }}"
+    zbx_user: "{{ ozb_user }}"
+    zbx_password: "{{ ozb_password }}"
+    state: list
+  register: templates
+
+- debug: var=templates
+
+- include_vars: template_heartbeat.yml
+- include_vars: template_os_linux.yml
+
+- name: Include Template Heartbeat
+  include: ../../lib_zabbix/tasks/create_template.yml
+  vars:
+    template: "{{ g_template_heartbeat }}"
+    server: "{{ ozb_server }}"
+    user: "{{ ozb_user }}"
+    password: "{{ ozb_password }}"
+
+- name: Include Template os_linux
+  include: ../../lib_zabbix/tasks/create_template.yml
+  vars:
+    template: "{{ g_template_os_linux }}"
+    server: "{{ ozb_server }}"
+    user: "{{ ozb_user }}"
+    password: "{{ ozb_password }}"
+

+ 1 - 0
roles/os_zabbix/vars/main.yml

@@ -0,0 +1 @@
+---

+ 2 - 1
playbooks/adhoc/zabbix_setup/vars/template_heartbeat.yml

@@ -3,7 +3,8 @@ g_template_heartbeat:
   name: Template Heartbeat
   zitems:
   - name: Heartbeat Ping
-    hostid:
+    applications:
+    - Heartbeat
     key: heartbeat.ping
   ztriggers:
   - description: 'Heartbeat.ping has failed on {HOST.NAME}'

playbooks/adhoc/zabbix_setup/vars/template_host.yml → roles/os_zabbix/vars/template_host.yml


playbooks/adhoc/zabbix_setup/vars/template_master.yml → roles/os_zabbix/vars/template_master.yml


playbooks/adhoc/zabbix_setup/vars/template_node.yml → roles/os_zabbix/vars/template_node.yml


+ 83 - 0
playbooks/adhoc/zabbix_setup/vars/template_os_linux.yml

@@ -3,88 +3,171 @@ g_template_os_linux:
   name: Template OS Linux
   zitems:
   - key: kernel.uname.sysname
+    applications:
+    - Kernel
     value_type: string
 
   - key: kernel.all.cpu.wait.total
+    applications:
+    - Kernel
     value_type: int
 
   - key: kernel.all.cpu.irq.hard
+    applications:
+    - Kernel
     value_type: int
 
   - key: kernel.all.cpu.idle
+    applications:
+    - Kernel
     value_type: int
 
   - key: kernel.uname.distro
+    applications:
+    - Kernel
     value_type: string
 
   - key: kernel.uname.nodename
+    applications:
+    - Kernel
     value_type: string
 
   - key: kernel.all.cpu.irq.soft
+    applications:
+    - Kernel
     value_type: int
 
   - key: kernel.all.load.15_minute
+    applications:
+    - Kernel
     value_type: float
 
   - key: kernel.all.cpu.sys
+    applications:
+    - Kernel
     value_type: int
 
   - key: kernel.all.load.5_minute
+    applications:
+    - Kernel
     value_type: float
 
   - key: mem.freemem
+    applications:
+    - Memory
     value_type: int
 
   - key: kernel.all.cpu.nice
+    applications:
+    - Kernel
     value_type: int
 
   - key: mem.util.bufmem
+    applications:
+    - Memory
     value_type: int
 
   - key: swap.used
+    applications:
+    - Memory
     value_type: int
 
   - key: kernel.all.load.1_minute
+    applications:
+    - Kernel
     value_type: float
 
   - key: kernel.uname.version
+    applications:
+    - Kernel
     value_type: string
 
   - key: swap.length
+    applications:
+    - Memory
     value_type: int
 
   - key: mem.physmem
+    applications:
+    - Memory
     value_type: int
 
   - key: kernel.all.uptime
+    applications:
+    - Kernel
     value_type: int
 
   - key: swap.free
+    applications:
+    - Memory
     value_type: int
 
   - key: mem.util.used
+    applications:
+    - Memory
     value_type: int
 
   - key: kernel.all.cpu.user
+    applications:
+    - Kernel
     value_type: int
 
   - key: kernel.uname.machine
+    applications:
+    - Kernel
     value_type: string
 
   - key: hinv.ncpu
+    applications:
+    - Kernel
     value_type: int
 
   - key: mem.util.cached
+    applications:
+    - Memory
     value_type: int
 
   - key: kernel.all.cpu.steal
+    applications:
+    - Kernel
     value_type: int
 
   - key: kernel.all.pswitch
+    applications:
+    - Kernel
     value_type: int
 
   - key: kernel.uname.release
+    applications:
+    - Kernel
     value_type: string
 
   - key: proc.nprocs
+    applications:
+    - Kernel
     value_type: int
+
+  - key: filesys.avail
+    applications:
+    - Disk
+    value_type: int
+
+  - key: filesys.capacity
+    applications:
+    - Disk
+    value_type: int
+
+  - key: filesys.free
+    applications:
+    - Disk
+    value_type: int
+
+  - key: filesys.full
+    applications:
+    - Disk
+    value_type: float
+
+  - key: filesys.used
+    applications:
+    - Disk
+    value_type: float

playbooks/adhoc/zabbix_setup/vars/template_router.yml → roles/os_zabbix/vars/template_router.yml