1#!/usr/local/bin/python3.8 2# -*- coding: utf-8 -*- 3# 4# Copyright: Ansible Project 5# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) 6 7from __future__ import absolute_import, division, print_function 8__metaclass__ = type 9 10 11DOCUMENTATION = ''' 12--- 13module: grove 14short_description: Sends a notification to a grove.io channel 15description: 16 - The C(grove) module sends a message for a service to a Grove.io 17 channel. 18options: 19 channel_token: 20 type: str 21 description: 22 - Token of the channel to post to. 23 required: true 24 service: 25 type: str 26 description: 27 - Name of the service (displayed as the "user" in the message) 28 required: false 29 default: ansible 30 message_content: 31 type: str 32 description: 33 - Message content. 34 - The alias I(message) is deprecated and will be removed in community.general 4.0.0. 35 required: true 36 aliases: 37 - message 38 url: 39 type: str 40 description: 41 - Service URL for the web client 42 required: false 43 icon_url: 44 type: str 45 description: 46 - Icon for the service 47 required: false 48 validate_certs: 49 description: 50 - If C(no), SSL certificates will not be validated. This should only be used 51 on personally controlled sites using self-signed certificates. 52 default: 'yes' 53 type: bool 54author: "Jonas Pfenniger (@zimbatm)" 55''' 56 57EXAMPLES = ''' 58- name: Sends a notification to a grove.io channel 59 community.general.grove: 60 channel_token: 6Ph62VBBJOccmtTPZbubiPzdrhipZXtg 61 service: my-app 62 message: 'deployed {{ target }}' 63''' 64 65from ansible.module_utils.basic import AnsibleModule 66from ansible.module_utils.six.moves.urllib.parse import urlencode 67from ansible.module_utils.urls import fetch_url 68 69 70BASE_URL = 'https://grove.io/api/notice/%s/' 71 72# ============================================================== 73# do_notify_grove 74 75 76def do_notify_grove(module, channel_token, service, message, url=None, icon_url=None): 77 my_url = BASE_URL % (channel_token,) 78 79 my_data = dict(service=service, message=message) 80 if url is not None: 81 my_data['url'] = url 82 if icon_url is not None: 83 my_data['icon_url'] = icon_url 84 85 data = urlencode(my_data) 86 response, info = fetch_url(module, my_url, data=data) 87 if info['status'] != 200: 88 module.fail_json(msg="failed to send notification: %s" % info['msg']) 89 90# ============================================================== 91# main 92 93 94def main(): 95 module = AnsibleModule( 96 argument_spec=dict( 97 channel_token=dict(type='str', required=True, no_log=True), 98 message_content=dict(type='str', required=True, aliases=['message'], 99 deprecated_aliases=[dict(name='message', version='4.0.0', 100 collection_name='community.general')]), 101 service=dict(type='str', default='ansible'), 102 url=dict(type='str', default=None), 103 icon_url=dict(type='str', default=None), 104 validate_certs=dict(default=True, type='bool'), 105 ) 106 ) 107 108 channel_token = module.params['channel_token'] 109 service = module.params['service'] 110 message = module.params['message_content'] 111 url = module.params['url'] 112 icon_url = module.params['icon_url'] 113 114 do_notify_grove(module, channel_token, service, message, url, icon_url) 115 116 # Mission complete 117 module.exit_json(msg="OK") 118 119 120if __name__ == '__main__': 121 main() 122