Skip to content

Instantly share code, notes, and snippets.

@cloudnull
Last active July 7, 2021 13:39
Show Gist options
  • Save cloudnull/199a980cb11b2e7a333ee75feab62955 to your computer and use it in GitHub Desktop.
Save cloudnull/199a980cb11b2e7a333ee75feab62955 to your computer and use it in GitHub Desktop.
#!/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