From c9a3b6c3588747b75c7665e332b7e900f4987343 Mon Sep 17 00:00:00 2001 From: Michael DeHaan Date: Thu, 24 Jul 2014 15:21:53 -0400 Subject: [PATCH] Pagerduty corrected misleading blog post, so no problems with them being in core now. Thank you guys! --- library/monitoring/pagerduty | 177 +++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 library/monitoring/pagerduty diff --git a/library/monitoring/pagerduty b/library/monitoring/pagerduty new file mode 100644 index 0000000000..2c89b8f451 --- /dev/null +++ b/library/monitoring/pagerduty @@ -0,0 +1,177 @@ +#!/usr/bin/python + +DOCUMENTATION = ''' + +module: pagerduty +short_description: Create PagerDuty maintenance windows +description: + - This module will let you create PagerDuty maintenance windows +version_added: "1.2" +author: Justin Johns +requirements: + - PagerDuty API access +options: + state: + description: + - Create a maintenance window or get a list of ongoing windows. + required: true + default: null + choices: [ "running", "started", "ongoing" ] + aliases: [] + name: + description: + - PagerDuty unique subdomain. + required: true + default: null + choices: [] + aliases: [] + user: + description: + - PagerDuty user ID. + required: true + default: null + choices: [] + aliases: [] + passwd: + description: + - PagerDuty user password. + required: true + default: null + choices: [] + aliases: [] + service: + description: + - PagerDuty service ID. + required: false + default: null + choices: [] + aliases: [] + hours: + description: + - Length of maintenance window in hours. + required: false + default: 1 + choices: [] + aliases: [] + desc: + description: + - Short description of maintenance window. + required: false + default: Created by Ansible + choices: [] + aliases: [] + validate_certs: + description: + - If C(no), SSL certificates will not be validated. This should only be used + on personally controlled sites using self-signed certificates. + required: false + default: 'yes' + choices: ['yes', 'no'] + version_added: 1.5.1 + +notes: + - This module does not yet have support to end maintenance windows. +''' + +EXAMPLES=''' +# List ongoing maintenance windows. +- pagerduty: name=companyabc user=example@example.com passwd=password123 state=ongoing + +# Create a 1 hour maintenance window for service FOO123. +- pagerduty: name=companyabc + user=example@example.com + passwd=password123 + state=running + service=FOO123 + +# Create a 4 hour maintenance window for service FOO123 with the description "deployment". +- pagerduty: name=companyabc + user=example@example.com + passwd=password123 + state=running + service=FOO123 + hours=4 + desc=deployment +''' + +import json +import datetime +import base64 + + +def ongoing(module, name, user, passwd): + + url = "https://" + name + ".pagerduty.com/api/v1/maintenance_windows/ongoing" + auth = base64.encodestring('%s:%s' % (user, passwd)).replace('\n', '') + headers = {"Authorization": "Basic %s" % auth} + + response, info = fetch_url(module, url, headers=headers) + if info['status'] != 200: + module.fail_json(msg="failed to lookup the ongoing window: %s" % info['msg']) + + return False, response.read() + + +def create(module, name, user, passwd, service, hours, desc): + + now = datetime.datetime.utcnow() + later = now + datetime.timedelta(hours=int(hours)) + start = now.strftime("%Y-%m-%dT%H:%M:%SZ") + end = later.strftime("%Y-%m-%dT%H:%M:%SZ") + + url = "https://" + name + ".pagerduty.com/api/v1/maintenance_windows" + auth = base64.encodestring('%s:%s' % (user, passwd)).replace('\n', '') + headers = { + 'Authorization': 'Basic %s' % auth, + 'Content-Type' : 'application/json', + } + data = json.dumps({'maintenance_window': {'start_time': start, 'end_time': end, 'description': desc, 'service_ids': [service]}}) + + response, info = fetch_url(module, url, data=data, headers=headers, method='POST') + if info['status'] != 200: + module.fail_json(msg="failed to create the window: %s" % info['msg']) + + return False, response.read() + + +def main(): + + module = AnsibleModule( + argument_spec=dict( + state=dict(required=True, choices=['running', 'started', 'ongoing']), + name=dict(required=True), + user=dict(required=True), + passwd=dict(required=True), + service=dict(required=False), + hours=dict(default='1', required=False), + desc=dict(default='Created by Ansible', required=False), + validate_certs = dict(default='yes', type='bool'), + ) + ) + + state = module.params['state'] + name = module.params['name'] + user = module.params['user'] + passwd = module.params['passwd'] + service = module.params['service'] + hours = module.params['hours'] + desc = module.params['desc'] + + if state == "running" or state == "started": + if not service: + module.fail_json(msg="service not specified") + (rc, out) = create(module, name, user, passwd, service, hours, desc) + + if state == "ongoing": + (rc, out) = ongoing(module, name, user, passwd) + + if rc != 0: + module.fail_json(msg="failed", result=out) + + module.exit_json(msg="success", result=out) + +# import module snippets +from ansible.module_utils.basic import * +from ansible.module_utils.urls import * + +main()