From 2a987f59d2bcb77975f5c133dd6c525635c708ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Clemens=20Wei=C3=9F?= Date: Fri, 13 Oct 2017 13:30:15 +0200 Subject: [PATCH] Update Zabbix maintenance if it already exists to set new period, hosts etc. (#24371) * Update Zabbix maintenance if it already exists to set new period, hosts etc. * Whitespace --- .../modules/monitoring/zabbix_maintenance.py | 74 +++++++++++++++---- 1 file changed, 58 insertions(+), 16 deletions(-) diff --git a/lib/ansible/modules/monitoring/zabbix_maintenance.py b/lib/ansible/modules/monitoring/zabbix_maintenance.py index 6de4cb6f835..4a1b4f89b0f 100644 --- a/lib/ansible/modules/monitoring/zabbix_maintenance.py +++ b/lib/ansible/modules/monitoring/zabbix_maintenance.py @@ -110,7 +110,6 @@ notes: so if Zabbix server's time and host's time are not synchronized, you will get strange results. - Install required module with 'pip install zabbix-api' command. - - Checks existence only by maintenance name. ''' EXAMPLES = ''' @@ -193,29 +192,56 @@ def create_maintenance(zbx, group_ids, host_ids, start_time, maintenance_type, p return 0, None, None -def get_maintenance_id(zbx, name): +def update_maintenance(zbx, maintenance_id, group_ids, host_ids, start_time, maintenance_type, period, desc): + end_time = start_time + period + try: + zbx.maintenance.update( + { + "maintenanceid": maintenance_id, + "groupids": group_ids, + "hostids": host_ids, + "maintenance_type": maintenance_type, + "active_since": str(start_time), + "active_till": str(end_time), + "description": desc, + "timeperiods": [{ + "timeperiod_type": "0", + "start_date": str(start_time), + "period": str(period), + }] + } + ) + except BaseException as e: + return 1, None, str(e) + return 0, None, None + + +def get_maintenance(zbx, name): try: - result = zbx.maintenance.get( + maintenances = zbx.maintenance.get( { "filter": { "name": name, - } + }, + "selectGroups": "extend", + "selectHosts": "extend" } ) except BaseException as e: return 1, None, str(e) - maintenance_ids = [] - for res in result: - maintenance_ids.append(res["maintenanceid"]) + for maintenance in maintenances: + maintenance["groupids"] = [group["groupid"] for group in maintenance["groups"]] if "groups" in maintenance else [] + maintenance["hostids"] = [host["hostid"] for host in maintenance["hosts"]] if "hosts" in maintenance else [] + return 0, maintenance, None - return 0, maintenance_ids, None + return 0, None, None def delete_maintenance(zbx, maintenance_id): try: - zbx.maintenance.delete(maintenance_id) + zbx.maintenance.delete([maintenance_id]) except BaseException as e: return 1, None, str(e) return 0, None, None @@ -321,7 +347,10 @@ def main(): if state == "present": - now = datetime.datetime.now() + if not host_names and not host_groups: + module.fail_json(msg="At least one host_name or host_group must be defined for each created maintenance.") + + now = datetime.datetime.now().replace(second=0) start_time = time.mktime(now.timetuple()) period = 60 * int(minutes) # N * 60 seconds @@ -339,14 +368,27 @@ def main(): else: host_ids = [] - (rc, maintenance, error) = get_maintenance_id(zbx, name) + (rc, maintenance, error) = get_maintenance(zbx, name) if rc != 0: module.fail_json(msg="Failed to check maintenance %s existence: %s" % (name, error)) - if not maintenance: - if not host_names and not host_groups: - module.fail_json(msg="At least one host_name or host_group must be defined for each created maintenance.") + if maintenance and ( + sorted(group_ids) != sorted(maintenance["groupids"]) + or sorted(host_ids) != sorted(maintenance["hostids"]) + or str(maintenance_type) != maintenance["maintenance_type"] + or str(int(start_time)) != maintenance["active_since"] + or str(int(start_time + period)) != maintenance["active_till"] + ): + if module.check_mode: + changed = True + else: + (rc, _, error) = update_maintenance(zbx, maintenance["maintenanceid"], group_ids, host_ids, start_time, maintenance_type, period, desc) + if rc == 0: + changed = True + else: + module.fail_json(msg="Failed to update maintenance: %s" % error) + if not maintenance: if module.check_mode: changed = True else: @@ -358,7 +400,7 @@ def main(): if state == "absent": - (rc, maintenance, error) = get_maintenance_id(zbx, name) + (rc, maintenance, error) = get_maintenance(zbx, name) if rc != 0: module.fail_json(msg="Failed to check maintenance %s existence: %s" % (name, error)) @@ -366,7 +408,7 @@ def main(): if module.check_mode: changed = True else: - (rc, _, error) = delete_maintenance(zbx, maintenance) + (rc, _, error) = delete_maintenance(zbx, maintenance["maintenanceid"]) if rc == 0: changed = True else: