mirror of
https://github.com/ansible/awx.git
synced 2024-11-02 01:21:21 +03:00
421 lines
14 KiB
Python
421 lines
14 KiB
Python
#!/usr/bin/python
|
|
# coding: utf-8 -*-
|
|
|
|
# (c) 2018, Samuel Carpentier <samuelcarpentier0@gmail.ca>
|
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
|
|
from __future__ import absolute_import, division, print_function
|
|
__metaclass__ = type
|
|
|
|
|
|
ANSIBLE_METADATA = {'metadata_version': '1.1',
|
|
'status': ['preview'],
|
|
'supported_by': 'community'}
|
|
|
|
|
|
DOCUMENTATION = '''
|
|
---
|
|
module: tower_notification
|
|
author: "Samuel Carpentier (@samcarpentier)"
|
|
version_added: "2.8"
|
|
short_description: create, update, or destroy Ansible Tower notification.
|
|
description:
|
|
- Create, update, or destroy Ansible Tower notifications. See
|
|
U(https://www.ansible.com/tower) for an overview.
|
|
options:
|
|
name:
|
|
description:
|
|
- The name of the notification.
|
|
required: True
|
|
type: str
|
|
description:
|
|
description:
|
|
- The description of the notification.
|
|
required: False
|
|
type: str
|
|
organization:
|
|
description:
|
|
- The organization the notification belongs to.
|
|
required: False
|
|
type: str
|
|
notification_type:
|
|
description:
|
|
- The type of notification to be sent.
|
|
required: True
|
|
choices: ["email", "slack", "twilio", "pagerduty", "hipchat", "webhook", "irc"]
|
|
type: str
|
|
notification_configuration:
|
|
description:
|
|
- The notification configuration file. Note providing this field would disable all notification-configuration-related fields.
|
|
required: False
|
|
type: str
|
|
username:
|
|
description:
|
|
- The mail server username. Required if I(notification_type=email).
|
|
required: False
|
|
type: str
|
|
sender:
|
|
description:
|
|
- The sender email address. Required if I(notification_type=email).
|
|
required: False
|
|
type: str
|
|
recipients:
|
|
description:
|
|
- The recipients email addresses. Required if I(notification_type=email).
|
|
required: False
|
|
type: list
|
|
use_tls:
|
|
description:
|
|
- The TLS trigger. Required if I(notification_type=email).
|
|
required: False
|
|
type: bool
|
|
host:
|
|
description:
|
|
- The mail server host. Required if I(notification_type=email).
|
|
required: False
|
|
type: str
|
|
use_ssl:
|
|
description:
|
|
- The SSL trigger. Required if I(notification_type=email) or if I(notification_type=irc).
|
|
required: False
|
|
type: bool
|
|
password:
|
|
description:
|
|
- The mail server password. Required if I(notification_type=email) or if I(notification_type=irc).
|
|
required: False
|
|
type: str
|
|
port:
|
|
description:
|
|
- The mail server port. Required if I(notification_type=email) or if I(notification_type=irc).
|
|
required: False
|
|
type: int
|
|
channels:
|
|
description:
|
|
- The destination Slack channels. Required if I(notification_type=slack).
|
|
required: False
|
|
type: list
|
|
token:
|
|
description:
|
|
- The access token. Required if I(notification_type=slack), if I(notification_type=pagerduty) or if I(notification_type=hipchat).
|
|
required: False
|
|
type: str
|
|
account_token:
|
|
description:
|
|
- The Twillio account token. Required if I(notification_type=twillio).
|
|
required: False
|
|
type: str
|
|
from_number:
|
|
description:
|
|
- The source phone number. Required if I(notification_type=twillio).
|
|
required: False
|
|
type: str
|
|
to_numbers:
|
|
description:
|
|
- The destination phone numbers. Required if I(notification_type=twillio).
|
|
required: False
|
|
type: list
|
|
account_sid:
|
|
description:
|
|
- The Twillio account SID. Required if I(notification_type=twillio).
|
|
required: False
|
|
type: str
|
|
subdomain:
|
|
description:
|
|
- The PagerDuty subdomain. Required if I(notification_type=pagerduty).
|
|
required: False
|
|
type: str
|
|
service_key:
|
|
description:
|
|
- The PagerDuty service/integration API key. Required if I(notification_type=pagerduty).
|
|
required: False
|
|
type: str
|
|
client_name:
|
|
description:
|
|
- The PagerDuty client identifier. Required if I(notification_type=pagerduty).
|
|
required: False
|
|
type: str
|
|
message_from:
|
|
description:
|
|
- The label to be shown with the notification. Required if I(notification_type=hipchat).
|
|
required: False
|
|
type: str
|
|
api_url:
|
|
description:
|
|
- The HipChat API URL. Required if I(notification_type=hipchat).
|
|
required: False
|
|
type: str
|
|
color:
|
|
description:
|
|
- The notification color. Required if I(notification_type=hipchat).
|
|
required: False
|
|
choices: ["yellow", "green", "red", "purple", "gray", "random"]
|
|
type: str
|
|
rooms:
|
|
description:
|
|
- HipChat rooms to send the notification to. Required if I(notification_type=hipchat).
|
|
required: False
|
|
type: list
|
|
notify:
|
|
description:
|
|
- The notify channel trigger. Required if I(notification_type=hipchat).
|
|
required: False
|
|
type: bool
|
|
url:
|
|
description:
|
|
- The target URL. Required if I(notification_type=webhook).
|
|
required: False
|
|
type: str
|
|
headers:
|
|
description:
|
|
- The HTTP headers as JSON string. Required if I(notification_type=webhook).
|
|
required: False
|
|
type: dict
|
|
server:
|
|
description:
|
|
- The IRC server address. Required if I(notification_type=irc).
|
|
required: False
|
|
type: str
|
|
nickname:
|
|
description:
|
|
- The IRC nickname. Required if I(notification_type=irc).
|
|
required: False
|
|
type: str
|
|
targets:
|
|
description:
|
|
- The destination channels or users. Required if I(notification_type=irc).
|
|
required: False
|
|
type: list
|
|
state:
|
|
description:
|
|
- Desired state of the resource.
|
|
default: "present"
|
|
choices: ["present", "absent"]
|
|
type: str
|
|
extends_documentation_fragment: awx.awx.auth
|
|
'''
|
|
|
|
|
|
EXAMPLES = '''
|
|
- name: Add Slack notification
|
|
tower_notification:
|
|
name: slack notification
|
|
notification_type: slack
|
|
channels:
|
|
- general
|
|
token: cefda9e2be1f21d11cdd9452f5b7f97fda977f42
|
|
state: present
|
|
tower_config_file: "~/tower_cli.cfg"
|
|
|
|
- name: Add webhook notification
|
|
tower_notification:
|
|
name: webhook notification
|
|
notification_type: webhook
|
|
url: http://www.example.com/hook
|
|
headers:
|
|
X-Custom-Header: value123
|
|
state: present
|
|
tower_config_file: "~/tower_cli.cfg"
|
|
|
|
- name: Add email notification
|
|
tower_notification:
|
|
name: email notification
|
|
notification_type: email
|
|
username: user
|
|
password: s3cr3t
|
|
sender: tower@example.com
|
|
recipients:
|
|
- user1@example.com
|
|
host: smtp.example.com
|
|
port: 25
|
|
use_tls: no
|
|
use_ssl: no
|
|
state: present
|
|
tower_config_file: "~/tower_cli.cfg"
|
|
|
|
- name: Add twilio notification
|
|
tower_notification:
|
|
name: twilio notification
|
|
notification_type: twilio
|
|
account_token: a_token
|
|
account_sid: a_sid
|
|
from_number: '+15551112222'
|
|
to_numbers:
|
|
- '+15553334444'
|
|
state: present
|
|
tower_config_file: "~/tower_cli.cfg"
|
|
|
|
- name: Add PagerDuty notification
|
|
tower_notification:
|
|
name: pagerduty notification
|
|
notification_type: pagerduty
|
|
token: a_token
|
|
subdomain: sub
|
|
client_name: client
|
|
service_key: a_key
|
|
state: present
|
|
tower_config_file: "~/tower_cli.cfg"
|
|
|
|
- name: Add HipChat notification
|
|
tower_notification:
|
|
name: hipchat notification
|
|
notification_type: hipchat
|
|
token: a_token
|
|
message_from: user1
|
|
api_url: https://hipchat.example.com
|
|
color: red
|
|
rooms:
|
|
- room-A
|
|
notify: yes
|
|
state: present
|
|
tower_config_file: "~/tower_cli.cfg"
|
|
|
|
- name: Add IRC notification
|
|
tower_notification:
|
|
name: irc notification
|
|
notification_type: irc
|
|
nickname: tower
|
|
password: s3cr3t
|
|
targets:
|
|
- user1
|
|
port: 8080
|
|
server: irc.example.com
|
|
use_ssl: no
|
|
state: present
|
|
tower_config_file: "~/tower_cli.cfg"
|
|
|
|
- name: Delete notification
|
|
tower_notification:
|
|
name: old notification
|
|
notification_type: email
|
|
state: absent
|
|
tower_config_file: "~/tower_cli.cfg"
|
|
'''
|
|
|
|
|
|
RETURN = ''' # '''
|
|
|
|
|
|
from ..module_utils.ansible_tower import TowerModule, tower_auth_config, tower_check_mode
|
|
|
|
try:
|
|
import tower_cli
|
|
import tower_cli.utils.exceptions as exc
|
|
|
|
from tower_cli.conf import settings
|
|
except ImportError:
|
|
pass
|
|
|
|
|
|
def main():
|
|
argument_spec = dict(
|
|
name=dict(required=True),
|
|
description=dict(required=False),
|
|
organization=dict(required=False),
|
|
notification_type=dict(required=True, choices=['email', 'slack', 'twilio', 'pagerduty', 'hipchat', 'webhook', 'irc']),
|
|
notification_configuration=dict(required=False),
|
|
username=dict(required=False),
|
|
sender=dict(required=False),
|
|
recipients=dict(required=False, type='list'),
|
|
use_tls=dict(required=False, type='bool'),
|
|
host=dict(required=False),
|
|
use_ssl=dict(required=False, type='bool'),
|
|
password=dict(required=False, no_log=True),
|
|
port=dict(required=False, type='int'),
|
|
channels=dict(required=False, type='list'),
|
|
token=dict(required=False, no_log=True),
|
|
account_token=dict(required=False, no_log=True),
|
|
from_number=dict(required=False),
|
|
to_numbers=dict(required=False, type='list'),
|
|
account_sid=dict(required=False),
|
|
subdomain=dict(required=False),
|
|
service_key=dict(required=False, no_log=True),
|
|
client_name=dict(required=False),
|
|
message_from=dict(required=False),
|
|
api_url=dict(required=False),
|
|
color=dict(required=False, choices=['yellow', 'green', 'red', 'purple', 'gray', 'random']),
|
|
rooms=dict(required=False, type='list'),
|
|
notify=dict(required=False, type='bool'),
|
|
url=dict(required=False),
|
|
headers=dict(required=False, type='dict', default={}),
|
|
server=dict(required=False),
|
|
nickname=dict(required=False),
|
|
targets=dict(required=False, type='list'),
|
|
state=dict(choices=['present', 'absent'], default='present'),
|
|
)
|
|
|
|
module = TowerModule(argument_spec=argument_spec, supports_check_mode=True)
|
|
|
|
name = module.params.get('name')
|
|
description = module.params.get('description')
|
|
organization = module.params.get('organization')
|
|
notification_type = module.params.get('notification_type')
|
|
notification_configuration = module.params.get('notification_configuration')
|
|
username = module.params.get('username')
|
|
sender = module.params.get('sender')
|
|
recipients = module.params.get('recipients')
|
|
use_tls = module.params.get('use_tls')
|
|
host = module.params.get('host')
|
|
use_ssl = module.params.get('use_ssl')
|
|
password = module.params.get('password')
|
|
port = module.params.get('port')
|
|
channels = module.params.get('channels')
|
|
token = module.params.get('token')
|
|
account_token = module.params.get('account_token')
|
|
from_number = module.params.get('from_number')
|
|
to_numbers = module.params.get('to_numbers')
|
|
account_sid = module.params.get('account_sid')
|
|
subdomain = module.params.get('subdomain')
|
|
service_key = module.params.get('service_key')
|
|
client_name = module.params.get('client_name')
|
|
message_from = module.params.get('message_from')
|
|
api_url = module.params.get('api_url')
|
|
color = module.params.get('color')
|
|
rooms = module.params.get('rooms')
|
|
notify = module.params.get('notify')
|
|
url = module.params.get('url')
|
|
headers = module.params.get('headers')
|
|
server = module.params.get('server')
|
|
nickname = module.params.get('nickname')
|
|
targets = module.params.get('targets')
|
|
state = module.params.get('state')
|
|
|
|
json_output = {'notification': name, 'state': state}
|
|
|
|
tower_auth = tower_auth_config(module)
|
|
with settings.runtime_values(**tower_auth):
|
|
tower_check_mode(module)
|
|
notification_template = tower_cli.get_resource('notification_template')
|
|
|
|
try:
|
|
org_res = tower_cli.get_resource('organization')
|
|
org = org_res.get(name=organization)
|
|
|
|
if state == 'present':
|
|
result = notification_template.modify(name=name, description=description, organization=org['id'],
|
|
notification_type=notification_type,
|
|
notification_configuration=notification_configuration,
|
|
username=username, sender=sender, recipients=recipients,
|
|
use_tls=use_tls, host=host, use_ssl=use_ssl, password=password,
|
|
port=port, channels=channels, token=token,
|
|
account_token=account_token, from_number=from_number,
|
|
to_numbers=to_numbers, account_sid=account_sid,
|
|
subdomain=subdomain, service_key=service_key,
|
|
client_name=client_name, message_from=message_from,
|
|
api_url=api_url, color=color, rooms=rooms, notify=notify,
|
|
url=url, headers=headers, server=server, nickname=nickname,
|
|
targets=targets, create_on_missing=True)
|
|
json_output['id'] = result['id']
|
|
elif state == 'absent':
|
|
result = notification_template.delete(name=name)
|
|
except (exc.NotFound) as excinfo:
|
|
module.fail_json(msg='Failed to update notification template, organization not found: {0}'.format(excinfo), changed=False)
|
|
except (exc.ConnectionError, exc.BadRequest, exc.AuthError) as excinfo:
|
|
module.fail_json(msg='Failed to update notification template: {0}'.format(excinfo), changed=False)
|
|
|
|
json_output['changed'] = result['changed']
|
|
module.exit_json(**json_output)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|