From bdada2eca5e9752a4dde393dadb97a255a5ec12b Mon Sep 17 00:00:00 2001 From: Ronelle Landy Date: Tue, 22 Nov 2016 18:05:01 -0500 Subject: [PATCH] Add role to create and delete the OVB stack For environments where OVB is run on an Openstack host cloud, this role contains the functionality to manage the heat stack. The associated playbooks are included. Change-Id: I6270000613b1883a4f729faee3d255fd08624c13 --- playbooks/ovb-create-stack.yml | 18 ++ playbooks/ovb-delete-stack.yml | 5 + roles/ovb-manage-stack/README.md | 90 ++++++ roles/ovb-manage-stack/defaults/main.yml | 78 ++++++ roles/ovb-manage-stack/library/os_stack.py | 262 ++++++++++++++++++ .../tasks/get-undercloud-image.yml | 31 +++ roles/ovb-manage-stack/tasks/main.yml | 12 + .../tasks/ovb-create-stack.yml | 114 ++++++++ .../tasks/ovb-delete-stack.yml | 19 ++ .../tasks/ovb-setup-undercloud.yml | 28 ++ .../ovb-manage-stack/templates/clouds.yaml.j2 | 9 + roles/ovb-manage-stack/templates/env.yaml.j2 | 57 ++++ .../setup-undercloud-connectivity.sh.j2 | 57 ++++ 13 files changed, 780 insertions(+) create mode 100644 playbooks/ovb-create-stack.yml create mode 100644 playbooks/ovb-delete-stack.yml create mode 100644 roles/ovb-manage-stack/README.md create mode 100644 roles/ovb-manage-stack/defaults/main.yml create mode 100644 roles/ovb-manage-stack/library/os_stack.py create mode 100644 roles/ovb-manage-stack/tasks/get-undercloud-image.yml create mode 100644 roles/ovb-manage-stack/tasks/main.yml create mode 100644 roles/ovb-manage-stack/tasks/ovb-create-stack.yml create mode 100644 roles/ovb-manage-stack/tasks/ovb-delete-stack.yml create mode 100644 roles/ovb-manage-stack/tasks/ovb-setup-undercloud.yml create mode 100644 roles/ovb-manage-stack/templates/clouds.yaml.j2 create mode 100644 roles/ovb-manage-stack/templates/env.yaml.j2 create mode 100644 roles/ovb-manage-stack/templates/setup-undercloud-connectivity.sh.j2 diff --git a/playbooks/ovb-create-stack.yml b/playbooks/ovb-create-stack.yml new file mode 100644 index 000000000..564d99ebe --- /dev/null +++ b/playbooks/ovb-create-stack.yml @@ -0,0 +1,18 @@ +--- +- name: Create the OVB stack + hosts: localhost + roles: + - { role: ovb-manage-stack, ovb_manage_stack_mode: 'create' } + +- name: Inventory the undercloud instance + hosts: localhost + gather_facts: yes + roles: + - { role: tripleo-inventory } + +- name: Setup the undercloud + hosts: undercloud + vars: + ansible_ssh_user: root + roles: + - { role: ovb-manage-stack, ovb_manage_stack_mode: 'setup-undercloud' } diff --git a/playbooks/ovb-delete-stack.yml b/playbooks/ovb-delete-stack.yml new file mode 100644 index 000000000..72a3cc1f7 --- /dev/null +++ b/playbooks/ovb-delete-stack.yml @@ -0,0 +1,5 @@ +--- +- name: clean up heat stack + hosts: localhost + roles: + - { role: ovb-manage-stack, ovb_manage_stack_mode: 'delete' } diff --git a/roles/ovb-manage-stack/README.md b/roles/ovb-manage-stack/README.md new file mode 100644 index 000000000..2ab6869a3 --- /dev/null +++ b/roles/ovb-manage-stack/README.md @@ -0,0 +1,90 @@ +Role Name +========= + +Ansible roles for managing a heat stack to deploy an OpenStack cloud using OpenStack Virtual Baremetal. + +Requirements +------------ + +These roles assume that the host cloud has already been patched as per +https://github.com/cybertron/openstack-virtual-baremetal/blob/master/README.rst#patching-the-host-cloud. + +Role Variables +-------------- + +**Note:** Make sure to include all environment file and options from your [initial Overcloud creation](http://docs.openstack.org/developer/tripleo-docs/basic_deployment/basic_deployment_cli.html#deploy-the-overcloud) + +To interact with the Openstack Virtual Baremetal host cloud, credentials are needed: +- os_username: +- os_password: +- os_tenant_name: +- os_auth_url: # For example http://190.1.1.5:5000/v2.0 + +Parameters required to access the stack: +- prefix --used as in id for the image and the stack parameters +- stack_name: <'oooq-{{ prefix }}stack'> -- name for OVB heat stack +- rc_file: -- file to reference the overcloud +- node_name: 'undercloud' +- existing_key_location: -- required to access the undercloud node +- ssh_extra_args: <'-F "{{ local_working_dir }}/ssh.config.ansible"'> +- undercoud_key: <"{{ local_working_dir }}/id_rsa_undercloud"> + +Parameters required for shade (See defaults/main.yml for default values): +- heat_template +- environment_list + +Parameters used the env.yaml file to create the OVB heat stack (See defaults/main.yml for default values): +- bmc_flavor +- bmc_image +- bmc_prefix +- baremetal_flavor +- baremetal_image +- baremetal_prefix +- key_name +- private_net +- node_count +- public_net +- provision_net +- undercloud_name +- undercloud_image +- undercloud_flavor +- external_net +- templates_dir +- ovb_dir +- network_isolation_type: -- other options are 'none' and 'public-bond' + +Parameters required to setup the undercloud: +- mtu: <1350> +- mtu_interface: +- pvt_nameserver: <8.8.8.8> -- on some internal clouds external servers are blocked +- external_interface: +- external_interface_ip: <10.0.0.1> +- external_interface_netmask: <255.255.255.0> + +- registered_releases -- releases for which images should be available for the undercloud + +Dependencies +------------ + +This playbook depends on the shade library and https://github.com/cybertron/openstack-virtual-baremetal. + +Example Playbook +---------------- + +Playbooks to create the strack prior to TripleO Quickstart deployments will require: + +- name: Create the OVB stack + hosts: localhost + roles: + - { role: ovb-manage-stack, ovb_manage_stack_mode: 'create' } + +License +------- + +Apache + +Author Information +------------------ + +RDO-CI Team + diff --git a/roles/ovb-manage-stack/defaults/main.yml b/roles/ovb-manage-stack/defaults/main.yml new file mode 100644 index 000000000..52d7d2f20 --- /dev/null +++ b/roles/ovb-manage-stack/defaults/main.yml @@ -0,0 +1,78 @@ +--- +# defaults for all ovb-stack related tasks +local_working_dir: "{{ lookup('env', 'HOME') }}/.quickstart" +working_dir: /home/stack + +release: mitaka + +node: + prefix: + - "{{ 1000 |random }}" + - "{{ lookup('env', 'USER') }}" + - "{{ lookup('env', 'BUILD_NUMBER') }}" +tmp: + node_prefix: '{{ node.prefix | reject("none") | join("-") }}-' + +os_username: admin +os_password: password +os_tenant_name: admin +os_auth_url: 'http://10.0.1.10:5000/v2.0' +cloud_name: qeos7 + +stack_name: 'oooq-{{ prefix }}stack' +rc_file: /home/stack/overcloudrc +node_name: 'undercloud' +ssh_extra_args: '-F "{{ local_working_dir }}/ssh.config.ansible"' +undercoud_key: "{{ local_working_dir }}/id_rsa_undercloud" +node_groups: + - 'undercloud' + - 'tester' +templates_dir: "{{ local_working_dir }}/openstack-virtual-baremetal/templates" +ovb_dir: "{{ local_working_dir }}/openstack-virtual-baremetal" +heat_template: "{{ templates_dir }}/quintupleo.yaml" +environment_list: + - "{{ templates_dir }}/resource-registry.yaml" + - "{{ local_working_dir }}/{{ prefix }}env.yaml" + +existing_key_location: '{{ local_working_dir }}' +remove_image_from_host_cloud: false + +bmc_flavor: m1.medium +bmc_image: 'bmc-base' +bmc_prefix: '{{ prefix }}bmc' + +baremetal_flavor: m1.large +baremetal_image: 'ipxe-boot' +baremetal_prefix: '{{ prefix }}baremetal' + +key_name: '{{ prefix }}key' +private_net: '{{ prefix }}private' +node_count: 2 +public_net: '{{ prefix }}public' +provision_net: '{{ prefix }}provision' + +# QuintupleO-specific params ignored by virtual-baremetal.yaml +undercloud_name: '{{ prefix }}undercloud' +undercloud_image: '{{ prefix }}undercloud.qcow2' +undercloud_flavor: m1.xlarge +external_net: '10.2.1.0/22' + +network_isolation_type: multi-nic + +setup_undercloud_connectivity_log: "{{ working_dir }}/setup_undercloud_connectivity.log" + +mtu: 1350 +mtu_interface: + - eth1 +pvt_nameserver: 8.8.8.8 + +external_interface: eth2 +external_interface_ip: 10.0.0.1 +external_interface_netmask: 255.255.255.0 + +registered_releases: + - mitaka + - newton + - master + - rhos-9 + diff --git a/roles/ovb-manage-stack/library/os_stack.py b/roles/ovb-manage-stack/library/os_stack.py new file mode 100644 index 000000000..78084fb67 --- /dev/null +++ b/roles/ovb-manage-stack/library/os_stack.py @@ -0,0 +1,262 @@ +#!/usr/bin/python +#coding: utf-8 -*- + +# (c) 2016, Mathieu Bultel +# (c) 2016, Steve Baker +# +# This module is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This software is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this software. If not, see . + +from time import sleep +from distutils.version import StrictVersion +try: + import shade + HAS_SHADE = True +except ImportError: + HAS_SHADE = False + +DOCUMENTATION = ''' +--- +module: os_stack +short_description: Add/Remove Heat Stack +extends_documentation_fragment: openstack +version_added: "2.2" +author: "Mathieu Bultel (matbu), Steve Baker (steveb)" +description: + - Add or Remove a Stack to an OpenStack Heat +options: + state: + description: + - Indicate desired state of the resource + choices: ['present', 'absent'] + required: false + default: present + name: + description: + - Name of the stack that should be created, name could be char and digit, no space + required: true + template: + description: + - Path of the template file to use for the stack creation + required: false + default: None + environment: + description: + - List of environment files that should be used for the stack creation + required: false + default: None + parameters: + description: + - Dictionary of parameters for the stack creation + required: false + default: None + rollback: + description: + - Rollback stack creation + required: false + default: false + timeout: + description: + - Maximum number of seconds to wait for the stack creation + required: false + default: 3600 +requirements: + - "python >= 2.6" + - "shade" +''' +EXAMPLES = ''' +--- +- name: create stack + ignore_errors: True + register: stack_create + os_stack: + name: "{{ stack_name }}" + state: present + template: "/path/to/my_stack.yaml" + environment: + - /path/to/resource-registry.yaml + - /path/to/environment.yaml + parameters: + bmc_flavor: m1.medium + bmc_image: CentOS + key_name: default + private_net: {{ private_net_param }} + node_count: 2 + name: undercloud + image: CentOS + my_flavor: m1.large + external_net: {{ external_net_param }} +''' + +RETURN = ''' +id: + description: Stack ID. + type: string + sample: "97a3f543-8136-4570-920e-fd7605c989d6" +stack: + action: + description: Action, could be Create or Update. + type: string + sample: "CREATE" + creation_time: + description: Time when the action has been made. + type: string + sample: "2016-07-05T17:38:12Z" + description: + description: Description of the Stack provided in the heat template. + type: string + sample: "HOT template to create a new instance and networks" + id: + description: Stack ID. + type: string + sample: "97a3f543-8136-4570-920e-fd7605c989d6" + name: + description: Name of the Stack + type: string + sample: "test-stack" + identifier: + description: Identifier of the current Stack action. + type: string + sample: "test-stack/97a3f543-8136-4570-920e-fd7605c989d6" + links: + description: Links to the current Stack. + type: list of dict + sample: "[{'href': 'http://foo:8004/v1/7f6a/stacks/test-stack/97a3f543-8136-4570-920e-fd7605c989d6']" + outputs: + description: Output returned by the Stack. + type: list of dict + sample: "{'description': 'IP address of server1 in private network', + 'output_key': 'server1_private_ip', + 'output_value': '10.1.10.103'}" + parameters: + description: Parameters of the current Stack + type: dict + sample: "{'OS::project_id': '7f6a3a3e01164a4eb4eecb2ab7742101', + 'OS::stack_id': '97a3f543-8136-4570-920e-fd7605c989d6', + 'OS::stack_name': 'test-stack', + 'stack_status': 'CREATE_COMPLETE', + 'stack_status_reason': 'Stack CREATE completed successfully', + 'status': 'COMPLETE', + 'template_description': 'HOT template to create a new instance and networks', + 'timeout_mins': 60, + 'updated_time': null}" +''' + +def _create_stack(module, stack, cloud): + try: + stack = cloud.create_stack(module.params['name'], + template_file=module.params['template'], + environment_files=module.params['environment'], + timeout=module.params['timeout'], + wait=True, + rollback=module.params['rollback'], + **module.params['parameters']) + + stack = cloud.get_stack(stack.id, None) + if stack.stack_status == 'CREATE_COMPLETE': + return stack + else: + return False + module.fail_json(msg = "Failure in creating stack: ".format(stack)) + except shade.OpenStackCloudException as e: + module.fail_json(msg=str(e)) + +def _update_stack(module, stack, cloud): + try: + stack = cloud.update_stack( + module.params['name'], + template_file=module.params['template'], + environment_files=module.params['environment'], + timeout=module.params['timeout'], + rollback=module.params['rollback'], + wait=module.params['wait']) + + if stack['stack_status'] == 'UPDATE_COMPLETE': + return stack + else: + module.fail_json(msg = "Failure in updating stack: %s" % + stack['stack_status_reason']) + except shade.OpenStackCloudException as e: + module.fail_json(msg=str(e)) + +def _system_state_change(module, stack, cloud): + state = module.params['state'] + if state == 'present': + if not stack: + return True + if state == 'absent' and stack: + return True + return False + +def main(): + + argument_spec = openstack_full_argument_spec( + name=dict(required=True), + template=dict(default=None), + environment=dict(default=None, type='list'), + parameters=dict(default={}, type='dict'), + rollback=dict(default=False, type='bool'), + timeout=dict(default=3600, type='int'), + state=dict(default='present', choices=['absent', 'present']), + ) + + module_kwargs = openstack_module_kwargs() + module = AnsibleModule(argument_spec, + supports_check_mode=True, + **module_kwargs) + + # stack API introduced in 1.8.0 + if not HAS_SHADE or (StrictVersion(shade.__version__) < StrictVersion('1.8.0')): + module.fail_json(msg='shade 1.8.0 or higher is required for this module') + + state = module.params['state'] + name = module.params['name'] + # Check for required parameters when state == 'present' + if state == 'present': + for p in ['template']: + if not module.params[p]: + module.fail_json(msg='%s required with present state' % p) + + try: + cloud = shade.openstack_cloud(**module.params) + stack = cloud.get_stack(name) + + if module.check_mode: + module.exit_json(changed=_system_state_change(module, stack, + cloud)) + + if state == 'present': + if not stack: + stack = _create_stack(module, stack, cloud) + else: + stack = _update_stack(module, stack, cloud) + changed = True + module.exit_json(changed=changed, + stack=stack, + id=stack.id) + elif state == 'absent': + if not stack: + changed = False + else: + changed = True + if not cloud.delete_stack(name, wait=module.params['wait']): + module.fail_json(msg='delete stack failed for stack: %s' % name) + module.exit_json(changed=changed) + except shade.OpenStackCloudException as e: + module.fail_json(msg=str(e)) + +from ansible.module_utils.basic import * +from ansible.module_utils.openstack import * +if __name__ == '__main__': + main() + diff --git a/roles/ovb-manage-stack/tasks/get-undercloud-image.yml b/roles/ovb-manage-stack/tasks/get-undercloud-image.yml new file mode 100644 index 000000000..fecef416c --- /dev/null +++ b/roles/ovb-manage-stack/tasks/get-undercloud-image.yml @@ -0,0 +1,31 @@ +--- +- name: Ensure local working dir exists + file: + path: "{{ local_working_dir }}" + +- name: generate prefix for all run-related entities + set_fact: + prefix="{{ tmp.node_prefix }}" + +- name: get the latest uploaded image + shell: > + export OS_AUTH_URL="{{ os_auth_url }}"; + export OS_USERNAME="{{ os_username }}"; + export OS_PASSWORD="{{ os_password }}"; + export OS_TENANT_NAME="{{ os_tenant_name }}"; + glance image-list --sort-key 'created_at' | grep "{{ osp_release | default(release) }}-undercloud.qcow2" | head -n1 | cut -d'|' -f3 | sed 's/ //g' + register: latest_undercloud_image_name + no_log: true + +- name: set fact for undercloud image + set_fact: latest_undercloud_image="{{ latest_undercloud_image_name.stdout }}" + +- name: copy key inserted in image to undercloud_key location + copy: + src: "{{ existing_key_location }}/{{ item }}" + dest: "{{ local_working_dir }}/{{ item }}" + mode: 0600 + with_items: + - id_rsa_undercloud + - id_rsa_undercloud.pub + diff --git a/roles/ovb-manage-stack/tasks/main.yml b/roles/ovb-manage-stack/tasks/main.yml new file mode 100644 index 000000000..291fd7a4b --- /dev/null +++ b/roles/ovb-manage-stack/tasks/main.yml @@ -0,0 +1,12 @@ +--- +- name: Create OVB stack + include: ovb-create-stack.yml + when: ovb_manage_stack_mode == 'create' + +- name: Setup OVB undercloud + include: ovb-setup-undercloud.yml + when: ovb_manage_stack_mode == 'setup-undercloud' + +- name: Delete OVB stack + include: ovb-delete-stack.yml + when: ovb_manage_stack_mode == 'delete' diff --git a/roles/ovb-manage-stack/tasks/ovb-create-stack.yml b/roles/ovb-manage-stack/tasks/ovb-create-stack.yml new file mode 100644 index 000000000..5b6dce828 --- /dev/null +++ b/roles/ovb-manage-stack/tasks/ovb-create-stack.yml @@ -0,0 +1,114 @@ +--- +- include: get-undercloud-image.yml + +- name: Copy deploy stack parameters template + template: + src: env.yaml.j2 + dest: "{{ local_working_dir }}/{{ prefix }}env.yaml" + mode: 0755 + +- name: Add templates for multi-nic + blockinfile: + dest: "{{ local_working_dir }}/{{ prefix }}env.yaml" + insertafter: "## in baremetal-networks-all.yaml" + content: | + ## multi-nic + OS::OVB::BaremetalNetworks: {{ templates_dir }}/baremetal-networks-all.yaml + OS::OVB::BaremetalPorts: {{ templates_dir }}/baremetal-ports-all.yaml + when: network_isolation_type == 'multi-nic' + +- name: Add templates for public-bond + blockinfile: + dest: "{{ local_working_dir }}/{{ prefix }}env.yaml" + insertafter: "## in baremetal-networks-all.yaml" + content: | + ## public-bond + OS::OVB::BaremetalNetworks: {{ templates_dir }}/baremetal-networks-all.yaml + OS::OVB::BaremetalPorts: {{ templates_dir }}/baremetal-ports-public-bond.yaml + when: network_isolation_type == 'public-bond' + +- name: Add keypair + shell: > + export OS_USERNAME="{{ os_username }}"; + export OS_PASSWORD="{{ os_password }}"; + export OS_TENANT_NAME="{{ os_tenant_name }}"; + export OS_AUTH_URL="{{ os_auth_url }}"; + nova keypair-add --pub-key ~/.ssh/id_rsa.pub {{ prefix }}key + ignore_errors: true + no_log: true + +- name: copy clouds.yaml file + template: + src: clouds.yaml.j2 + dest: "{{ local_working_dir }}/clouds.yaml" + mode: 0755 + +- name: Deploy stack + os_stack: + name: "{{ stack_name }}" + cloud: "{{ cloud_name}}" + state: present + template: "{{ heat_template }}" + environment: "{{ environment_list }}" + register: stack_deployment + environment: + OS_CLIENT_CONFIG_FILE: "{{ local_working_dir }}/clouds.yaml" + ignore_errors: true + +- name: Show stack deployment information + shell: > + export OS_USERNAME="{{ os_username }}"; + export OS_PASSWORD="{{ os_password }}"; + export OS_TENANT_NAME="{{ os_tenant_name }}"; + export OS_AUTH_URL="{{ os_auth_url }}"; + heat stack-show {{ stack_name }} + when: stack_deployment.result is not defined + no_log: true + +- name: set fact for undercloud floating IP address + set_fact: + undercloud_ip="{{ stack_deployment.stack.outputs[0].output_value }}" + +- name: Add provisioned undercloud host + add_host: + name: undercloud + hostname: "{{ undercloud_ip }}" + groups: "{{ node_groups| join(',') }}" + ansible_ssh_host: "{{ undercloud_ip }}" + ansible_fqdn: undercloud + ansible_ssh_user: stack + ansible_private_key_file: "{{ undercloud_key }}" + ansible_ssh_extra_args: "{{ ssh_extra_args }}" + undercloud_ip: "{{ undercloud_ip }}" + +- name: Wait for provisioned host to become reachable + command: + ssh -o BatchMode=yes -o "StrictHostKeyChecking=no" root@{{ undercloud_ip }} -i "{{ undercloud_key }}" + register: result + until: result|success + retries: 300 + delay: 5 + +- name: Build nodes.json file to be used as instackenv.json + shell: > + chdir={{ local_working_dir }} + export OS_USERNAME="{{ os_username }}"; + export OS_PASSWORD="{{ os_password }}"; + export OS_TENANT_NAME="{{ os_tenant_name }}"; + export OS_AUTH_URL="{{ os_auth_url }}"; + {{ ovb_dir }}/bin/build-nodes-json --env {{ local_working_dir }}/{{ prefix }}env.yaml + register: nodes_json + no_log: true + +- name: Ensure directories exist for network-environment copy + file: + path: "{{ network_env_file_dest }}" + state: directory + mode: 0755 + +- name: Copy the network-environment.yaml + copy: + src: "{{ network_environment_file }}" + dest: "{{ network_env_file_dest }}" + mode: 0755 + diff --git a/roles/ovb-manage-stack/tasks/ovb-delete-stack.yml b/roles/ovb-manage-stack/tasks/ovb-delete-stack.yml new file mode 100644 index 000000000..323946d80 --- /dev/null +++ b/roles/ovb-manage-stack/tasks/ovb-delete-stack.yml @@ -0,0 +1,19 @@ +- name: Remove stack + os_stack: + name: "{{ stack_name }}" + cloud: "{{ cloud_name }}" + state: absent + environment: + OS_CLIENT_CONFIG_FILE: "{{ local_working_dir }}/clouds.yaml" + ignore_errors: true + +- name: Remove associated keypair + shell: > + export OS_USERNAME="{{ os_username }}"; + export OS_PASSWORD="{{ os_password }}"; + export OS_TENANT_NAME="{{ os_tenant_name }}"; + export OS_AUTH_URL="{{ os_auth_url }}"; + nova keypair-delete {{ prefix }}key + ignore_errors: true + no_log: true + diff --git a/roles/ovb-manage-stack/tasks/ovb-setup-undercloud.yml b/roles/ovb-manage-stack/tasks/ovb-setup-undercloud.yml new file mode 100644 index 000000000..15540eab2 --- /dev/null +++ b/roles/ovb-manage-stack/tasks/ovb-setup-undercloud.yml @@ -0,0 +1,28 @@ +--- +- name: copy both public and private ssh keys to root directory + become: yes + copy: + src: "{{ lookup('env','HOME') }}/.ssh/{{ item }}" + dest: "/root/.ssh/{{ item }}" + mode: 0600 + with_items: + - id_rsa + - id_rsa.pub + +- name: Copy instackenv.json to undercloud + copy: + src="{{ local_working_dir }}/nodes.json" + dest="{{ working_dir }}/instackenv.json" + +- name: Copy over setup undercloud connectivity script template + template: + src: setup-undercloud-connectivity.sh.j2 + dest: "{{ working_dir }}/setup-undercloud-connectivity.sh" + mode: 0755 + +- name: Setup interfaces, connectivity on the undercloud + become: yes + shell: > + "{{ working_dir }}"/setup-undercloud-connectivity.sh > \ + {{ setup_undercloud_connectivity_log }} 2>&1 + diff --git a/roles/ovb-manage-stack/templates/clouds.yaml.j2 b/roles/ovb-manage-stack/templates/clouds.yaml.j2 new file mode 100644 index 000000000..bb1352067 --- /dev/null +++ b/roles/ovb-manage-stack/templates/clouds.yaml.j2 @@ -0,0 +1,9 @@ +clouds: + {{ cloud_name }}: + auth: + username: {{ os_username }} + password: {{ os_password }} + project_name: {{ os_tenant_name }} + auth_url: {{ os_auth_url }} + region_name: regionOne + diff --git a/roles/ovb-manage-stack/templates/env.yaml.j2 b/roles/ovb-manage-stack/templates/env.yaml.j2 new file mode 100644 index 000000000..8beedb385 --- /dev/null +++ b/roles/ovb-manage-stack/templates/env.yaml.j2 @@ -0,0 +1,57 @@ +parameters: + os_user: {{ os_username }} + os_password: {{ os_password }} + os_tenant: {{ os_tenant_name }} + os_auth_url: {{ os_auth_url }} + + bmc_flavor: m1.micro + bmc_image: 'bmc-base' + bmc_prefix: '{{ prefix }}bmc' + + baremetal_flavor: m1.large + baremetal_image: 'ipxe-boot' + baremetal_prefix: '{{ prefix }}baremetal' + + key_name: '{{ prefix }}key' + private_net: '{{ prefix }}private' + node_count: {{ node_count }} + public_net: '{{ prefix }}public' + provision_net: '{{ prefix }}provision' + + # QuintupleO-specific params ignored by virtual-baremetal.yaml + undercloud_name: '{{ prefix }}undercloud' + undercloud_image: '{{ latest_undercloud_image }}' + undercloud_flavor: m1.xlarge + external_net: '{{ external_net }}' + undercloud_user_data: | + #!/bin/sh + sed -i "s/no-port-forwarding.*sleep 10\" //" /root/.ssh/authorized_keys + +parameter_defaults: +## Uncomment and customize the following to use an existing floating ip +# undercloud_floating_ip_id: 'uuid of floating ip' +# undercloud_floating_ip: 'address of floating ip' + # Network Isolation parameters + overcloud_internal_net: '{{ prefix }}overcloud_internal_net' + overcloud_storage_net: '{{ prefix }}overcloud_storage_net' + overcloud_storage_mgmt_net: '{{ prefix }}overcloud_storage_mgmt_net' + overcloud_tenant_net: '{{ prefix }}overcloud_tenant_net' + +resource_registry: +## Uncomment the following to use an existing floating ip +# OS::OVB::UndercloudFloating: templates/undercloud-floating-existing.yaml + +## Uncomment the following to use no floating ip +# OS::OVB::UndercloudFloating: templates/undercloud-floating-none.yaml + +## Uncomment the following to create a private network + OS::OVB::PrivateNetwork: {{ templates_dir }}/private-net-create.yaml + +## Uncomment to create all networks required for network-isolation. +## parameter_defaults should be used to override default parameter values +## in baremetal-networks-all.yaml +# OS::OVB::BaremetalNetworks: {{ templates_dir }}/baremetal-networks-all.yaml +# OS::OVB::BaremetalPorts: {{ templates_dir }}/baremetal-ports-all.yaml + +## Uncomment to deploy a quintupleo environment without an undercloud. +# OS::OVB::UndercloudEnvironment: OS::Heat::None diff --git a/roles/ovb-manage-stack/templates/setup-undercloud-connectivity.sh.j2 b/roles/ovb-manage-stack/templates/setup-undercloud-connectivity.sh.j2 new file mode 100644 index 000000000..ed00f36d1 --- /dev/null +++ b/roles/ovb-manage-stack/templates/setup-undercloud-connectivity.sh.j2 @@ -0,0 +1,57 @@ +#! /bin/bash + +set -eux + +### --start_docs + +## Set up the undercloud for installation +## ====================================== + +## * Configure external interface +## :: + +sudo ifconfig {{ external_interface }} {{ external_interface_ip }} netmask {{ external_interface_netmask }} + +## * Get mac address of external interface +## :: + +MAC_ADDR_EXT_INTERFACE=$( ifconfig | grep -n3 {{ external_interface }} | grep -A1 ether | cut -d " " -f 10 ) + +## * Set up external interface +## :: + +sudo bash -c 'cat < /etc/sysconfig/network-scripts/ifcfg-{{ external_interface }} +NAME={{ external_interface }} +IPADDR={{ external_interface_ip }} +NETMASK={{ external_interface_netmask }} +NM_CONTROLLED=no +DEFROUTE=yes +IPV4_FAILURE_FATAL=no +IPV6INIT=yes +IPV6_AUTOCONF=yes +IPV6_DEFROUTE=yes +IPV6_FAILURE_FATAL=no +ONBOOT=yes +HWADDR=$MAC_ADDR_EXT_INTERFACE +PEERDNS=yes +PEERROUTES=yes +IPV6_PEERDNS=yes +IPV6_PEERROUTES=yes +EOF' + +## * Set MTU values +## :: + +{% for interface in (mtu_interface) %} + ip link set {{ interface }} mtu {{ mtu }} + echo "MTU={{ mtu }}" >> /etc/sysconfig/network-scripts/ifcfg-{{ interface }} +{% endfor %} + +## * Add nameserver to resolv.conf +## :: + +cat <> /etc/resolv.conf +nameserver {{ pvt_nameserver }} +EOF + +### --stop_docs