def update(site: str, restart_service: bool, ssh_user: str, private_key: str, python_interpreter: str, ssh_common_args: str) -> bool: ar = AnsibleRunner( inventory=[f'{playbook_path}/inventory.d/90_os_inventory.sh']) hosts = ar.inventory_manager.get_hosts() user_hosts = [get_host_info(h) for h in hosts if is_user_host(h, site)] infra_host = get_infra_host(hosts, site) if not infra_host: log.error(f'No r_infra host found for site {site}') return False rancher_host = get_rancher_host(hosts) rancher_host.vars['ansible_ssh_user'] = ssh_user rancher_host.vars['ansible_ssh_private_key_file'] = private_key rancher_host.vars['ansible_python_interpreter'] = python_interpreter rancher_host.vars['ansible_ssh_common_args'] = ssh_common_args success = ar.play(f'{playbook_path}/update_landscaper.yml', extra_vars={ 'INFRA_HOST': infra_host.vars['ansible_ssh_host'], 'USER_HOSTS': user_hosts }) if success and restart_service: recap_stack([ 'restart', site, '--infrastructures', 'r_infra', '--services', 'landscaper' ]) return success
def connect_sites(playbook_path: str, inter_network: str, inter_ports: List[str], sites: List[str], site_addresses: List[str], name: str, network: str, router_ip: str) -> bool: p2p_network_name = _get_p2p_network_name(sites) p2p_subnet_name = _get_p2p_subnet_name(sites) network_name = _get_internal_network_name(name) subnet_name = _get_internal_subnet_name(name) router_name = _get_internal_router_name(name) site_routers = [_get_internal_router_name(s) for s in sites] ar = AnsibleRunner() print("network_name: " + network_name) print("subnet_name: " + subnet_name) print("network: " + network) print("router_name: " + router_name) print("router_ip: " + router_ip) return ar.play( playbook=f'{playbook_path}/connect_sites.yml', extra_vars={ 'INTER_NETWORK_NAME': p2p_network_name, 'INTER_SUBNET_NAME': p2p_subnet_name, 'INTER_NETWORK_ADDRESS': inter_network, 'SITES': [ { 'INTER_PORT': inter_ports[0], 'ROUTER_NAME': site_routers[0], 'OTHER_NETWORK_ADDRESS': site_addresses[1], 'OTHER_PORT': inter_ports[1] }, { 'INTER_PORT': inter_ports[1], 'ROUTER_NAME': site_routers[1], 'OTHER_NETWORK_ADDRESS': site_addresses[0], 'OTHER_PORT': inter_ports[0] } ], 'NETWORK_NAME': network_name, 'SUBNET_NAME': subnet_name, 'NETWORK_ADDRESS': network, 'ROUTER_NAME': router_name, 'ROUTER_IP': router_ip } )
def init_master(playbook_path: str, site: str, public_key: str, private_key: str, rancher_sites: List[str]) -> bool: ar = AnsibleRunner() vm_name = _get_rancher_master_vm_name(site) network_name = _get_internal_network_name(site) router_name = _get_internal_router_name(site) host_available = ar.play( playbook=f'{playbook_path}/init_master.yml', extra_vars={ 'VM_NAME': vm_name, 'NETWORK_NAME': network_name, 'ROUTER_NAME': router_name, 'SITE_NAME': site, 'PUBLIC_KEY_FILE': public_key, 'PRIVATE_KEY_FILE': private_key } ) if not host_available: return False host_vars = ar.inventory_manager.get_host(vm_name).get_vars() host = host_vars.get('ansible_host') python_interpreter = host_vars.get('ansible_python_interpreter') username = host_vars.get('ansible_user') print(rancher_sites) return init_rancher([ '--host', host, '--username', username, '--private-key-file', private_key, '--python-interpreter', python_interpreter, '--pip-executable', '/home/core/bin/pip', '--pip-as-non-root', '--update-config', '--rancher-username', 'recap', '--rancher-password', 'recap$123', '--rancher-env-name', 'recap', '--rancher-registry-url', 'omi-registry.e-technik.uni-ulm.de', '--rancher-registry-username', 'recap_pipeline', '--rancher-registry-password', '53qThb2ZDUaXc3L49bs8', '--rancher-sites', *rancher_sites ])
def add_site(playbook_path: str, name: str, network: str, router_ip: str) -> bool: ar = AnsibleRunner() network_name = _get_internal_network_name(name) subnet_name = _get_internal_subnet_name(name) router_name = _get_internal_router_name(name) return ar.play( playbook=f'{playbook_path}/add_site.yml', extra_vars={ 'NETWORK_NAME': network_name, 'SUBNET_NAME': subnet_name, 'NETWORK_ADDRESS': network, 'ROUTER_NAME': router_name, 'ROUTER_IP': router_ip } )
def remove(host: Host, ansible_runner: AnsibleRunner, rancher_client: RancherClient) -> bool: ansible_runner.add_host(host) log.info(f'Removing {host} from environment') rancher_host = rancher_client.get_host(host.address) if rancher_host is None: log.warning(f'Host {host.address} was not found in rancher, skipping') return False deleted_from_rancher = rancher_client.delete_host(rancher_host) if not deleted_from_rancher: log.warning( f'Host {host} was not deleted from Rancher master, skipping') return False return ansible_runner.play( f'{_playbook_path}/remove_host.yml', targets=[host.address] )
def add(host: Host, ansible_runner: AnsibleRunner, rancher: RancherClient, pip_executable: str = 'pip', pip_as_root: bool = True) -> bool: ansible_runner.add_host(host) log.info(f'Adding {host} to environment') return ansible_runner.play( f'{_playbook_path}/add_host.yml', targets=[host.address], extra_vars={ 'RANCHER_SERVER_URL': rancher.url, 'RANCHER_ENV_ID': rancher.env_id, 'RANCHER_REG_TOKEN': rancher.get_registration_token(), 'HOST_ID': host.address, 'HOST_TYPE': host.variables['type'], 'HOST_SITE': host.variables['site'], 'PIP_EXECUTABLE': pip_executable, 'PIP_AS_ROOT': 'yes' if pip_as_root else 'no', 'EXTRA_LABELS': host.variables['extra_labels'] } )
def add_host(playbook_path: str, site: str, host_type: str, instance: int, public_key: str, private_key: str, vm_flavour: str, vm_availability_zone: str, extra_labels: Dict[str, str], is_master: bool = False) -> bool: ar = AnsibleRunner() vm_name = _get_host_vm_name(site, host_type, instance) network_name = _get_internal_network_name(site) master_host = _get_master_address() if "global" == host_type: current_playbook = f'{playbook_path}/add_host_fip.yml' else: current_playbook = f'{playbook_path}/add_host.yml' host_available = ar.play( playbook=current_playbook, extra_vars={ 'VM_NAME': vm_name, 'NETWORK_NAME': network_name, 'SITE_NAME': site, 'TYPE': host_type, 'MASTER_HOST': master_host, 'PUBLIC_KEY_FILE': public_key, 'PRIVATE_KEY_FILE': private_key, 'VM_FLAVOUR': vm_flavour, 'VM_AZ': vm_availability_zone } ) if not host_available: return False host_vars = ar.inventory_manager.get_host(vm_name).get_vars() host = host_vars.get('ansible_host') python_interpreter = host_vars.get('ansible_python_interpreter') username = host_vars.get('ansible_user') if is_master: extra_labels['master'] = 'true' if "global" == host_type: env(['set', "GLOBAL_ADDRESS", host]) agent_added = add_agent([ 'add', host, '--infrastructure', host_type, '--site', site, '--username', username, '--private-key-file', private_key, '--start-stack', '--python-interpreter', python_interpreter, '--pip-executable', '/home/core/bin/pip', '--pip-as-non-root', '--proxy-host', master_host, '--extra-labels', get_labels_string(extra_labels) or None ]) services = { 'admin': getenv('SERVICES_ADMIN').split(','), 'global': getenv('SERVICES_GLOBAL').split(','), 'r_infra': getenv('SERVICES_INFRA').split(','), 'r_user': getenv('SERVICES_USER').split(',') } # if agent_added and host_type == 'r_user': # result = update_landscaper(site=site, # restart_service=True, # ssh_user=username, # private_key=private_key, # python_interpreter=python_interpreter, # ssh_common_args='-o StrictHostKeyChecking=no') # if not result: # log.warning('There was an error updating the landscaper') return agent_added