From 9829033a8a85fccee7aaf9a7c75e7add9097708b Mon Sep 17 00:00:00 2001 From: Tim Bielawa Date: Mon, 27 Aug 2012 11:30:13 -0400 Subject: [PATCH] Now reading from a config file actually works. --- library/nagios | 177 ++++++++++++++++++++++++------------------------- 1 file changed, 87 insertions(+), 90 deletions(-) diff --git a/library/nagios b/library/nagios index d10a9cd1672..627be773844 100644 --- a/library/nagios +++ b/library/nagios @@ -14,19 +14,20 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . - """ -remaining tasks: -- figure out why services=foo1,foo2,...fooN doesn't show output for each -fooX +Configuration: -- cleanup each methods return statements so they're not doing strange thigs. +If your nagios cmdfile is not /var/spool/nagios/cmd/nagios.cmd you +can configure ansible (on your nagios server) to use the correct +one by making a file called /etc/ansible/modules/nagios.conf that +looks like this: --> really, we only need to exit 'couldnt' write to command file' in ONE place + [main] + cmdfile = /path/to/your/nagios.cmd - -- finish up reading from a config file +When calling this module via ansible, use the 'cmdfile' parameter to +set it explicitly. """ @@ -34,7 +35,82 @@ import ConfigParser import types import time +MODULE_CONFIG = '/etc/ansible/modules/nagios.conf' +DEFAULT_CMDFILE = '/var/spool/nagios/cmd/nagios.cmd' +###################################################################### + + +def which_cmdfile(): + try: + config = ConfigParser.SafeConfigParser({'cmdfile': DEFAULT_CMDFILE}) + config.read(MODULE_CONFIG) + return config.get('main', 'cmdfile') + except: + return DEFAULT_CMDFILE + + +###################################################################### + + +def main(): + ACTION_CHOICES = [ + 'downtime', + 'silence', + 'unsilence', + 'enable_alerts', + 'disable_alerts' + ] + + module = AnsibleModule( + argument_spec=dict( + action=dict(required=True, default=None, choices=ACTION_CHOICES), + author=dict(default='Ansible'), + host=dict(required=True, default=None), + minutes=dict(default=30), + cmdfile=dict(default=which_cmdfile()), + services=dict(default=None, aliases=['service']), + ) + ) + + action = module.params['action'] + minutes = module.params['minutes'] + services = module.params['services'] + + ################################################################## + # Required args per action: + # downtime = (minutes, service, host) + # (un)silence = (host) + # (enable/disable)_alerts = (service, host) + # + # AnsibleModule will verify most stuff, we need to verify + # 'minutes' and 'service' manually. + + ################################################################## + if action == 'downtime': + # Make sure there's an actual service selected + if not services: + module.fail_json(msg='no service selected to set downtime for') + # Make sure minutes is a number + try: + m = int(minutes) + if not isinstance(m, types.IntType): + module.fail_json(msg='minutes must be a number') + except: + module.fail_json(msg='invalid entry for minutes') + + ################################################################## + if action in ['enable_alerts', 'disable_alerts']: + if not services: + module.fail_json(msg='a service is required when setting alerts') + + ################################################################## + ansible_nagios = Nagios(module, **module.params) + ansible_nagios.act() + ################################################################## + + +###################################################################### class Nagios(object): """ Perform common tasks in Nagios related to downtime and @@ -48,16 +124,6 @@ class Nagios(object): Note that in the case of `schedule_svc_downtime`, `enable_svc_notifications`, and `disable_svc_notifications`, the service argument should be passed as a list. - - Configuration: - - If your nagios cmdfile is not /var/spool/nagios/cmd/nagios.cmd you - can configure this by creating a file called - /etc/ansible/modules/nagios.conf that looks like this: - - [main] - cmdfile = /path/to/your/nagios.cmd - """ def __init__(self, module, **kwargs): @@ -88,13 +154,14 @@ class Nagios(object): """ try: - fp = open(self.cmdfile, 'a') + fp = open(self.cmdfile, 'w') fp.write(cmd) fp.flush() fp.close() self.command_results.append(cmd.strip()) except IOError: - self.module.fail_json(msg='unable to write to nagios command file', cmdfile=self.cmdfile) + self.module.fail_json(msg='unable to write to nagios command file', + cmdfile=self.cmdfile) def _fmt_dt_str(self, cmd, host, duration, author=None, comment="Scheduling downtime", start=None, @@ -613,76 +680,6 @@ class Nagios(object): changed=True) ###################################################################### -# Ansible module configuration - - -def which_cmdfile(): - CFG = '/etc/ansible/modules/nagios.conf' - default_cmdfile = '/var/spool/nagios/cmd/nagios.cmd' - - try: - c = ConfigParser.read(CFG) - return c.get('main', 'cmdfile', default_cmdfile) - except: - return default_cmdfile - - -###################################################################### -def main(): - ACTION_CHOICES = [ - 'downtime', - 'silence', - 'unsilence', - 'enable_alerts', - 'disable_alerts' - ] - - module = AnsibleModule( - argument_spec=dict( - action=dict(required=True, default=None, choices=ACTION_CHOICES), - author=dict(default='Ansible'), - host=dict(required=True, default=None), - minutes=dict(default=30), - cmdfile=dict(default='/var/spool/nagios/cmd/nagios.cmd'), - services=dict(default=None, aliases=['service']), - ) - ) - - action = module.params['action'] - minutes = module.params['minutes'] - services = module.params['services'] - - ################################################################## - # Required args per action: - # downtime = (minutes, service, host) - # (un)silence = (host) - # (enable/disable)_alerts = (service, host) - # - # AnsibleModule will verify most stuff, we need to verify - # 'minutes' and 'service' manually. - - ################################################################## - if action == 'downtime': - # Make sure there's an actual service selected - if not services: - module.fail_json(msg='no service selected to set downtime for') - # Make sure minutes is a number - try: - m = int(minutes) - if not isinstance(m, types.IntType): - module.fail_json(msg='minutes must be a number') - except: - module.fail_json(msg='invalid entry for minutes') - - ################################################################## - if action in ['enable_alerts', 'disable_alerts']: - if not services: - module.fail_json(msg='a service is required when setting alerts') - - ################################################################## - ansible_nagios = Nagios(module, **module.params) - ansible_nagios.act() - # this is magic, see lib/ansible/module_common.py #<> main()