From c9cb0016a02b96c3582761aabae0c959c32c89cb Mon Sep 17 00:00:00 2001 From: Alvaro Aleman Date: Tue, 6 Mar 2018 17:57:04 +0100 Subject: [PATCH] Fix consul module service deregistration (#34847) * Fix consul module service deregistration Upstream pr in the python-consul library: https://github.com/cablehead/python-consul/pull/174 This is based on work from https://github.com/bobh Fixes ansible/ansible#34628 * Pass ACL token when deregistering consul service --- lib/ansible/modules/clustering/consul.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/ansible/modules/clustering/consul.py b/lib/ansible/modules/clustering/consul.py index 72dc892ea22..c44a19e0236 100644 --- a/lib/ansible/modules/clustering/consul.py +++ b/lib/ansible/modules/clustering/consul.py @@ -228,6 +228,16 @@ EXAMPLES = ''' try: import consul from requests.exceptions import ConnectionError + + class PatchedConsulAgentService(consul.Consul.Agent.Service): + def deregister(self, service_id, token=None): + params = {} + if token: + params['token'] = token + return self.agent.http.put(consul.base.CB.bool(), + '/v1/agent/service/deregister/%s' % service_id, + params=params) + python_consul_installed = True except ImportError: python_consul_installed = False @@ -337,18 +347,20 @@ def remove_service(module, service_id): consul_api = get_consul_api(module) service = get_service_by_id_or_name(consul_api, service_id) if service: - consul_api.agent.service.deregister(service_id) + consul_api.agent.service.deregister(service_id, token=module.params.get('token')) module.exit_json(changed=True, id=service_id) module.exit_json(changed=False, id=service_id) def get_consul_api(module, token=None): - return consul.Consul(host=module.params.get('host'), - port=module.params.get('port'), - scheme=module.params.get('scheme'), - verify=module.params.get('validate_certs'), - token=module.params.get('token')) + consulClient = consul.Consul(host=module.params.get('host'), + port=module.params.get('port'), + scheme=module.params.get('scheme'), + verify=module.params.get('validate_certs'), + token=module.params.get('token')) + consulClient.agent.service = PatchedConsulAgentService(consulClient) + return consulClient def get_service_by_id_or_name(consul_api, service_id_or_name):