diff --git a/changelogs/fragments/1210-add_zabbix_service_info.yml b/changelogs/fragments/1210-add_zabbix_service_info.yml new file mode 100644 index 000000000..51b006ca4 --- /dev/null +++ b/changelogs/fragments/1210-add_zabbix_service_info.yml @@ -0,0 +1,2 @@ +minor_changes: + - zabbix_service_info module added diff --git a/plugins/modules/zabbix_service_info.py b/plugins/modules/zabbix_service_info.py new file mode 100644 index 000000000..1984777d3 --- /dev/null +++ b/plugins/modules/zabbix_service_info.py @@ -0,0 +1,149 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Copyright: (c) 2021, D3DeFi +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + + +DOCUMENTATION = """ +module: zabbix_service_info +short_description: Gather information about Zabbix service +author: + - Kanstantsin Maksimau (@us3241) +description: + - This module allows you to obtain detailed information about configured zabbix service. +requirements: + - "python >= 3.9" +options: + service_name: + description: + - Name of the Zabbix service. + required: true + type: str +extends_documentation_fragment: +- community.zabbix.zabbix + +""" + +EXAMPLES = """ +# If you want to use Username and Password to be authenticated by Zabbix Server +- name: Set credentials to access Zabbix Server API + ansible.builtin.set_fact: + ansible_user: Admin + ansible_httpapi_pass: zabbix + +# If you want to use API token to be authenticated by Zabbix Server +# https://www.zabbix.com/documentation/current/en/manual/web_interface/frontend_sections/administration/general#api-tokens +- name: Set API token + ansible.builtin.set_fact: + ansible_zabbix_auth_key: 8ec0d52432c15c91fcafe9888500cf9a607f44091ab554dbee860f6b44fac895 + +- name: Get zabbix service info + # set task level variables as we change ansible_connection plugin here + vars: + ansible_network_os: community.zabbix.zabbix + ansible_connection: httpapi + ansible_httpapi_port: 443 + ansible_httpapi_use_ssl: true + ansible_httpapi_validate_certs: false + ansible_zabbix_url_path: "zabbixeu" # If Zabbix WebUI runs on non-default (zabbix) path ,e.g. http:///zabbixeu + ansible_host: zabbix-example-fqdn.org + community.zabbix.zabbix_service_info: + service_name: zbx01.example.com +""" + +RETURN = """ +zabbix_service: + description: example + returned: always + type: dict + sample: { + "algorithm": "2", + "children": [ + { + "algorithm": "0", + "created_at": "1712743194", + "description": "", + "name": "example children", + "propagation_rule": "0", + "propagation_value": "0", + "readonly": false, + "serviceid": "81", + "sortorder": "0", + "status": "-1", + "uuid": "ce6e1a3784a547b48ee6707f6e061102", + "weight": "0" + } + ], + "created_at": "1709717864", + "description": "", + "name": "example service", + "parents": [], + "problem_tags": [], + "propagation_rule": "0", + "propagation_value": "0", + "readonly": false, + "serviceid": "51", + "sortorder": "0", + "status": "-1", + "status_rules": [], + "tags": [], + "uuid": "420e48b363fe473c95288c817031447f", + "weight": "0" + } +""" + + +from ansible.module_utils.basic import AnsibleModule + +from ansible_collections.community.zabbix.plugins.module_utils.base import ZabbixBase +import ansible_collections.community.zabbix.plugins.module_utils.helpers as zabbix_utils + + +class Service(ZabbixBase): + + def get_service(self, name): + result = {} + params = { + "filter": { + "name": name + }, + "output": "extend", + "selectParents": "extend", + "selectTags": "extend", + "selectProblemTags": "extend", + "selectChildren": "extend", + "selectStatusRules": "extend" + } + + try: + result = self._zapi.service.get(params) + except Exception as e: + self._module.fail_json(msg="Failed to get service information: %s" % e) + + return result[0] if result else {} + + +def main(): + argument_spec = zabbix_utils.zabbix_common_argument_spec() + argument_spec.update(dict( + service_name=dict(type="str", required=True), + )) + + module = AnsibleModule( + argument_spec=argument_spec, + supports_check_mode=True + ) + + name = module.params["service_name"] + + service = Service(module) + result = service.get_service(name) + module.exit_json(changed=False, zabbix_service=result) + + +if __name__ == "__main__": + main() diff --git a/tests/integration/targets/test_zabbix_service_info/meta/main.yml b/tests/integration/targets/test_zabbix_service_info/meta/main.yml new file mode 100644 index 000000000..acdb704c8 --- /dev/null +++ b/tests/integration/targets/test_zabbix_service_info/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - setup_zabbix diff --git a/tests/integration/targets/test_zabbix_service_info/tasks/main.yml b/tests/integration/targets/test_zabbix_service_info/tasks/main.yml new file mode 100644 index 000000000..77c244df8 --- /dev/null +++ b/tests/integration/targets/test_zabbix_service_info/tasks/main.yml @@ -0,0 +1,57 @@ +--- +- name: test - Create new Zabbix service + community.zabbix.zabbix_service: + name: ExampleService + description: ExampleService + sortorder: 0 + propagation_rule: as_is + propagation_value: not_classified + algorithm: most_crit_of_child_serv + register: create_service_result + +- ansible.builtin.assert: + that: + - create_service_result.changed is sameas true + +- name: test - Create new Zabbix child service + community.zabbix.zabbix_service: + name: ExampleChildService + description: ExampleChildService + sortorder: 0 + propagation_rule: as_is + propagation_value: not_classified + parents: ExampleService + problem_tags: + - tag: testtag + value: test + register: create_child_result + +- ansible.builtin.assert: + that: + - create_child_result.changed is sameas true + +- name: test - Get zabbix service information + community.zabbix.zabbix_service_info: + service_name: ExampleService + register: get_service_info_result + +- ansible.builtin.assert: + that: + - get_service_info_result["zabbix_service"].name == "ExampleService" + - get_service_info_result["zabbix_service"].children | length > 0 + - get_service_info_result["zabbix_service"].children[0].name == "ExampleChildService" + - get_service_info_result["zabbix_service"].propagation_rule == "0" + - get_service_info_result["zabbix_service"].propagation_value == "0" + - get_service_info_result["zabbix_service"].sortorder == "0" + +- name: test - cleanup test Zabbix child service + community.zabbix.zabbix_service: + state: absent + sortorder: 0 + name: ExampleChildService + +- name: test - cleanup test Zabbix service + community.zabbix.zabbix_service: + state: absent + sortorder: 0 + name: ExampleService