From 4ca71667972b56438cd38633998878babc58807a Mon Sep 17 00:00:00 2001 From: Samuel Munilla Date: Wed, 18 Nov 2015 10:59:04 -0500 Subject: atomic-openshift-installer: HA for quick installer This adds the ability to quickly set up a multi-master environment. --- utils/src/ooinstall/cli_installer.py | 82 +++++++++++++++++++++++++++++++----- 1 file changed, 72 insertions(+), 10 deletions(-) (limited to 'utils/src/ooinstall/cli_installer.py') diff --git a/utils/src/ooinstall/cli_installer.py b/utils/src/ooinstall/cli_installer.py index 0b3af8829..1b4a67259 100644 --- a/utils/src/ooinstall/cli_installer.py +++ b/utils/src/ooinstall/cli_installer.py @@ -72,7 +72,7 @@ def delete_hosts(hosts): click.echo("\"{}\" doesn't coorespond to any valid input.".format(del_idx)) return hosts, None -def collect_hosts(master_set=False): +def collect_hosts(masters_set=False): """ Collect host information from user. This will later be filled in using ansible. @@ -102,17 +102,20 @@ http://docs.openshift.com/enterprise/latest/architecture/infrastructure_componen hosts = [] more_hosts = True + num_masters = 0 while more_hosts: host_props = {} - hostname_or_ip = click.prompt('Enter hostname or IP address:', - default='', - value_proc=validate_prompt_hostname) - - host_props['connect_to'] = hostname_or_ip - if not master_set: - is_master = click.confirm('Will this host be an OpenShift Master?') - host_props['master'] = is_master - master_set = is_master + host_props['connect_to'] = click.prompt('Enter hostname or IP address:', + default='', + value_proc=validate_prompt_hostname) + + if not masters_set: + if click.confirm('Will this host be an OpenShift Master?'): + host_props['master'] = True + num_masters += 1 + if num_masters >= 3: + masters_set = True + hosts.append(collect_ha_proxy()) host_props['node'] = True #TODO: Reenable this option once container installs are out of tech preview @@ -132,6 +135,29 @@ http://docs.openshift.com/enterprise/latest/architecture/infrastructure_componen more_hosts = click.confirm('Do you want to add additional hosts?') return hosts +def collect_ha_proxy(): + """ + Get an HA proxy from the user + """ + message = """ +Setting up High Availability Masters requires a load balancing solution. +Please provide a host that will be configured as a proxy. This can either be +an existing load balancer configured to balance all masters on port 8443 or a +new host that will have HAProxy installed on it. +""" + click.echo(message) + host_props = {} + host_props['connect_to'] = click.prompt('Enter hostname or IP address:', + default='', + value_proc=validate_prompt_hostname) + host_props['run_on'] = click.confirm('Is this a clean host you want to install HAProxy on?') + host_props['master'] = False + host_props['node'] = False + host_props['ha_proxy'] = True + ha_proxy = Host(**host_props) + + return ha_proxy + def confirm_hosts_facts(oo_cfg, callback_facts): hosts = oo_cfg.hosts click.clear() @@ -199,6 +225,40 @@ Edit %s with the desired values and run `atomic-openshift-installer --unattended sys.exit(0) return default_facts + + +def check_hosts_config(oo_cfg): + click.clear() + masters = [host for host in oo_cfg.hosts if host.master] + if len(masters) > 1: + ha_proxy = [host for host in oo_cfg.hosts if host.ha_proxy] + click.echo(ha_proxy) + if len(ha_proxy) > 1: + click.echo('More than one HAProxy specified. Only one proxy is allowed.') + sys.exit(0) + elif len(ha_proxy) == 1: + if ha_proxy[0].master or ha_proxy[0].node: + click.echo('HAProxy is configured as a master or node. Please correct this.') + sys.exit(0) + else: + message = """ +No HAProxy given in config. Either specify one or provide a load balancing solution +of your choice to balance the master API (port 8443) on all master hosts. + +https://docs.openshift.org/latest/install_config/install/advanced_install.html#multiple-masters +""" + confirm_continue(message) + + nodes = [host.node for host in oo_cfg.hosts] + if len(masters) == len(nodes): + message = """ +No dedicated Nodes specified. By default, colocated Masters have their Nodes set to unscheduleable. +Would you like to label the colocated masters as scheduleable? +""" + confirm_continue(message) + + return + def get_variant_and_version(): message = "\nWhich variant would you like to install?\n\n" @@ -555,6 +615,8 @@ def install(ctx, force): else: oo_cfg = get_missing_info_from_user(oo_cfg) + check_hosts_config(oo_cfg) + click.echo('Gathering information from hosts...') callback_facts, error = openshift_ansible.default_facts(oo_cfg.hosts, verbose) -- cgit v1.2.3