Added Zabbix usermacro state modules

This commit is contained in:
Raymond Kuiper 2017-05-30 17:12:11 +02:00
parent cfc712383d
commit bb46af9f78

View File

@ -0,0 +1,232 @@
# -*- coding: utf-8 -*-
'''
Management of Zabbix usermacros.
:codeauthor: Raymond Kuiper <qix@the-wired.net>
'''
def __virtual__():
'''
Only make these states available if Zabbix module is available.
'''
return 'zabbix.usermacro_create' in __salt__
def present(name, value, hostid=None, **kwargs):
'''
Creates a new usermacro.
:param name: name of the usermacro
:param value: value of the usermacro
:param hostid: id's of the hosts to apply the usermacro on, if missing a global usermacro is assumed.
:param _connection_user: Optional - zabbix user (can also be set in opts or pillar, see module's docstring)
:param _connection_password: Optional - zabbix password (can also be set in opts or pillar, see module's docstring)
:param _connection_url: Optional - url of zabbix frontend (can also be set in opts, pillar, see module's docstring)
.. code-block:: yaml
override host usermacro:
zabbix_usermacro.present:
- name: '{$SNMP_COMMUNITY}''
- value: 'public'
- hostid: 21
'''
connection_args = {}
if '_connection_user' in kwargs:
connection_args['_connection_user'] = kwargs['_connection_user']
if '_connection_password' in kwargs:
connection_args['_connection_password'] = kwargs['_connection_password']
if '_connection_url' in kwargs:
connection_args['_connection_url'] = kwargs['_connection_url']
ret = {'name': name, 'changes': {}, 'result': False, 'comment': ''}
# Comment and change messages
if hostid:
comment_usermacro_created = 'Usermacro {0} created on hostid {1}.'.format(name, hostid)
comment_usermacro_updated = 'Usermacro {0} updated on hostid {1}.'.format(name, hostid)
comment_usermacro_notcreated = 'Unable to create usermacro: {0} on hostid {1}. '.format(name, hostid)
comment_usermacro_exists = 'Usermacro {0} already exists on hostid {1}.'.format(name, hostid)
changes_usermacro_created = {name: {'old': 'Usermacro {0} does not exist on hostid {1}.'.format(name, hostid),
'new': 'Usermacro {0} created on hostid {1}.'.format(name, hostid),
}
}
else:
comment_usermacro_created = 'Usermacro {0} created.'.format(name)
comment_usermacro_updated = 'Usermacro {0} updated.'.format(name)
comment_usermacro_notcreated = 'Unable to create usermacro: {0}. '.format(name)
comment_usermacro_exists = 'Usermacro {0} already exists.'.format(name)
changes_usermacro_created = {name: {'old': 'Usermacro {0} does not exist.'.format(name),
'new': 'Usermacro {0} created.'.format(name),
}
}
# Zabbix API expects script parameters as a string of arguments seperated by newline characters
if 'exec_params' in kwargs:
if isinstance(kwargs['exec_params'], list):
kwargs['exec_params'] = '\n'.join(kwargs['exec_params'])+'\n'
else:
kwargs['exec_params'] = str(kwargs['exec_params'])+'\n'
if hostid:
usermacro_exists = __salt__['zabbix.usermacro_get'](name, hostids=hostid, **connection_args)
else:
usermacro_exists = __salt__['zabbix.usermacro_get'](name, globalmacro=True, **connection_args)
if usermacro_exists:
usermacroobj = usermacro_exists[0]
if hostid:
usermacroid = int(usermacroobj['hostmacroid'])
else:
usermacroid = int(usermacroobj['globalmacroid'])
update_value = False
if str(value) != usermacroobj['value']:
update_value = True
# Dry run, test=true mode
if __opts__['test']:
if usermacro_exists:
if update_value:
ret['result'] = None
ret['comment'] = comment_usermacro_updated
else:
ret['result'] = True
ret['comment'] = comment_usermacro_exists
else:
ret['result'] = None
ret['comment'] = comment_usermacro_created
return ret
error = []
if usermacro_exists:
if update_value:
ret['result'] = True
ret['comment'] = comment_usermacro_updated
if hostid:
updated_value = __salt__['zabbix.usermacro_update'](usermacroid,
value=value,
**connection_args)
else:
updated_value = __salt__['zabbix.usermacro_updateglobal'](usermacroid,
value=value,
**connection_args)
if not isinstance(updated_value, int):
if 'error' in updated_value:
error.append(updated_value['error'])
else:
ret['changes']['value'] = value
else:
ret['result'] = True
ret['comment'] = comment_usermacro_exists
else:
if hostid:
usermacro_create = __salt__['zabbix.usermacro_create'](name, value, hostid, **connection_args)
else:
usermacro_create = __salt__['zabbix.usermacro_createglobal'](name, value, **connection_args)
if 'error' not in usermacro_create:
ret['result'] = True
ret['comment'] = comment_usermacro_created
ret['changes'] = changes_usermacro_created
else:
ret['result'] = False
ret['comment'] = comment_usermacro_notcreated + str(usermacro_create['error'])
# error detected
if error:
ret['changes'] = {}
ret['result'] = False
ret['comment'] = str(error)
return ret
def absent(name, hostid=None, **kwargs):
'''
Ensures that the mediatype does not exist, eventually deletes the mediatype.
:param name: name of the usermacro
:param hostid: id's of the hosts to apply the usermacro on, if missing a global usermacro is assumed.
:param _connection_user: Optional - zabbix user (can also be set in opts or pillar, see module's docstring)
:param _connection_password: Optional - zabbix password (can also be set in opts or pillar, see module's docstring)
:param _connection_url: Optional - url of zabbix frontend (can also be set in opts, pillar, see module's docstring)
.. code-block:: yaml
delete_usermacro:
zabbix_usermacro.absent:
- name: '{$SNMP_COMMUNITY}'
'''
connection_args = {}
if '_connection_user' in kwargs:
connection_args['_connection_user'] = kwargs['_connection_user']
if '_connection_password' in kwargs:
connection_args['_connection_password'] = kwargs['_connection_password']
if '_connection_url' in kwargs:
connection_args['_connection_url'] = kwargs['_connection_url']
ret = {'name': name, 'changes': {}, 'result': False, 'comment': ''}
# Comment and change messages
if hostid:
comment_usermacro_deleted = 'Usermacro {0} deleted from hostid {1}.'.format(name, hostid)
comment_usermacro_notdeleted = 'Unable to delete usermacro: {0} from hostid {1}.'.format(name, hostid)
comment_usermacro_notexists = 'Usermacro {0} does not exist on hostid {1}.'.format(name, hostid)
changes_usermacro_deleted = {name: {'old': 'Usermacro {0} exists on hostid {1}.'.format(name, hostid),
'new': 'Usermacro {0} deleted from {1}.'.format(name, hostid),
}
}
else:
comment_usermacro_deleted = 'Usermacro {0} deleted.'.format(name)
comment_usermacro_notdeleted = 'Unable to delete usermacro: {0}.'.format(name)
comment_usermacro_notexists = 'Usermacro {0} does not exist.'.format(name)
changes_usermacro_deleted = {name: {'old': 'Usermacro {0} exists.'.format(name),
'new': 'Usermacro {0} deleted.'.format(name),
}
}
if hostid:
usermacro_exists = __salt__['zabbix.usermacro_get'](name, hostids=hostid, **connection_args)
else:
usermacro_exists = __salt__['zabbix.usermacro_get'](name, globalmacro=True, **connection_args)
# Dry run, test=true mode
if __opts__['test']:
if not usermacro_exists:
ret['result'] = True
ret['comment'] = comment_usermacro_notexists
else:
ret['result'] = None
ret['comment'] = comment_usermacro_deleted
return ret
if not usermacro_exists:
ret['result'] = True
ret['comment'] = comment_usermacro_notexists
else:
try:
if hostid:
usermacroid = usermacro_exists[0]['hostmacroid']
usermacro_delete = __salt__['zabbix.usermacro_delete'](usermacroid, **connection_args)
else:
usermacroid = usermacro_exists[0]['globalmacroid']
usermacro_delete = __salt__['zabbix.usermacro_deleteglobal'](usermacroid, **connection_args)
except KeyError:
usermacro_delete = False
if usermacro_delete and 'error' not in usermacro_delete:
ret['result'] = True
ret['comment'] = comment_usermacro_deleted
ret['changes'] = changes_usermacro_deleted
else:
ret['result'] = False
ret['comment'] = comment_usermacro_notdeleted + str(usermacro_delete['error'])
return ret