system-config/playbooks/roles/nodepool-base/library/make_nodepool_zk_hosts.py
Ian Wienand 1ac445b1d9 nodepool-base: prefer ZK IPv6 addresses
The current loop here uses the ansible_host value of the ZK servers,
which we have set to the IPv4 address in the inventory.

nb03 is constantly dropping out of ZK; for the record the logs record:

 2021-04-21 05:56:15,151 WARNING kazoo.client: Connection dropped: socket connection error: Connection reset by peer
 2021-04-21 05:56:15,151 WARNING kazoo.client: Transition to CONNECTING
 2021-04-21 05:56:15,151 INFO kazoo.client: Zookeeper connection lost
 2021-04-21 05:56:15,152 INFO kazoo.client: Connecting to 23.253.90.246(23.253.90.246):2281, use_ssl: True
 2021-04-21 05:56:15,176 INFO kazoo.client: Zookeeper connection established, state: CONNECTED

and this happens every few minutes.  This cloud does IPv4 behind a NAT
and it seems very likely this is related.

So the primary motivation here is to see if using IPv6 clears this up,
giving us some datapoints.  However I think that our other nodepool
hosts should all be fine to use ZK over IPv6.  However, I think in the
gate we may have cases where hosts don't have IPv6 addresses, so this
looks for the v6 address and if not found, falls back to the current
ansible_host behaviour.

Change-Id: Ifde86ddd632662f36bcbe2a0dc99660f06b01ac3
2021-04-21 16:56:07 +10:00

49 lines
1.4 KiB
Python

#!/usr/bin/env python3
#
# Copyright 2020 Red Hat, Inc
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from ansible.module_utils.basic import AnsibleModule
def main():
module = AnsibleModule(
argument_spec=dict(
hostvars=dict(required=True, type='dict'),
zk_group=dict(required=True, type='list'),
)
)
p = module.params
zk_hosts = []
try:
for host in p['zk_group']:
# Prefer public_v6 if set, otherwise ansible_host
addr = None
if 'public_v6' in p['hostvars'][host]:
addr = p['hostvars'][host]['public_v6']
if not addr:
addr = p['hostvars'][host]['ansible_host']
zk_hosts.append(dict(
host=addr,
port=2281
))
module.exit_json(hosts=zk_hosts, changed=True)
except Exception as e:
module.fail_json(msg=str(e), changed=True)
if __name__ == '__main__':
main()