diff options
| -rw-r--r-- | roles/os_zabbix/library/get_drule.yml | 115 | ||||
| -rw-r--r-- | roles/os_zabbix/library/test.yml | 49 | ||||
| -rw-r--r-- | roles/os_zabbix/library/zbx_application.py | 135 | ||||
| -rw-r--r-- | roles/os_zabbix/library/zbx_discoveryrule.py | 177 | ||||
| -rw-r--r-- | roles/os_zabbix/library/zbx_host.py | 31 | ||||
| -rw-r--r-- | roles/os_zabbix/library/zbx_item.py | 12 | ||||
| -rw-r--r-- | roles/os_zabbix/library/zbx_itemprototype.py | 241 | ||||
| -rw-r--r-- | roles/os_zabbix/library/zbx_template.py | 3 | ||||
| -rw-r--r-- | roles/os_zabbix/library/zbx_user.py | 22 | 
9 files changed, 761 insertions, 24 deletions
| diff --git a/roles/os_zabbix/library/get_drule.yml b/roles/os_zabbix/library/get_drule.yml new file mode 100644 index 000000000..a3e39f535 --- /dev/null +++ b/roles/os_zabbix/library/get_drule.yml @@ -0,0 +1,115 @@ +--- +# 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 diff --git a/roles/os_zabbix/library/test.yml b/roles/os_zabbix/library/test.yml index f585bcbb2..cedace1a0 100644 --- a/roles/os_zabbix/library/test.yml +++ b/roles/os_zabbix/library/test.yml @@ -6,7 +6,7 @@    hosts: localhost    gather_facts: no    vars: -    zbx_server: http://localhost/zabbix/api_jsonrpc.php +    zbx_server: http://localhost:8080/zabbix/api_jsonrpc.php      zbx_user: Admin      zbx_password: zabbix @@ -21,6 +21,41 @@    - 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 }}" @@ -28,7 +63,9 @@        password: "{{ zbx_password }}"        name: 'test item'        key: 'kenny.item.1' -      template_name: "{{ template_output.results[0].host }}" +      applications: +      - 'Test App' +      template_name: "test template"      register: item_output    - debug: var=item_output @@ -39,7 +76,7 @@        user: "{{ zbx_user }}"        password: "{{ zbx_password }}"        expression: '{test template:kenny.item.1.last()}>2' -      desc: 'Kenny desc' +      description: 'Kenny desc'      register: trigger_output    - debug: var=trigger_output @@ -60,8 +97,10 @@        user: "{{ zbx_user }}"        password: "{{ zbx_password }}"        name: 'kenny host' -      hostgroups: -      -  'kenny hostgroup' +      template_names: +      - test template +      hostgroup_names: +      - kenny hostgroup      register: host_output    - debug: var=host_output diff --git a/roles/os_zabbix/library/zbx_application.py b/roles/os_zabbix/library/zbx_application.py new file mode 100644 index 000000000..5d4acf72d --- /dev/null +++ b/roles/os_zabbix/library/zbx_application.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +''' +Ansible module for application +''' +# vim: expandtab:tabstop=4:shiftwidth=4 +# +#   Zabbix application 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_template_ids(zapi, template_names): +    ''' +    get related templates +    ''' +    template_ids = [] +    # Fetch templates by name +    for template_name in template_names: +        content = zapi.get_content('template', 'get', {'search': {'host': template_name}}) +        if content.has_key('result'): +            template_ids.append(content['result'][0]['templateid']) +    return template_ids + +def main(): +    ''' Ansible module for application +    ''' + +    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'), +            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'])) + +    #Set the instance and the application for the rest of the calls +    zbx_class_name = 'application' +    idname = 'applicationid' +    aname = module.params['name'] +    state = module.params['state'] +    # get a applicationid, see if it exists +    content = zapi.get_content(zbx_class_name, +                               'get', +                               {'search': {'host': aname}, +                                'selectHost': 'hostid', +                               }) +    if state == 'list': +        module.exit_json(changed=False, results=content['result'], state="list") + +    if state == 'absent': +        if not exists(content): +            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 = {'hostid': get_template_ids(zapi, module.params['template_name'])[0], +                  'name': aname, +                 } +        if not exists(content): +            # if we didn't find it, create it +            content = zapi.get_content(zbx_class_name, 'create', params) +            module.exit_json(changed=True, results=content['result'], state='present') +        # already exists, we need to update it +        # let's compare properties +        differences = {} +        zab_results = content['result'][0] +        for key, value in params.items(): +            if key == 'templates' and zab_results.has_key('parentTemplates'): +                if zab_results['parentTemplates'] != value: +                    differences[key] = value +            elif zab_results[key] != str(value) and zab_results[key] != value: +                differences[key] = value + +        if not differences: +            module.exit_json(changed=False, results=content['result'], state="present") + +        # We have differences and need to update +        differences[idname] = zab_results[idname] +        content = zapi.get_content(zbx_class_name, 'update', differences) +        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() diff --git a/roles/os_zabbix/library/zbx_discoveryrule.py b/roles/os_zabbix/library/zbx_discoveryrule.py new file mode 100644 index 000000000..56b87fecc --- /dev/null +++ b/roles/os_zabbix/library/zbx_discoveryrule.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python +''' +Zabbix discovery rule ansible module +''' +# vim: expandtab:tabstop=4:shiftwidth=4 +# +#   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_template(zapi, template_name): +    '''get a template by name +    ''' +    content = zapi.get_content('template', +                               'get', +                               {'search': {'host': template_name}, +                                'output': 'extend', +                                'selectInterfaces': 'interfaceid', +                               }) +    if not content['result']: +        return None +    return content['result'][0] + +def get_type(vtype): +    ''' +    Determine which type of discoverrule this is +    ''' +    _types = {'agent': 0, +              'SNMPv1': 1, +              'trapper': 2, +              'simple': 3, +              'SNMPv2': 4, +              'internal': 5, +              'SNMPv3': 6, +              'active': 7, +              'external': 10, +              'database monitor': 11, +              'ipmi': 12, +              'ssh': 13, +              'telnet': 14, +              'JMX': 16, +             } + +    for typ in _types.keys(): +        if vtype in typ or vtype == typ: +            _vtype = _types[typ] +            break +    else: +        _vtype = 2 + +    return _vtype + +def main(): +    ''' +    Ansible module for zabbix discovery rules +    ''' + +    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'), +            name=dict(default=None, type='str'), +            key=dict(default=None, type='str'), +            interfaceid=dict(default=None, type='int'), +            ztype=dict(default='trapper', type='str'), +            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'])) + +    #Set the instance and the template for the rest of the calls +    zbx_class_name = 'discoveryrule' +    idname = "itemid" +    dname = module.params['name'] +    state = module.params['state'] + +    # selectInterfaces doesn't appear to be working but is needed. +    content = zapi.get_content(zbx_class_name, +                               'get', +                               {'search': {'name': dname}, +                                #'selectDServices': 'extend', +                                #'selectDChecks': 'extend', +                                #'selectDhosts': 'dhostid', +                               }) +    if state == 'list': +        module.exit_json(changed=False, results=content['result'], state="list") + +    if state == 'absent': +        if not exists(content): +            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': +        template = get_template(zapi, module.params['template_name']) +        params = {'name': dname, +                  'key_':  module.params['key'], +                  'hostid':  template['templateid'], +                  'interfaceid': module.params['interfaceid'], +                  'lifetime': module.params['lifetime'], +                  'type': get_type(module.params['ztype']), +                 } +        if params['type'] in [2, 5, 7, 11]: +            params.pop('interfaceid') + +        if not exists(content): +            # if we didn't find it, create it +            content = zapi.get_content(zbx_class_name, 'create', params) +            module.exit_json(changed=True, results=content['result'], state='present') +        # already exists, we need to update it +        # let's compare properties +        differences = {} +        zab_results = content['result'][0] +        for key, value in params.items(): + +            if zab_results[key] != value and zab_results[key] != str(value): +                differences[key] = value + +        if not differences: +            module.exit_json(changed=False, results=zab_results, state="present") + +        # We have differences and need to update +        differences[idname] = zab_results[idname] +        content = zapi.get_content(zbx_class_name, 'update', differences) +        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() diff --git a/roles/os_zabbix/library/zbx_host.py b/roles/os_zabbix/library/zbx_host.py index d75dfdea1..12c5f3456 100644 --- a/roles/os_zabbix/library/zbx_host.py +++ b/roles/os_zabbix/library/zbx_host.py @@ -60,7 +60,7 @@ def get_template_ids(zapi, template_names):      for template_name in template_names:          content = zapi.get_content('template', 'get', {'search': {'host': template_name}})          if content.has_key('result'): -            template_ids.append({'templateid': content['results'][0]['templateid']}) +            template_ids.append({'templateid': content['result'][0]['templateid']})      return template_ids  def main(): @@ -71,20 +71,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'), +            user=dict(default=os.environ['ZABBIX_USER'], type='str'), +            password=dict(default=os.environ['ZABBIX_PASSWORD'], type='str'),              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=[], type='list'), +            interfaces=dict(default=None, type='list'),          ),          #supports_check_mode=True      ) -    user = module.params.get('user', os.environ['ZABBIX_USER']) -    passwd = module.params.get('password', os.environ['ZABBIX_PASSWORD']) +    user = module.params['user'] +    passwd = module.params['password']      zapi = ZabbixAPI(ZabbixConnection(module.params['server'], user, passwd, module.params['debug'])) @@ -113,16 +113,17 @@ def main():          module.exit_json(changed=True, results=content['result'], state="absent")      if state == 'present': +        ifs = module.params['interfaces'] or [{'type':  1,         # interface type, 1 = agent +                                               'main':  1,         # default interface? 1 = true +                                               'useip':  1,        # default interface? 1 = true +                                               'ip':  '127.0.0.1', # default interface? 1 = true +                                               'dns':  '',         # dns for host +                                               'port':  '10050',   # port for interface? 10050 +                                              }]          params = {'host': hname, -                  'groups':  get_group_ids(zapi, module.params('hostgroup_names')), -                  'templates':  get_template_ids(zapi, module.params('template_names')), -                  'interfaces': module.params.get('interfaces', [{'type':  1,         # interface type, 1 = agent -                                                                  'main':  1,         # default interface? 1 = true -                                                                  'useip':  1,        # default interface? 1 = true -                                                                  'ip':  '127.0.0.1', # default interface? 1 = true -                                                                  'dns':  '',         # dns for host -                                                                  'port':  '10050',   # port for interface? 10050 -                                                                 }]) +                  'groups':  get_group_ids(zapi, module.params['hostgroup_names']), +                  'templates':  get_template_ids(zapi, module.params['template_names']), +                  'interfaces': ifs,                   }          if not exists(content): diff --git a/roles/os_zabbix/library/zbx_item.py b/roles/os_zabbix/library/zbx_item.py index 57ec06463..45ba6c2b0 100644 --- a/roles/os_zabbix/library/zbx_item.py +++ b/roles/os_zabbix/library/zbx_item.py @@ -60,6 +60,16 @@ def get_value_type(value_type):      return vtype +def get_app_ids(zapi, application_names): +    ''' get application ids from names +    ''' +    app_ids = [] +    for app_name in application_names: +        content = zapi.get_content('application', 'get', {'search': {'name': app_name}}) +        if content.has_key('result'): +            app_ids.append(content['result'][0]['applicationid']) +    return app_ids +  def main():      '''      ansible zabbix module for zbx_item @@ -124,7 +134,7 @@ def main():                    'hostid': templateid,                    'type': module.params['zabbix_type'],                    'value_type': get_value_type(module.params['value_type']), -                  'applications': module.params['applications'], +                  'applications': get_app_ids(zapi, module.params['applications']),                   }          if not exists(content): diff --git a/roles/os_zabbix/library/zbx_itemprototype.py b/roles/os_zabbix/library/zbx_itemprototype.py new file mode 100644 index 000000000..f0eb6bbbd --- /dev/null +++ b/roles/os_zabbix/library/zbx_itemprototype.py @@ -0,0 +1,241 @@ +#!/usr/bin/env python +''' +Zabbix discovery rule ansible module +''' +# vim: expandtab:tabstop=4:shiftwidth=4 +# +#   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_rule_id(zapi, discoveryrule_name): +    '''get a discoveryrule by name +    ''' +    content = zapi.get_content('discoveryrule', +                               'get', +                               {'search': {'name': discoveryrule_name}, +                                'output': 'extend', +                               }) +    if not content['result']: +        return None +    return content['result'][0]['itemid'] + +def get_template(zapi, template_name): +    '''get a template by name +    ''' +    content = zapi.get_content('template', +                               'get', +                               {'search': {'host': template_name}, +                                'output': 'extend', +                                'selectInterfaces': 'interfaceid', +                               }) +    if not content['result']: +        return None +    return content['result'][0] + +def get_type(ztype): +    ''' +    Determine which type of discoverrule this is +    ''' +    _types = {'agent': 0, +              'SNMPv1': 1, +              'trapper': 2, +              'simple': 3, +              'SNMPv2': 4, +              'internal': 5, +              'SNMPv3': 6, +              'active': 7, +              'aggregate': 8, +              'external': 10, +              'database monitor': 11, +              'ipmi': 12, +              'ssh': 13, +              'telnet': 14, +              'calculated': 15, +              'JMX': 16, +             } + +    for typ in _types.keys(): +        if ztype in typ or ztype == typ: +            _vtype = _types[typ] +            break +    else: +        _vtype = 2 + +    return _vtype + +def get_value_type(value_type): +    ''' +    Possible values: +    0 - numeric float; +    1 - character; +    2 - log; +    3 - numeric unsigned; +    4 - text +    ''' +    vtype = 0 +    if 'int' in value_type: +        vtype = 3 +    elif 'char' in value_type: +        vtype = 1 +    elif 'str' in value_type: +        vtype = 4 + +    return vtype + +def get_status(status): +    ''' Determine status +    ''' +    _status = 0 +    if status == 'disabled': +        _status = 1 +    elif status == 'unsupported': +        _status = 3 + +    return _status + +def get_app_ids(zapi, application_names): +    ''' get application ids from names +    ''' +    app_ids = [] +    for app_name in application_names: +        content = zapi.get_content('application', 'get', {'search': {'name': app_name}}) +        if content.has_key('result'): +            app_ids.append(content['result'][0]['applicationid']) +    return app_ids + +def main(): +    ''' +    Ansible module for zabbix discovery rules +    ''' + +    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'), +            name=dict(default=None, type='str'), +            key=dict(default=None, type='str'), +            interfaceid=dict(default=None, type='int'), +            ztype=dict(default='trapper', type='str'), +            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'), +            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'), +            applications=dict(default=[], 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'])) + +    #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'] + +    # selectInterfaces doesn't appear to be working but is needed. +    content = zapi.get_content(zbx_class_name, +                               'get', +                               {'search': {'name': dname}, +                                'selectApplications': 'applicationid', +                                'selectDiscoveryRule': 'itemid', +                                #'selectDhosts': 'dhostid', +                               }) +    if state == 'list': +        module.exit_json(changed=False, results=content['result'], state="list") + +    if state == 'absent': +        if not exists(content): +            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': +        template = get_template(zapi, module.params['template_name']) +        params = {'name': dname, +                  'key_':  module.params['key'], +                  'hostid':  template['templateid'], +                  'interfaceid': module.params['interfaceid'], +                  'ruleid': get_rule_id(zapi, module.params['discoveryrule_name']), +                  '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') + +        if not exists(content): +            # if we didn't find it, create it +            content = zapi.get_content(zbx_class_name, 'create', params) +            module.exit_json(changed=True, results=content['result'], state='present') +        # already exists, we need to update it +        # let's compare properties +        differences = {} +        zab_results = content['result'][0] +        for key, value in params.items(): + +            if key == 'ruleid': +                if value != zab_results['discoveryRule']['itemid']: +                    differences[key] = value + +            elif zab_results[key] != value and zab_results[key] != str(value): +                differences[key] = value + +        if not differences: +            module.exit_json(changed=False, results=zab_results, state="present") + +        # We have differences and need to update +        differences[idname] = zab_results[idname] +        content = zapi.get_content(zbx_class_name, 'update', differences) +        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() diff --git a/roles/os_zabbix/library/zbx_template.py b/roles/os_zabbix/library/zbx_template.py index 676fa7e49..20ea48a85 100644 --- a/roles/os_zabbix/library/zbx_template.py +++ b/roles/os_zabbix/library/zbx_template.py @@ -74,7 +74,8 @@ def main():                                 {'search': {'host': tname},                                  'selectParentTemplates': 'templateid',                                  'selectGroups': 'groupid', -                                #'selectApplications': extend, +                                'selectApplications': 'applicationid', +                                'selectDiscoveries': 'extend',                                 })      if state == 'list':          module.exit_json(changed=False, results=content['result'], state="list") diff --git a/roles/os_zabbix/library/zbx_user.py b/roles/os_zabbix/library/zbx_user.py index 489023407..50f6fc075 100644 --- a/roles/os_zabbix/library/zbx_user.py +++ b/roles/os_zabbix/library/zbx_user.py @@ -56,6 +56,19 @@ def get_usergroups(zapi, usergroups):      return ugroups + +def get_usertype(user_type): +    ''' +    Determine zabbix user account type +    ''' +    utype = 1 +    if 'super' in user_type: +        utype = 3 +    elif 'admin' in user_type or user_type == 'admin': +        utype = 2 + +    return utype +  def main():      '''      ansible zabbix module for users @@ -69,6 +82,9 @@ def main():              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'), +            user_type=dict(default='user', type='str'),              passwd=dict(default=None, type='str'),              usergroups=dict(default=None, type='list'),              debug=dict(default=False, type='bool'), @@ -80,8 +96,7 @@ def main():      user = module.params.get('user', os.environ['ZABBIX_USER'])      password = module.params.get('password', os.environ['ZABBIX_PASSWORD']) -    zbc = ZabbixConnection(module.params['server'], user, password, module.params['debug']) -    zapi = ZabbixAPI(zbc) +    zapi = ZabbixAPI(ZabbixConnection(module.params['server'], user, password, module.params['debug']))      ## before we can create a user media and users with media types we need media      zbx_class_name = 'user' @@ -109,6 +124,9 @@ def main():          params = {'alias': alias,                    'passwd': module.params['passwd'],                    'usrgrps': get_usergroups(zapi, module.params['usergroups']), +                  'name': module.params['name'], +                  'surname': module.params['surname'], +                  'type': get_usertype(module.params['user_type']),                   }          if not exists(content): | 
