Last active
July 7, 2021 13:39
-
-
Save cloudnull/199a980cb11b2e7a333ee75feab62955 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
export HOME="${HOME:-~/}" | |
export THT="/usr/share/openstack-tripleo-heat-templates" | |
export NTP_SERVER="time.google.com" | |
export VIRT_TYPE="$([ "$(egrep -c '(vmx|svm)' /proc/cpuinfo)" = 0 ] && echo qemu || echo kvm)" | |
export STACK_NAME="rk-openstack-0" | |
function tmux_execute { | |
tmux new-session -d -s deploy-tripleo -n deploy-tripleo || true | |
tmux new-window -n deploy -t 0 || true | |
tmux send-keys "${1}" C-m | |
} | |
function upgrade-undercloud { | |
sudo tripleo-repos -b master current-tripleo | |
sudo dnf -y update python-tripleoclient* openstack-tripleo-common openstack-tripleo-heat-templates | |
source ${HOME}/stackrc | |
openstack tripleo container image prepare default \ | |
--local-push-destination \ | |
--output-env-file ${HOME}/containers-prepare-parameter.yaml | |
openstack undercloud upgrade --yes | |
} | |
function upgrade-overcloud-major { | |
cat <<EOF > ${HOME}/init-repo.yaml | |
--- | |
parameter_defaults: | |
DnfStreams: [] | |
UpgradeInitCommand: |- | |
set -ev | |
curl https://trunk.rdoproject.org/centos8/current/delorean.repo | sudo tee /etc/yum.repos.d/delorean.repo | |
sudo dnf install -y 'python*tripleo-repos' | |
sudo tripleo-repos -b master current-tripleo | |
EOF | |
source ${HOME}/stackrc | |
eval "${THT}/tools/process-templates.py -p ${THT} -r ${THT}/roles_data.yaml -n ${HOME}/net-data.yaml -o /tmp/templates/" | |
} | |
function upgrade-overcloud-minor { | |
cat <<EOF > ${HOME}/init-repo.yaml | |
--- | |
parameter_defaults: | |
DnfStreams: [] | |
UpgradeInitCommand: |- | |
set -ev | |
sudo curl -L -o /etc/yum.repos.d/CentOS-Linux-BaseOS.repo https://gist.githubusercontent.com/cloudnull/3db5385e3d0fd373be81d9b8f156b67c/raw/a614daedacf6c55b00b248654a28450cc4273295/gistfile1.txt | |
sudo curl -L -o /etc/yum.repos.d/delorean.repo https://trunk.rdoproject.org/centos8/current/delorean.repo | |
sudo dnf install -y 'python*tripleo-repos' | |
sudo tripleo-repos -b master current-tripleo | |
sudo dnf clean all | |
EOF | |
source ${HOME}/stackrc | |
eval "${THT}/tools/process-templates.py -p ${THT} -r ${THT}/roles_data.yaml -n ${HOME}/net-data.yaml -o /tmp/templates/" | |
echo "execute: openstack overcloud upgrade prepare" | |
openstack overcloud upgrade prepare --yes --templates ${THT} \ | |
--roles-file ${THT}/roles_data.yaml \ | |
--stack ${STACK_NAME} \ | |
--environment-file ${THT}/environments/disable-telemetry.yaml \ | |
--environment-file ${THT}/environments/enable-swap.yaml \ | |
--environment-file ${THT}/environments/storage/glance-nfs.yaml \ | |
--environment-file ${THT}/environments/storage/cinder-nfs.yaml \ | |
--environment-file /tmp/templates/environments/network-isolation.yaml \ | |
--environment-file /tmp/templates/environments/deployed-server-environment.yaml \ | |
--environment-file ${HOME}/local_images.yaml \ | |
--environment-file ${HOME}/parameters.yaml \ | |
--environment-file ${HOME}/pre-provisioned-parameters.yaml \ | |
--environment-file ${HOME}/init-repo.yaml \ | |
--networks-file ${HOME}/net-data.yaml \ | |
--config-download-timeout 1024 \ | |
--timeout 1024 \ | |
--deployed-server \ | |
--disable-validations \ | |
--validation-errors-nonfatal \ | |
--ntp-server ${NTP_SERVER} \ | |
--log-file ${HOME}/deploy.log \ | |
--libvirt-type ${VIRT_TYPE} | |
echo "execute: openstack overcloud upgrade run Controller" | |
openstack overcloud upgrade run --yes --limit 'Controller' \ | |
--skip-tags validation \ | |
--stack ${STACK_NAME} | |
echo "execute: openstack overcloud upgrade run Compute" | |
openstack overcloud upgrade run --yes --limit '!Controller' \ | |
--skip-tags validation \ | |
--stack ${STACK_NAME} | |
echo "execute: openstack overcloud upgrade converge" | |
openstack overcloud upgrade converge --yes --templates ${THT} \ | |
--roles-file ${THT}/roles_data.yaml \ | |
--stack ${STACK_NAME} \ | |
--environment-file ${THT}/environments/disable-telemetry.yaml \ | |
--environment-file ${THT}/environments/enable-swap.yaml \ | |
--environment-file ${THT}/environments/storage/glance-nfs.yaml \ | |
--environment-file ${THT}/environments/storage/cinder-nfs.yaml \ | |
--environment-file /tmp/templates/environments/network-isolation.yaml \ | |
--environment-file /tmp/templates/environments/deployed-server-environment.yaml \ | |
--environment-file ${HOME}/local_images.yaml \ | |
--environment-file ${HOME}/parameters.yaml \ | |
--environment-file ${HOME}/pre-provisioned-parameters.yaml \ | |
--environment-file ${HOME}/init-repo.yaml \ | |
--networks-file ${HOME}/net-data.yaml \ | |
--config-download-timeout 1024 \ | |
--timeout 1024 \ | |
--deployed-server \ | |
--disable-validations \ | |
--validation-errors-nonfatal \ | |
--ntp-server ${NTP_SERVER} \ | |
--log-file ${HOME}/deploy.log \ | |
--libvirt-type ${VIRT_TYPE} | |
} | |
function setup-multi-nic { | |
export IP="${IP:-192.168.24.2}" | |
export NETMASK="${NETMASK:-24}" | |
export INTERFACE="${INTERFACE:-eth1}" | |
export MTU="$(cat /sys/class/net/${INTERFACE}/mtu)" | |
cat <<EOF > $HOME/standalone_parameters.yaml | |
parameter_defaults: | |
CloudName: ${IP} | |
ControlPlaneStaticRoutes: [] | |
Debug: true | |
DeploymentUser: ${USER} | |
DnsServers: | |
- 1.1.1.1 | |
- 8.8.8.8 | |
DockerInsecureRegistryAddress: | |
- ${IP}:8787 | |
NeutronPublicInterface: ${INTERFACE} | |
# domain name used by the host | |
CloudDomain: localdomain | |
NeutronDnsDomain: localdomain | |
# re-use ctlplane bridge for public net, defined in the standalone | |
# net config (do not change unless you know what you're doing) | |
NeutronBridgeMappings: datacentre:${BRIDGE} | |
NeutronPhysicalBridge: ${BRIDGE} | |
# enable to force metadata for public net | |
#NeutronEnableForceMetadata: true | |
StandaloneEnableRoutedNetworks: false | |
StandaloneHomeDir: ${HOME} | |
InterfaceLocalMtu: ${MTU} | |
# Needed if running in a VM, not needed if on baremetal | |
NovaComputeLibvirtType: ${VIRT_TYPE} | |
EOF | |
} | |
function setup-single-nic { | |
export INTERFACE="$(ip -o r g 1 | awk '{print $5}')" | |
export CIDR=$(ip -o -4 a l | grep -w "${INTERFACE}\s" | awk '{print $4}' | head -n 1) | |
export IP=$(echo ${CIDR} | awk -F'/' '{print $1}') | |
export NETMASK=$(echo ${CIDR} | awk -F'/' '{print $2}') | |
export GATEWAY="$(ip -o r g 1 | awk '{print $3}')" | |
export MTU="$(cat /sys/class/net/${INTERFACE}/mtu)" | |
sudo dd of=/etc/sysconfig/network-scripts/route-${BRIDGE} <<EOF | |
default via ${GATEWAY} dev ${BRIDGE} | |
EOF | |
cat <<EOF > ${HOME}/standalone_parameters.yaml | |
parameter_defaults: | |
CloudName: ${IP} | |
# default gateway | |
ControlPlaneStaticRoutes: | |
- ip_netmask: 0.0.0.0/0 | |
next_hop: ${GATEWAY} | |
default: true | |
Debug: true | |
DeploymentUser: ${USER} | |
DnsServers: | |
- 1.1.1.1 | |
- 8.8.8.8 | |
# needed for vip & pacemaker | |
KernelIpNonLocalBind: 1 | |
DockerInsecureRegistryAddress: | |
- ${IP}:8787 | |
NeutronPublicInterface: ${INTERFACE} | |
# domain name used by the host | |
CloudDomain: localdomain | |
NeutronDnsDomain: localdomain | |
# re-use ctlplane bridge for public net, defined in the standalone | |
# net config (do not change unless you know what you're doing) | |
NeutronBridgeMappings: datacentre:${BRIDGE} | |
NeutronPhysicalBridge: ${BRIDGE} | |
# enable to force metadata for public net | |
#NeutronEnableForceMetadata: true | |
StandaloneEnableRoutedNetworks: false | |
StandaloneHomeDir: ${HOME} | |
InterfaceLocalMtu: ${MTU} | |
# Needed if running in a VM, not needed if on baremetal | |
NovaComputeLibvirtType: ${VIRT_TYPE} | |
EOF | |
} | |
function build-patched-packages { | |
cat <<EOF > playbook.yaml | |
--- | |
- name: Build packages | |
hosts: localhost | |
connection: local | |
vars: | |
ansible_user: "$(whoami)" | |
roles: | |
- role: cloudnull.ansible_tripleo_sdk | |
tripleo_sdk_developer_patches: | |
- url: "https://review.opendev.org/openstack/tripleo-heat-templates" | |
refs: "refs/changes/67/772967/4" | |
version: FETCH_HEAD | |
- url: "https://review.opendev.org/openstack/python-tripleoclient" | |
refs: "refs/changes/84/773284/3" | |
version: FETCH_HEAD | |
- url: "https://review.opendev.org/openstack/tripleo-common" | |
refs: refs/changes/82/773482/1 | |
version: FETCH_HEAD | |
EOF | |
ansible-galaxy install cloudnull.ansible_tripleo_sdk --force | |
rm -fv /home/centos/tripleo-sdk/packages.created | |
ansible-playbook -i localhost, playbook.yaml | |
} | |
function build-overcloud-images { | |
source ${HOME}/stackrc | |
mkdir -p ${HOME}/images | |
pushd ${HOME}/images | |
mkdir -p ${HOME}/elements | |
pushd ${HOME}/elements | |
git clone https://opendev.org/openstack/tripleo-puppet-elements || true | |
git clone https://opendev.org/openstack/tripleo-image-elements || true | |
git clone https://opendev.org/openstack/heat-agents || true | |
git clone https://opendev.org/openstack/ironic-python-agent-builder || true | |
git clone https://opendev.org/openstack/instack-undercloud || true | |
popd | |
export ELEMENTS_PATH="${HOME}/elements/tripleo-puppet-elements/elements:${HOME}/elements/tripleo-image-elements/elements:${HOME}/elements/heat-agents:${HOME}/elements/ironic-python-agent-builder/dib/" | |
export DIB_DEBUG_TRACE=1 | |
export DIB_YUM_REPO_CONF="/etc/yum.repos.d/*" | |
grep -rnil '\#\!.*python*' "${HOME}/elements" | xargs -n 1 pathfix.py -i $(which python3) -p -n | |
openstack --os-cloud undercloud overcloud image build | |
openstack --os-cloud undercloud overcloud image upload --update-existing --local | |
popd | |
sudo chown 42422:42422 /var/lib/ironic/images/* | |
} | |
function deploy-standalone-execute { | |
openstack tripleo container image prepare default --output-env-file ${HOME}/containers-prepare-parameters.yaml | |
export VIP="192.168.25.2" | |
export BRIDGE="br-ctlplane" | |
tmux_execute "sudo openstack tripleo deploy --templates \ | |
--local-ip=${IP}/${NETMASK} \ | |
--control-virtual-ip ${VIP} \ | |
-r /usr/share/openstack-tripleo-heat-templates/roles/Standalone.yaml \ | |
--environment-file /usr/share/openstack-tripleo-heat-templates/environments/standalone/standalone-tripleo.yaml \ | |
--environment-file ${HOME}/containers-prepare-parameters.yaml \ | |
--environment-file ${HOME}/standalone_parameters.yaml \ | |
--output-dir ${HOME} \ | |
--standalone \ | |
--stack ${STACK_NAME}" | |
} | |
function deploy-undercloud { | |
sudo modprobe br-netfilter | |
[ -f /etc/sysconfig/network-scripts/ifcfg-vlan-vlan204 ] || \ | |
sudo nmcli connection add type vlan ifname vlan204 \ | |
dev $(ip -o route get 1 | awk '{print $5}') \ | |
id 204 \ | |
ip4 172.16.4.2/24 \ | |
gw4 172.16.4.1 | |
echo "br_netfilter" | sudo tee /etc/modules-load.d/99-netfilter.conf | |
eval "${THT}/tools/process-templates.py -p ${THT} -r ${THT}/roles_data.yaml -n ${HOME}/net-data.yaml -o /tmp/templates/" | |
openstack undercloud install | |
} | |
function baremetal-unprovision { | |
metalsmith list | awk "/${STACK_NAME}/ {print $2}" | xargs -n 1 metalsmith undeploy | |
openstack baremetal node delete $(openstack baremetal node list -f value | awk '{print $1}') | |
} | |
function baremetal-provision { | |
source ${HOME}/stackrc | |
openstack --os-cloud undercloud overcloud node import instackenv.yaml | |
openstack --os-cloud undercloud overcloud node introspect \ | |
--all-manageable \ | |
--provide \ | |
--concurrency 2 | |
openstack --os-cloud undercloud overcloud node provision \ | |
--stack ${STACK_NAME} \ | |
--output ${HOME}/pre-provisioned-parameters.yaml \ | |
${HOME}/overcloud-baremetal-config.yaml | |
} | |
function deploy-multinode-execute { | |
source ${HOME}/stackrc | |
eval "${THT}/tools/process-templates.py -p ${THT} -r ${THT}/roles_data.yaml -n ${HOME}/net-data.yaml -o /tmp/templates/" | |
tmux_execute " \ | |
. ${HOME}/stackrc; \ | |
openstack overcloud deploy --stack ${STACK_NAME} \ | |
--templates ${THT} \ | |
--environment-file ${THT}/environments/disable-telemetry.yaml \ | |
--environment-file ${THT}/environments/enable-swap.yaml \ | |
--environment-file ${THT}/environments/storage/glance-nfs.yaml \ | |
--environment-file ${THT}/environments/storage/cinder-nfs.yaml \ | |
--environment-file /tmp/templates/environments/network-isolation.yaml \ | |
--environment-file /tmp/templates/environments/deployed-server-environment.yaml \ | |
--environment-file ${HOME}/local_images.yaml \ | |
--environment-file ${HOME}/parameters.yaml \ | |
--environment-file ${HOME}/pre-provisioned-parameters.yaml \ | |
--networks-file ${HOME}/net-data.yaml \ | |
--config-download-timeout 1024 \ | |
--timeout 1024 \ | |
--deployed-server \ | |
--disable-validations \ | |
--validation-errors-nonfatal \ | |
--ntp-server ${NTP_SERVER} \ | |
--log-file ${HOME}/deploy.log \ | |
--libvirt-type ${VIRT_TYPE}" | |
} | |
function post-deploy { | |
sudo mount -t nfs 172.16.27.211:/mnt/storage/media/rhv /mnt | |
for NAME in ubuntu-focal-server-cloudimg-amd64-disk-kvm.img \ | |
ubuntu-bionic-server-cloudimg-amd64.img \ | |
Fedora-Cloud-Base-33-1.2.x86_64.qcow2 \ | |
CentOS-8-x86_64-GenericCloud.qcow2 \ | |
rhel-8-x86_64-kvm.qcow2; do | |
tmux_execute " \ | |
. ${HOME}/${STACK_NAME}rc; \ | |
openstack image create --disk-format qcow2 --container-format bare --public --file /mnt/images/${NAME} ${NAME}; \ | |
openstack image set --property hw_scsi_model=virtio-scsi \ | |
--property hw_disk_bus=scsi \ | |
--property hw_vif_multiqueue_enabled=true \ | |
--property hw_qemu_guest_agent=yes \ | |
--property hypervisor_type=kvm \ | |
--property os_require_quiesce=yes \ | |
--property img_config_drive=optional \ | |
${NAME}" | |
done | |
. ${HOME}/${STACK_NAME}rc | |
openstack flavor create --ram 2048 --disk 16 --ephemeral 0 --swap 8 --vcpus 2 --public k0.small | |
openstack flavor create --ram 4096 --disk 32 --ephemeral 0 --swap 8 --vcpus 6 --public k0.tester | |
openstack flavor create --ram 8192 --disk 64 --ephemeral 16 --swap 8 --vcpus 8 --public k0.medium | |
openstack flavor create --ram 16384 --disk 96 --ephemeral 16 --swap 8 --vcpus 16 --public k0.tripleo | |
openstack network create --provider-network-type vlan \ | |
--external \ | |
--provider-physical-network datacentre \ | |
--provider-segment 204 \ | |
--share \ | |
os-204 | |
openstack subnet create --dhcp \ | |
--subnet-range 172.16.4.0/24 \ | |
--allocation-pool 'start=172.16.4.150,end=172.16.4.200' \ | |
--gateway 172.16.4.1 \ | |
--dns-nameserver 8.8.8.8 \ | |
--network os-204 \ | |
os-204_subnet | |
openstack network create internal | |
openstack subnet create --dhcp \ | |
--subnet-range 10.0.10.0/24 \ | |
--dns-nameserver 8.8.8.8 \ | |
--network internal \ | |
internal_subnet | |
openstack router create internal_router | |
openstack router set --external-gateway os-204 internal_router | |
openstack router add subnet internal_router internal_subnet | |
GROUP_ID=$(openstack security group list --project admin | awk '/default/ {print $2}') | |
openstack security group rule create --project admin --proto ANY --remote-ip '0.0.0.0/0' --ethertype IPv4 "${GROUP_ID}" | |
openstack security group rule create --project admin --proto ANY --remote-ip '::/0' --ethertype IPv6 "${GROUP_ID}" | |
} | |
function pre-build { | |
sudo hostnamectl set-hostname $(hostname -s).localdomain | |
sudo hostnamectl set-hostname $(hostname -s).localdomain --transient | |
# Prune interface files to match only our active networks | |
ls -1 /etc/sysconfig/network-scripts/ | grep -w 'ifcfg' | sed 's/ifcfg-//g' | xargs -i -n 1 bash -c "(ip link show {} || sudo rm -f /etc/sysconfig/network-scripts/ifcfg-{})" | |
[ -f ${HOME}/.ssh/id_rsa.pub ] || ssh-keygen -t rsa -f ${HOME}/.ssh/id_rsa -q -P "" | |
curl https://trunk.rdoproject.org/centos8/current/delorean.repo | sudo tee /etc/yum.repos.d/delorean.repo | |
sudo dnf install -y 'python*tripleo-repos' | |
sudo tripleo-repos -b master current-tripleo | |
sudo dnf -y install NetworkManager qemu-guest-agent vim network-scripts patch git patchutils iptables-services \ | |
python*-virtualenv tmux OpenIPMI ipmitool python*tripleoclient patch git patchutils \ | |
iptables-services python*tripleoclient | |
} | |
function teardown { | |
. ${HOME}/${STACK_NAME}rc | |
openstack stack list -f value | awk '{print $1}' | xargs -n 1 openstack overcloud delete --yes | |
} | |
# Example workflow: | |
# pre-build | |
# deploy-undercloud | |
# build-overcloud-images | |
# deploy-multinode-execute | |
# post-deploy |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment