From 645a81ac4a5bc7a91d58b6eeec473383ef894a27 Mon Sep 17 00:00:00 2001 From: ONODERA Masaru <46081939+masa-orca@users.noreply.github.com> Date: Fri, 6 Dec 2024 10:23:41 +0900 Subject: [PATCH] [WIP] Add zabbix_regexp_info module (#1415) * Add zabbix_regexp_info module * Add changelog fragment * Change version_added * Change ansible_command_timeout to 60sec --- .../fragments/1415-add-zabbix_regexp_info.yml | 2 + plugins/modules/zabbix_regexp_info.py | 180 ++++++++++++++++++ .../targets/setup_zabbix/tasks/main.yml | 1 + .../targets/test_zabbix_regexp/tasks/main.yml | 9 + .../test_zabbix_regexp_info/meta/main.yml | 3 + .../test_zabbix_regexp_info/tasks/main.yml | 19 ++ 6 files changed, 214 insertions(+) create mode 100644 changelogs/fragments/1415-add-zabbix_regexp_info.yml create mode 100644 plugins/modules/zabbix_regexp_info.py create mode 100644 tests/integration/targets/test_zabbix_regexp_info/meta/main.yml create mode 100644 tests/integration/targets/test_zabbix_regexp_info/tasks/main.yml diff --git a/changelogs/fragments/1415-add-zabbix_regexp_info.yml b/changelogs/fragments/1415-add-zabbix_regexp_info.yml new file mode 100644 index 000000000..d6eccc371 --- /dev/null +++ b/changelogs/fragments/1415-add-zabbix_regexp_info.yml @@ -0,0 +1,2 @@ +minor_changes: + - zabbix_regexp_info module added \ No newline at end of file diff --git a/plugins/modules/zabbix_regexp_info.py b/plugins/modules/zabbix_regexp_info.py new file mode 100644 index 000000000..b3448ad23 --- /dev/null +++ b/plugins/modules/zabbix_regexp_info.py @@ -0,0 +1,180 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright: (c) 2024, ONODERA Masaru +# 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_regexp_info + +short_description: Retrieve Zabbix regular expression + + +description: + - This module allows you to retrieve Zabbix regular expression. + +author: + - ONODERA Masaru(@masa-orca) + +requirements: + - "python >= 3.9" + +version_added: 3.3.0 + +options: + name: + description: + - Name of this regular expression + type: str + required: true + +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: Retrieve regexp of 'File systems for discovery' + # 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_regexp_info: + name: File systems for discovery +""" + +RETURN = """ +regexp: + description: A Zabbix regular expression which is converted value to be used in community.zabbix.zabbix_regexp module. + returned: success + type: dict + contains: + name: + description: Name of the regular expression + type: str + sample: File systems for discovery + expressions: + description: Expressions of the regular expression + type: list + sample: [{"case_sensitive": false, "expression_type": "result_is_true", ...}] + test_string: + description: Test string of the regular expression + type: str + sample: ext3 +""" + + +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 RegularExpression(ZabbixBase): + expression_type_values = [ + "character_string_included", + "any_character_string_included", + "character_string_not_included", + "result_is_true", + "result_is_false", + ] + + exp_delimiter_values = [",", ".", "/"] + + def __init__(self, module, zbx=None, zapi_wrapper=None): + super(RegularExpression, self).__init__(module, zbx, zapi_wrapper) + + def get_regexp(self, regexp_name): + try: + regexps = self._zapi.regexp.get( + { + "output": "extend", + "selectExpressions": [ + "expression", + "expression_type", + "exp_delimiter", + "case_sensitive", + ], + "filter": {"name": regexp_name}, + } + ) + if len(regexps) >= 2: + self._module.fail_json("Too many regexps are matched.") + except Exception as e: + self._module.fail_json( + msg="Failed to get regular expression setting: %s" % e + ) + regexp_json = regexps[0] + + expressions = [] + + for _expression in regexp_json['expressions']: + case_sensitive = True + if _expression['case_sensitive'] == '0': + case_sensitive = False + + expression = { + 'expression': _expression['expression'], + 'expression_type': self.expression_type_values[int(_expression['expression_type'])], + 'case_sensitive': case_sensitive + } + + if _expression['expression_type'] == '1': + expression['exp_delimiter'] = _expression['exp_delimiter'] + + expressions.append(expression) + + regexp = { + 'name': regexp_name, + 'test_string': regexp_json['test_string'], + 'expressions': expressions + } + + self._module.exit_json(regexp=regexp) + + +def main(): + """Main ansible module function""" + + argument_spec = zabbix_utils.zabbix_common_argument_spec() + argument_spec.update( + dict(name=dict(type="str", required=True)) + ) + + module = AnsibleModule( + argument_spec=argument_spec, + supports_check_mode=True + ) + + name = module.params["name"] + + regexp_class_obj = RegularExpression(module) + regexp_class_obj.get_regexp(name) + + +if __name__ == "__main__": + main() diff --git a/tests/integration/targets/setup_zabbix/tasks/main.yml b/tests/integration/targets/setup_zabbix/tasks/main.yml index 60937fc0b..5cb67b413 100644 --- a/tests/integration/targets/setup_zabbix/tasks/main.yml +++ b/tests/integration/targets/setup_zabbix/tasks/main.yml @@ -31,6 +31,7 @@ ansible_httpapi_port: 8080 ansible_httpapi_use_ssl: false ansible_httpapi_validate_certs: false + ansible_command_timeout: 60 ansible_user: Admin ansible_httpapi_pass: zabbix diff --git a/tests/integration/targets/test_zabbix_regexp/tasks/main.yml b/tests/integration/targets/test_zabbix_regexp/tasks/main.yml index 8e2afc02d..1284c365b 100644 --- a/tests/integration/targets/test_zabbix_regexp/tasks/main.yml +++ b/tests/integration/targets/test_zabbix_regexp/tasks/main.yml @@ -111,3 +111,12 @@ ansible.builtin.assert: that: - zbxregexp_update.changed is sameas False + + - name: Initialize File systems for discovery + community.zabbix.zabbix_regexp: + name: File systems for discovery + test_string: ext3 + expressions: + - expression: "^(btrfs|ext2|ext3|ext4|reiser|xfs|ffs|ufs|jfs|jfs2|vxfs|hfs|apfs|refs|ntfs|fat32|zfs)$" + expression_type: result_is_true + register: zbxregexp_update \ No newline at end of file diff --git a/tests/integration/targets/test_zabbix_regexp_info/meta/main.yml b/tests/integration/targets/test_zabbix_regexp_info/meta/main.yml new file mode 100644 index 000000000..acdb704c8 --- /dev/null +++ b/tests/integration/targets/test_zabbix_regexp_info/meta/main.yml @@ -0,0 +1,3 @@ +--- +dependencies: + - setup_zabbix diff --git a/tests/integration/targets/test_zabbix_regexp_info/tasks/main.yml b/tests/integration/targets/test_zabbix_regexp_info/tasks/main.yml new file mode 100644 index 000000000..db95d887e --- /dev/null +++ b/tests/integration/targets/test_zabbix_regexp_info/tasks/main.yml @@ -0,0 +1,19 @@ +--- +- name: test - try to retrieve regexp + community.zabbix.zabbix_regexp_info: + name: File systems for discovery + register: zbxregexp_get + +- name: assert that regular expression data was converted correctly + ansible.builtin.assert: + that: + - zbxregexp_get.changed is sameas False + - zbxregexp_get.regexp | ansible.utils.fact_diff(expected_regexp) | from_json | list | length == 0 + vars: + expected_regexp: + name: "File systems for discovery" + test_string: ext3 + expressions: + - expression: "^(btrfs|ext2|ext3|ext4|reiser|xfs|ffs|ufs|jfs|jfs2|vxfs|hfs|apfs|refs|ntfs|fat32|zfs)$" + expression_type: result_is_true + case_sensitive: false