airbrake_deployment 3.57 KB
Newer Older
1
#!/usr/bin/python
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
# -*- coding: utf-8 -*-

# Copyright 2013 Bruce Pennypacker <bruce@pennypacker.org>
#
# This file is part of Ansible
#
# Ansible is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Ansible is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Ansible.  If not, see <http://www.gnu.org/licenses/>.

DOCUMENTATION = '''
---
module: airbrake_deployment
version_added: "1.2"
author: Bruce Pennypacker
short_description: Notify airbrake about app deployments
description:
   - Notify airbrake about app deployments (see http://help.airbrake.io/kb/api-2/deploy-tracking)
options:
  token:
    description:
      - API token.
    required: true
  environment:
    description:
      - The airbrake environment name, typically 'production', 'staging', etc.
    required: true
  user:
    description:
      - The username of the person doing the deployment
    required: false
  repo:
    description:
      - URL of the project repository
    required: false
  revision:
    description:
      - A hash, number, tag, or other identifier showing what revision was deployed
    required: false

# informational: requirements for nodes
requirements: [ urllib, urllib2 ]
'''

EXAMPLES = '''
56 57 58 59
- airbrake_deployment: token=AAAAAA
                       environment='staging'
                       user='ansible'
                       revision=4.2
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
'''

HAS_URLLIB = True
try:
    import urllib
except ImportError:
    HAS_URLLIB = False

HAS_URLLIB2 = True
try:
    import urllib2
except ImportError:
    HAS_URLLIB2 = False

# ===========================================
# Module execution.
#

def main():

    if not HAS_URLLIB:
        module.fail_json(msg="urllib is not installed")
    if not HAS_URLLIB2:
        module.fail_json(msg="urllib2 is not installed")

    module = AnsibleModule(
        argument_spec=dict(
            token=dict(required=True),
            environment=dict(required=True),
            user=dict(required=False),
            repo=dict(required=False),
            revision=dict(required=False),
        ),
        supports_check_mode=True
    )

    # build list of params
    params = {}

    if module.params["environment"]:
        params["deploy[rails_env]"] = module.params["environment"]

    if module.params["user"]:
        params["deploy[local_username]"] = module.params["user"]

    if module.params["repo"]:
        params["deploy[scm_repository]"] = module.params["repo"]

    if module.params["revision"]:
        params["deploy[scm_revision]"] = module.params["revision"]

    params["api_key"] = module.params["token"]

    # If we're in check mode, just exit pretending like we succeeded
    if module.check_mode:
        module.exit_json(changed=True)

    # Send the data to airbrake
    try:
        req = urllib2.Request("https://airbrake.io/deploys", urllib.urlencode(params))
        result=urllib2.urlopen(req)
    except Exception, e:
        module.fail_json(msg="unable to update airbrake: %s" % e)
    else:
        if result.code == 200:
            module.exit_json(changed=True)
        else:
            module.fail_json(msg="HTTP result code: %d" % result.code)

129
# import module snippets
130
from ansible.module_utils.basic import *
131 132
main()