mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-04-27 21:01:27 -07:00
* openstack: standardize tls params * tower: tower_verify_ssl->validate_certs * docker: use standard tls config params - cacert_path -> ca_cert - cert_path -> client_cert - key_path -> client_key - tls_verify -> validate_certs * k8s: standardize tls connection params - verify_ssl -> validate_certs - ssl_ca_cert -> ca_cert - cert_file -> client_cert - key_file -> client_key * ingate: verify_ssl -> validate_certs * manageiq: standardize tls params - verify_ssl -> validate_certs - ca_bundle_path -> ca_cert * mysql: standardize tls params - ssl_ca -> ca_cert - ssl_cert -> client_cert - ssl_key -> client_key * nios: ssl_verify -> validate_certs * postgresql: ssl_rootcert -> ca_cert * rabbitmq: standardize tls params - cacert -> ca_cert - cert -> client_cert - key -> client_key * rackspace: verify_ssl -> validate_certs * vca: verify_certs -> validate_certs * kubevirt_cdi_upload: upload_host_verify_ssl -> upload_host_validate_certs * lxd: standardize tls params - key_file -> client_key - cert_file -> client_cert * get_certificate: ca_certs -> ca_cert * get_certificate.py: clarify one or more certs in a file Co-Authored-By: jamescassell <code@james.cassell.me> * zabbix: tls_issuer -> ca_cert * bigip_device_auth_ldap: standardize tls params - ssl_check_peer -> validate_certs - ssl_client_cert -> client_cert - ssl_client_key -> client_key - ssl_ca_cert -> ca_cert * vdirect: vdirect_validate_certs -> validate_certs * mqtt: standardize tls params - ca_certs -> ca_cert - certfile -> client_cert - keyfile -> client_key * pulp_repo: standardize tls params remove `importer_ssl` prefix * rhn_register: sslcacert -> ca_cert * yum_repository: standardize tls params The fix for yum_repository is not straightforward since this module is only a thin wrapper for the underlying commands and config. In this case, we add the new values as aliases, keeping the old as primary, only due to the internal structure of the module. Aliases added: - sslcacert -> ca_cert - sslclientcert -> client_cert - sslclientkey -> client_key - sslverify -> validate_certs * gitlab_hook: enable_ssl_verification -> hook_validate_certs * Adjust arguments for docker_swarm inventory plugin. * foreman callback: standardize tls params - ssl_cert -> client_cert - ssl_key -> client_key * grafana_annotations: validate_grafana_certs -> validate_certs * nrdp callback: validate_nrdp_certs -> validate_certs * kubectl connection: standardize tls params - kubectl_cert_file -> client_cert - kubectl_key_file -> client_key - kubectl_ssl_ca_cert -> ca_cert - kubectl_verify_ssl -> validate_certs * oc connection: standardize tls params - oc_cert_file -> client_cert - oc_key_file -> client_key - oc_ssl_ca_cert -> ca_cert - oc_verify_ssl -> validate_certs * psrp connection: cert_trust_path -> ca_cert TODO: cert_validation -> validate_certs (multi-valued vs bool) * k8s inventory: standardize tls params - cert_file -> client_cert - key_file -> client_key - ca_cert -> ca_cert - verify_ssl -> validate_certs * openshift inventory: standardize tls params - cert_file -> client_cert - key_file -> client_key - ca_cert -> ca_cert - verify_ssl -> validate_certs * tower inventory: verify_ssl -> validate_certs * hashi_vault lookup: cacert -> ca_cert * k8s lookup: standardize tls params - cert_file -> client_cert - key_file -> client_key - ca_cert -> ca_cert - verify_ssl -> validate_certs * laps_passord lookup: cacert_file -> ca_cert * changelog for TLS parameter standardization
297 lines
9.4 KiB
Python
297 lines
9.4 KiB
Python
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# Copyright: (c) 2015, Manuel Sousa <manuel.sousa@gmail.com>
|
|
# 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: rabbitmq_binding
|
|
author: Manuel Sousa (@manuel-sousa)
|
|
version_added: "2.0"
|
|
|
|
short_description: Manage rabbitMQ bindings
|
|
description:
|
|
- This module uses rabbitMQ REST APIs to create / delete bindings.
|
|
requirements: [ "requests >= 1.0.0" ]
|
|
options:
|
|
state:
|
|
description:
|
|
- Whether the bindings should be present or absent.
|
|
choices: [ "present", "absent" ]
|
|
default: present
|
|
name:
|
|
description:
|
|
- source exchange to create binding on.
|
|
required: true
|
|
aliases: [ "src", "source" ]
|
|
destination:
|
|
description:
|
|
- destination exchange or queue for the binding.
|
|
required: true
|
|
aliases: [ "dst", "dest" ]
|
|
destination_type:
|
|
description:
|
|
- Either queue or exchange.
|
|
required: true
|
|
choices: [ "queue", "exchange" ]
|
|
aliases: [ "type", "dest_type" ]
|
|
routing_key:
|
|
description:
|
|
- routing key for the binding.
|
|
default: "#"
|
|
arguments:
|
|
description:
|
|
- extra arguments for exchange. If defined this argument is a key/value dictionary
|
|
required: false
|
|
default: {}
|
|
extends_documentation_fragment:
|
|
- rabbitmq
|
|
'''
|
|
|
|
EXAMPLES = '''
|
|
# Bind myQueue to directExchange with routing key info
|
|
- rabbitmq_binding:
|
|
name: directExchange
|
|
destination: myQueue
|
|
type: queue
|
|
routing_key: info
|
|
|
|
# Bind directExchange to topicExchange with routing key *.info
|
|
- rabbitmq_binding:
|
|
name: topicExchange
|
|
destination: topicExchange
|
|
type: exchange
|
|
routing_key: '*.info'
|
|
'''
|
|
|
|
import json
|
|
import traceback
|
|
|
|
REQUESTS_IMP_ERR = None
|
|
try:
|
|
import requests
|
|
HAS_REQUESTS = True
|
|
except ImportError:
|
|
REQUESTS_IMP_ERR = traceback.format_exc()
|
|
HAS_REQUESTS = False
|
|
|
|
from ansible.module_utils.six.moves.urllib import parse as urllib_parse
|
|
from ansible.module_utils.basic import AnsibleModule, missing_required_lib
|
|
from ansible.module_utils.rabbitmq import rabbitmq_argument_spec
|
|
|
|
|
|
class RabbitMqBinding(object):
|
|
def __init__(self, module):
|
|
"""
|
|
:param module:
|
|
"""
|
|
self.module = module
|
|
self.name = self.module.params['name']
|
|
self.login_user = self.module.params['login_user']
|
|
self.login_password = self.module.params['login_password']
|
|
self.login_host = self.module.params['login_host']
|
|
self.login_port = self.module.params['login_port']
|
|
self.login_protocol = self.module.params['login_protocol']
|
|
self.vhost = self.module.params['vhost']
|
|
self.destination = self.module.params['destination']
|
|
self.destination_type = 'q' if self.module.params['destination_type'] == 'queue' else 'e'
|
|
self.routing_key = self.module.params['routing_key']
|
|
self.arguments = self.module.params['arguments']
|
|
self.verify = self.module.params['ca_cert']
|
|
self.cert = self.module.params['client_cert']
|
|
self.key = self.module.params['client_key']
|
|
self.props = urllib_parse.quote(self.routing_key) if self.routing_key != '' else '~'
|
|
self.base_url = '{0}://{1}:{2}/api/bindings'.format(self.login_protocol,
|
|
self.login_host,
|
|
self.login_port)
|
|
self.url = '{0}/{1}/e/{2}/{3}/{4}/{5}'.format(self.base_url,
|
|
urllib_parse.quote(self.vhost, safe=''),
|
|
urllib_parse.quote(self.name, safe=''),
|
|
self.destination_type,
|
|
urllib_parse.quote(self.destination, safe=''),
|
|
self.props)
|
|
self.result = {
|
|
'changed': False,
|
|
'name': self.module.params['name'],
|
|
}
|
|
self.authentication = (
|
|
self.login_user,
|
|
self.login_password
|
|
)
|
|
self.request = requests
|
|
self.http_check_states = {
|
|
200: True,
|
|
404: False,
|
|
}
|
|
self.http_actionable_states = {
|
|
201: True,
|
|
204: True,
|
|
}
|
|
self.api_result = self.request.get(self.url, auth=self.authentication)
|
|
|
|
def run(self):
|
|
"""
|
|
:return:
|
|
"""
|
|
self.check_presence()
|
|
self.check_mode()
|
|
self.action_mode()
|
|
|
|
def check_presence(self):
|
|
"""
|
|
:return:
|
|
"""
|
|
if self.check_should_throw_fail():
|
|
self.fail()
|
|
|
|
def change_required(self):
|
|
"""
|
|
:return:
|
|
"""
|
|
if self.module.params['state'] == 'present':
|
|
if not self.is_present():
|
|
return True
|
|
elif self.module.params['state'] == 'absent':
|
|
if self.is_present():
|
|
return True
|
|
return False
|
|
|
|
def is_present(self):
|
|
"""
|
|
:return:
|
|
"""
|
|
return self.http_check_states.get(self.api_result.status_code, False)
|
|
|
|
def check_mode(self):
|
|
"""
|
|
:return:
|
|
"""
|
|
if self.module.check_mode:
|
|
result = self.result
|
|
result['changed'] = self.change_required()
|
|
result['details'] = self.api_result.json() if self.is_present() else self.api_result.text
|
|
result['arguments'] = self.module.params['arguments']
|
|
self.module.exit_json(**result)
|
|
|
|
def check_reply_is_correct(self):
|
|
"""
|
|
:return:
|
|
"""
|
|
if self.api_result.status_code in self.http_check_states:
|
|
return True
|
|
return False
|
|
|
|
def check_should_throw_fail(self):
|
|
"""
|
|
:return:
|
|
"""
|
|
if not self.is_present():
|
|
if not self.check_reply_is_correct():
|
|
return True
|
|
return False
|
|
|
|
def action_mode(self):
|
|
"""
|
|
:return:
|
|
"""
|
|
result = self.result
|
|
if self.change_required():
|
|
if self.module.params['state'] == 'present':
|
|
self.create()
|
|
if self.module.params['state'] == 'absent':
|
|
self.remove()
|
|
if self.action_should_throw_fail():
|
|
self.fail()
|
|
result['changed'] = True
|
|
result['destination'] = self.module.params['destination']
|
|
self.module.exit_json(**result)
|
|
else:
|
|
result['changed'] = False
|
|
self.module.exit_json(**result)
|
|
|
|
def action_reply_is_correct(self):
|
|
"""
|
|
:return:
|
|
"""
|
|
if self.api_result.status_code in self.http_actionable_states:
|
|
return True
|
|
return False
|
|
|
|
def action_should_throw_fail(self):
|
|
"""
|
|
:return:
|
|
"""
|
|
if not self.action_reply_is_correct():
|
|
return True
|
|
return False
|
|
|
|
def create(self):
|
|
"""
|
|
:return:
|
|
"""
|
|
self.url = '{0}/{1}/e/{2}/{3}/{4}'.format(self.base_url,
|
|
urllib_parse.quote(self.vhost, safe=''),
|
|
urllib_parse.quote(self.name, safe=''),
|
|
self.destination_type,
|
|
urllib_parse.quote(self.destination, safe=''))
|
|
self.api_result = self.request.post(self.url,
|
|
auth=self.authentication,
|
|
verify=self.verify,
|
|
cert=(self.cert, self.key),
|
|
headers={"content-type": "application/json"},
|
|
data=json.dumps({
|
|
'routing_key': self.routing_key,
|
|
'arguments': self.arguments
|
|
}))
|
|
|
|
def remove(self):
|
|
"""
|
|
:return:
|
|
"""
|
|
self.api_result = self.request.delete(self.url, auth=self.authentication)
|
|
|
|
def fail(self):
|
|
"""
|
|
:return:
|
|
"""
|
|
self.module.fail_json(
|
|
msg="Unexpected reply from API",
|
|
status=self.api_result.status_code,
|
|
details=self.api_result.text
|
|
)
|
|
|
|
|
|
def main():
|
|
|
|
argument_spec = rabbitmq_argument_spec()
|
|
argument_spec.update(
|
|
dict(
|
|
state=dict(default='present', choices=['present', 'absent'], type='str'),
|
|
name=dict(required=True, aliases=["src", "source"], type='str'),
|
|
destination=dict(required=True, aliases=["dst", "dest"], type='str'),
|
|
destination_type=dict(required=True, aliases=["type", "dest_type"], choices=["queue", "exchange"],
|
|
type='str'),
|
|
routing_key=dict(default='#', type='str'),
|
|
arguments=dict(default=dict(), type='dict')
|
|
)
|
|
)
|
|
module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True)
|
|
|
|
if not HAS_REQUESTS:
|
|
module.fail_json(msg=missing_required_lib("requests"), exception=REQUESTS_IMP_ERR)
|
|
|
|
RabbitMqBinding(module).run()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|