From 5d28b70edce08ee912c433386599424f8202f303 Mon Sep 17 00:00:00 2001 From: "Michael S. Pedersen" Date: Fri, 23 Oct 2020 12:24:43 +0000 Subject: Add support for deploying to Equinix Metal bare-metal servers Adds an additional hw_config which is simplified (equinix-metal). Adds support for skipping HW provisioning (pre-provisioned through EM). Usage: deploy.sh [k8s] Adds a few new helper functions, and updates existing to support changes. Signed-off-by: Michael S. Pedersen Signed-off-by: Victor Morales Change-Id: I2f84c662d183ba224e0edd8a218abe8b46c1fe45 Signed-off-by: Victor Morales Reviewed-on: https://gerrit.opnfv.org/gerrit/c/kuberef/+/71301 Tested-by: jenkins-ci Reviewed-by: Rihab Banday Reviewed-by: Victor Morales --- .../roles/bmra-config/templates/inventory.ini | 1 - playbooks/roles/jump-vm/tasks/main.yaml | 32 +++++++++++++++++++--- .../roles/jump-vm/templates/network-config.j2 | 2 ++ playbooks/roles/jump-vm/templates/user-data.j2 | 27 +++++++++--------- .../pre-install/molecule/default/converge.yml | 16 +++++++++++ .../pre-install/molecule/default/molecule.yml | 26 ++++++++++++++++++ .../molecule/default/tests/test_default.py | 26 ++++++++++++++++++ playbooks/roles/pre-install/tasks/main.yml | 20 ++++++++++++++ playbooks/roles/pre-install/vars/RedHat.yml | 14 ++++++++++ 9 files changed, 146 insertions(+), 18 deletions(-) create mode 100644 playbooks/roles/pre-install/molecule/default/converge.yml create mode 100644 playbooks/roles/pre-install/molecule/default/molecule.yml create mode 100644 playbooks/roles/pre-install/molecule/default/tests/test_default.py create mode 100644 playbooks/roles/pre-install/tasks/main.yml create mode 100644 playbooks/roles/pre-install/vars/RedHat.yml (limited to 'playbooks/roles') diff --git a/playbooks/roles/bmra-config/templates/inventory.ini b/playbooks/roles/bmra-config/templates/inventory.ini index 48ca5fd..7a9c6ab 100644 --- a/playbooks/roles/bmra-config/templates/inventory.ini +++ b/playbooks/roles/bmra-config/templates/inventory.ini @@ -10,7 +10,6 @@ {{ idf.kubespray.hostnames[node.name] }} {% endif %} {% endfor %} - {% endfor %} [k8s-cluster:children] diff --git a/playbooks/roles/jump-vm/tasks/main.yaml b/playbooks/roles/jump-vm/tasks/main.yaml index 2c0cc37..c5738c3 100644 --- a/playbooks/roles/jump-vm/tasks/main.yaml +++ b/playbooks/roles/jump-vm/tasks/main.yaml @@ -33,6 +33,16 @@ when: jumphost.name in shutdown_vms.list_vms +- name: remove dhcp leases + shell: | + jq 'del( .[] | select(.domain == "{{ jumphost.name }}" or .hostname == "{{ jumphost.name }}"))' /var/lib/libvirt/dnsmasq/virbr0.{{ item }} > /tmp/{{ item }}.tmp + mv /tmp/{{ item }}.tmp /var/lib/libvirt/dnsmasq/virbr0.{{ item }} + with_items: + - status + - macs + become: true + when: deployment_type == 'k8s' + - name: clean workspace file: path: "{{ workspace }}" @@ -71,8 +81,9 @@ - meta-data - name: create config drive - command: "genisoimage -output {{ workspace }}/{{ jumphost.name }}-cidata.iso -volid cidata -joliet -rock \ - {{ workspace }}/user-data {{ workspace }}/meta-data {{ workspace }}/network-config" + command: "genisoimage -output {{ workspace }}/{{ jumphost.name }}-cidata.iso -volid cidata -joliet -rock \ + {{ workspace }}/user-data {{ workspace }}/meta-data \ + {{ workspace + '/network-config' if deployment_type == 'full' else '' }}" # currently commented out because of portability issues between Centos and Ubuntu # - name: setting root password for debugging @@ -85,7 +96,7 @@ --disk path={{ workspace }}/kuberef-jump.qcow2,format=qcow2 \ --disk {{ workspace }}/kuberef-jump-cidata.iso,device=cdrom \ --network network=default,model=virtio,mac='{{ jumphost.interfaces[engine.net_config[engine.public_network].interface].mac_address }}' \ - --network bridge=pxebr,model=rtl8139,mac='{{ jumphost.interfaces[engine.net_config[engine.pxe_network].interface].mac_address }}' \ + {{ '--network bridge=pxebr,model=rtl8139,mac=' + jumphost.interfaces[engine.net_config[engine.pxe_network].interface].mac_address if deployment_type == 'full' else '' }} \ --import --noautoconsole" - name: start jump VM @@ -93,7 +104,20 @@ name: "{{ jumphost.name }}" state: running +- name: wait for ip to be visible + shell: virsh domifaddr "{{ jumphost.name }}" --full | grep "{{ jumphost.interfaces[engine.net_config[engine.public_network].interface].mac_address }}" | awk '{print $4}' | tail -n 1 + register: ipblock + retries: 30 + delay: 1 + until: ipblock.stdout != "" + when: deployment_type == 'k8s' + +- name: store ip + set_fact: + vm_ip: "{{ ipblock.stdout.split('/') }}" + when: deployment_type == 'k8s' + - name: wait for VM to be reachable wait_for: - host: "{{ jumphost.interfaces[idf.net_config[engine.pxe_network].interface].address }}" + host: "{{ ( vm_ip is defined and vm_ip.0 or '' ) if 'k8s' in deployment_type else jumphost.interfaces[idf.net_config[engine.pxe_network].interface].address | default('') }}" port: 22 diff --git a/playbooks/roles/jump-vm/templates/network-config.j2 b/playbooks/roles/jump-vm/templates/network-config.j2 index ceded54..8587a10 100644 --- a/playbooks/roles/jump-vm/templates/network-config.j2 +++ b/playbooks/roles/jump-vm/templates/network-config.j2 @@ -1,3 +1,4 @@ +{% if deployment_type == 'full' %} version: 1 config: - type: physical @@ -12,3 +13,4 @@ config: - type: static address: "{{ jumphost.interfaces[idf.net_config[engine.pxe_network].interface].address }}" netmask: "{{ idf.net_config[engine.pxe_network].mask }}" +{% endif %} diff --git a/playbooks/roles/jump-vm/templates/user-data.j2 b/playbooks/roles/jump-vm/templates/user-data.j2 index 648f8d1..2fad2e3 100644 --- a/playbooks/roles/jump-vm/templates/user-data.j2 +++ b/playbooks/roles/jump-vm/templates/user-data.j2 @@ -1,13 +1,14 @@ - #cloud-config - users: - - name: ubuntu - ssh-authorized-keys: - - {{ lookup('file', pub_key ) }} - sudo: ['ALL=(ALL) NOPASSWD:ALL'] - groups: sudo - shell: /bin/bash - runcmd: - # this is requried in labs where the PXE network is different from - # the public network. Without internet connectivity, the installation - # of BMRA fails - - [ iptables, -t, nat, -A, POSTROUTING, -o, ens3, -j, MASQUERADE ] +#jinja2:lstrip_blocks: True +#cloud-config +users: + - name: {{ lookup('env', 'USERNAME') }} + ssh-authorized-keys: + - {{ lookup('file', pub_key ) }} + sudo: ['ALL=(ALL) NOPASSWD:ALL'] + groups: sudo + shell: /bin/bash +runcmd: + # this is requried in labs where the PXE network is different from + # the public network. Without internet connectivity, the installation + # of BMRA fails + - [ iptables, -t, nat, -A, POSTROUTING, -o, ens3, -j, MASQUERADE ] diff --git a/playbooks/roles/pre-install/molecule/default/converge.yml b/playbooks/roles/pre-install/molecule/default/converge.yml new file mode 100644 index 0000000..c7904cf --- /dev/null +++ b/playbooks/roles/pre-install/molecule/default/converge.yml @@ -0,0 +1,16 @@ +--- +# SPDX-license-identifier: Apache-2.0 +############################################################################## +# Copyright (c) 2020 Samsung Electronics +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +- name: Converge + hosts: all + gather_facts: true + roles: + - role: pre-install + inventory_path: /home/kuberef/inventory diff --git a/playbooks/roles/pre-install/molecule/default/molecule.yml b/playbooks/roles/pre-install/molecule/default/molecule.yml new file mode 100644 index 0000000..a43f45f --- /dev/null +++ b/playbooks/roles/pre-install/molecule/default/molecule.yml @@ -0,0 +1,26 @@ +--- +# SPDX-license-identifier: Apache-2.0 +############################################################################## +# Copyright (c) 2020 Samsung Electronics +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## +dependency: + name: galaxy +driver: + name: docker +lint: | + set -e + yamllint -c ../../../.yamllint . + ansible-lint +platforms: + - name: centos_7 + image: centos:7 +provisioner: + name: ansible +verifier: + name: testinfra + lint: + name: flake8 diff --git a/playbooks/roles/pre-install/molecule/default/tests/test_default.py b/playbooks/roles/pre-install/molecule/default/tests/test_default.py new file mode 100644 index 0000000..c992994 --- /dev/null +++ b/playbooks/roles/pre-install/molecule/default/tests/test_default.py @@ -0,0 +1,26 @@ +# Copyright 2020 Samsung Electronics +# +# 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.# +# + +import os +import pytest + +import testinfra.utils.ansible_runner + +testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner( + os.environ['MOLECULE_INVENTORY_FILE'] +).get_hosts('all') +def test_requirements_installed(host): + for pkg in ["lshw", "pciutils", "ethtool"]: + assert host.package(pkg).is_installed diff --git a/playbooks/roles/pre-install/tasks/main.yml b/playbooks/roles/pre-install/tasks/main.yml new file mode 100644 index 0000000..db6534d --- /dev/null +++ b/playbooks/roles/pre-install/tasks/main.yml @@ -0,0 +1,20 @@ +--- +# SPDX-license-identifier: Apache-2.0 +############################################################################## +# Copyright (c) 2020 Samsung Electronics +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +- name: Load distro variables + include_vars: + file: "{{ ansible_os_family }}.yml" + +- name: Install BRMA requirements + become: true + package: + name: "{{ item }}" + state: present + with_items: "{{ bmra_pkgs }}" diff --git a/playbooks/roles/pre-install/vars/RedHat.yml b/playbooks/roles/pre-install/vars/RedHat.yml new file mode 100644 index 0000000..5adac50 --- /dev/null +++ b/playbooks/roles/pre-install/vars/RedHat.yml @@ -0,0 +1,14 @@ +--- +# SPDX-license-identifier: Apache-2.0 +############################################################################## +# Copyright (c) 2020 Samsung Electronics +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +bmra_pkgs: + - lshw + - pciutils + - ethtool -- cgit 1.2.3-korg