mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
* 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:
parent
bf9a6c08d0
commit
29819e04ec
2 changed files with 40 additions and 4 deletions
|
@ -0,0 +1,3 @@
|
||||||
|
---
|
||||||
|
minor_changes:
|
||||||
|
- consul - added support for tcp checks (https://github.com/ansible-collections/community.general/issues/1128).
|
|
@ -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'),
|
||||||
|
|
Loading…
Reference in a new issue