Пример #1
0
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
Пример #2
0
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
        }
    )
Пример #3
0
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
    ])
Пример #4
0
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
        }
    )
Пример #5
0
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]
    )
Пример #6
0
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']
        }
    )
Пример #7
0
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