1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

Add TCP healthcheck support for services registered by consul module (#1144) (#1202)

* Add support for consul tcp health check

* Fix consul tcp example

* Remove trailing spaces

* Add changelog fragment

* Add format in description

* Use regex for tcp

* Review fix

(cherry picked from commit e13ca30e01)

Co-authored-by: Dmatrix <Dimasebakovgoo@gmail.com>
This commit is contained in:
patchback[bot] 2020-10-30 06:47:59 +01:00 committed by GitHub
parent bf9a6c08d0
commit 29819e04ec
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 4 deletions

View file

@ -0,0 +1,3 @@
---
minor_changes:
- consul - added support for tcp checks (https://github.com/ansible-collections/community.general/issues/1128).

View file

@ -120,6 +120,14 @@ options:
Similar to the interval this is a number with a s or m suffix to Similar to the interval this is a number with a s or m suffix to
signify the units of seconds or minutes e.g C(15s) or C(1m). If no suffix signify the units of seconds or minutes e.g C(15s) or C(1m). If no suffix
is supplied, C(m) will be used by default e.g. C(1) will be C(1m) is supplied, C(m) will be used by default e.g. C(1) will be C(1m)
tcp:
type: str
description:
- Checks can be registered with a TCP port. This means that consul
will check if the connection attempt to that port is successful (that is, the port is currently accepting connections).
The format is C(host:port), for example C(localhost:80).
I(interval) must also be provided with this option.
version_added: '1.3.0'
http: http:
type: str type: str
description: description:
@ -151,6 +159,13 @@ EXAMPLES = '''
script: curl http://localhost script: curl http://localhost
interval: 60s interval: 60s
- name: register nginx with a tcp check
community.general.consul:
service_name: nginx
service_port: 80
interval: 60s
tcp: localhost:80
- name: Register nginx with an http check - name: Register nginx with an http check
community.general.consul: community.general.consul:
service_name: nginx service_name: nginx
@ -217,6 +232,7 @@ try:
except ImportError: except ImportError:
python_consul_installed = False python_consul_installed = False
import re
from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.basic import AnsibleModule
@ -274,6 +290,7 @@ def add_check(module, check):
script=check.script, script=check.script,
interval=check.interval, interval=check.interval,
ttl=check.ttl, ttl=check.ttl,
tcp=check.tcp,
http=check.http, http=check.http,
timeout=check.timeout, timeout=check.timeout,
service_id=check.service_id) service_id=check.service_id)
@ -346,11 +363,11 @@ def get_service_by_id_or_name(consul_api, service_id_or_name):
def parse_check(module): def parse_check(module):
if len([p for p in (module.params.get('script'), module.params.get('ttl'), module.params.get('http')) if p]) > 1: if len([p for p in (module.params.get('script'), module.params.get('ttl'), module.params.get('tcp'), module.params.get('http')) if p]) > 1:
module.fail_json( module.fail_json(
msg='checks are either script, http or ttl driven, supplying more than one does not make sense') msg='checks are either script, tcp, http or ttl driven, supplying more than one does not make sense')
if module.params.get('check_id') or module.params.get('script') or module.params.get('ttl') or module.params.get('http'): if module.params.get('check_id') or module.params.get('script') or module.params.get('ttl') or module.params.get('tcp') or module.params.get('http'):
return ConsulCheck( return ConsulCheck(
module.params.get('check_id'), module.params.get('check_id'),
@ -361,6 +378,7 @@ def parse_check(module):
module.params.get('interval'), module.params.get('interval'),
module.params.get('ttl'), module.params.get('ttl'),
module.params.get('notes'), module.params.get('notes'),
module.params.get('tcp'),
module.params.get('http'), module.params.get('http'),
module.params.get('timeout'), module.params.get('timeout'),
module.params.get('service_id'), module.params.get('service_id'),
@ -446,7 +464,7 @@ class ConsulService():
class ConsulCheck(object): class ConsulCheck(object):
def __init__(self, check_id, name, node=None, host='localhost', def __init__(self, check_id, name, node=None, host='localhost',
script=None, interval=None, ttl=None, notes=None, http=None, timeout=None, service_id=None): script=None, interval=None, ttl=None, notes=None, tcp=None, http=None, timeout=None, service_id=None):
self.check_id = self.name = name self.check_id = self.name = name
if check_id: if check_id:
self.check_id = check_id self.check_id = check_id
@ -458,6 +476,7 @@ class ConsulCheck(object):
self.interval = self.validate_duration('interval', interval) self.interval = self.validate_duration('interval', interval)
self.ttl = self.validate_duration('ttl', ttl) self.ttl = self.validate_duration('ttl', ttl)
self.script = script self.script = script
self.tcp = tcp
self.http = http self.http = http
self.timeout = self.validate_duration('timeout', timeout) self.timeout = self.validate_duration('timeout', timeout)
@ -475,6 +494,18 @@ class ConsulCheck(object):
self.check = consul.Check.http(http, self.interval, self.timeout) self.check = consul.Check.http(http, self.interval, self.timeout)
if tcp:
if interval is None:
raise Exception('tcp check must specify interval')
regex = r"(?P<host>.*)(?::)(?P<port>(?:[0-9]+))$"
match = re.match(regex, tcp)
if match is None:
raise Exception('tcp check must be in host:port format')
self.check = consul.Check.tcp(match.group('host').strip('[]'), int(match.group('port')), self.interval)
def validate_duration(self, name, duration): def validate_duration(self, name, duration):
if duration: if duration:
duration_units = ['ns', 'us', 'ms', 's', 'm', 'h'] duration_units = ['ns', 'us', 'ms', 's', 'm', 'h']
@ -508,6 +539,7 @@ class ConsulCheck(object):
self._add(data, 'host') self._add(data, 'host')
self._add(data, 'interval') self._add(data, 'interval')
self._add(data, 'ttl') self._add(data, 'ttl')
self._add(data, 'tcp')
self._add(data, 'http') self._add(data, 'http')
self._add(data, 'timeout') self._add(data, 'timeout')
self._add(data, 'service_id') self._add(data, 'service_id')
@ -547,6 +579,7 @@ def main():
state=dict(default='present', choices=['present', 'absent']), state=dict(default='present', choices=['present', 'absent']),
interval=dict(required=False, type='str'), interval=dict(required=False, type='str'),
ttl=dict(required=False, type='str'), ttl=dict(required=False, type='str'),
tcp=dict(required=False, type='str'),
http=dict(required=False, type='str'), http=dict(required=False, type='str'),
timeout=dict(required=False, type='str'), timeout=dict(required=False, type='str'),
tags=dict(required=False, type='list'), tags=dict(required=False, type='list'),