#!/bin/bash required_bins=( ip jq sudo uuid debconf-set-selections ifdata ) check_bins() { # Append any needed binaries we need to check for, to our list if [[ $1 ]]; then required_bins+=("$1") fi for binary in "${required_bins[@]}"; do if ! [ -x "$(command -v "$binary")" ]; then printf "Error: Necessary program '%s' is not installed. Please fix, aborting now.\n\n" "$binary" >&2 exit 1 fi done } # Initialize some vars we'll reuse later in the build, bootstrap init_variables() { # This is the user who 'maas' uses when commissioning nodes virsh_user="ubuntu" maas_profile="admin" maas_pass="openstack" # This is the user whose keys get imported into maas by default launchpad_user="setuid" maas_system_ip="$(hostname -I | awk '{print $1}')" # This is an ugly hack, but it works to get the IP of the primary virtual bridge interface maas_bridge_ip=$(ifdata -pa virbr0) # maas_bridge_ip="$(ip -json a | jq -r '.[] | select(.ifname | tostring | contains("virbr0")) | .addr_info[].local')" # maas_bridge_ip="$(ip a s virbr0 | awk '/inet/ {print $2}' | cut -d/ -f1)" maas_endpoint="http://$maas_bridge_ip:5240/MAAS" # This is the proxy that MAAS itself uses (the "internal" MAAS proxy) squid_proxy="http://192.168.100.10:3128" maas_local_proxy="http://$maas_bridge_ip:8000" maas_upstream_dns="1.1.1.1 4.4.4.4 8.8.8.8" maas_ip_range=192.168.100 no_proxy="localhost,127.0.0.1,$maas_system_ip,$(echo $maas_ip_range.{100..200} | sed 's/ /,/g')" echo "MAAS Endpoint: $maas_endpoint" echo "MAAS Proxy: $maas_local_proxy" # This is an upstream, peer proxy that MAAS may need to talk to (tinyproxy in this case) # maas_upstream_proxy="http://$maas_system_ip:8888" virsh_chassis="qemu+ssh://${virsh_user}@${maas_system_ip}/system" maas_packages=(maas maas-cli maas-proxy maas-dhcp maas-dns maas-rack-controller maas-region-api maas-common) pg_packages=(postgresql-10 postgresql-client postgresql-client-common postgresql-common) } remove_maas() { # Drop the MAAS db ("maasdb"), so we don't risk reusing it sudo -u postgres psql -c "select pg_terminate_backend(pid) from pg_stat_activity where datname='maasdb'" sudo -u postgres psql -c "drop database maasdb" # Remove everything, start clean and clear from the top sudo DEBIAN_FRONTEND=noninteractive eatmydata apt-get -y remove --purge "${maas_packages[@]}" "${pg_packages[@]}" && \ sudo eatmydata apt-get -fuy autoremove # Yes, they're removed but we want them PURGED, so this becomes idempotent for package in "${maas_packages[@]}" "${pg_packages[@]}"; do sudo dpkg -P "$package" done } install_maas() { # This is separate from the removal, so we can handle them atomically sudo eatmydata apt-get -fuy --reinstall install "${maas_packages[@]}" "${pg_packages[@]}" sudo sed -i 's/DISPLAY_LIMIT=5/DISPLAY_LIMIT=100/' /usr/share/maas/web/static/js/bundle/maas-min.js } purge_admin_user() { read -r -d '' purgeadmin < clouds-"$rand_uuid".yaml <=DEBUG EOF cat > credentials-"$rand_uuid".yaml < config-"$rand_uuid".yaml < Do EVERYTHING (maas, juju cloud, juju bootstrap) -b Build out and bootstrap a new MAAS -c Add a new cloud + credentials -i Just install the dependencies and exit -j Bootstrap the Juju controller called -n Create MAAS kvm nodes (to be imported into chassis) -r Remove the entire MAAS server + dependencies -t Tear down the cloud named " } if [ $# -eq 0 ]; then printf "%s needs options to function correctly. Valid options are:" "$0" show_help exit 0 fi init_variables while getopts ":a:bc:ij:nt:r" opt; do case $opt in a ) check_bins remove_maas install_maas build_maas bootstrap_maas add_cloud "$OPTARG" ;; b ) echo "Building out a new MAAS server" check_bins install_maas build_maas bootstrap_maas exit 0 ;; c ) check_bins maas init_variables add_cloud "$OPTARG" ;; i ) echo "Installing MAAS and PostgreSQL dependencies" install_maas exit 0 ;; j ) echo "Bootstrapping Juju controller $OPTARG" add_cloud "$OPTARG" exit 0 ;; r ) remove_maas exit 0 ;; t ) destroy_cloud "$OPTARG" exit 0 ;; \? ) printf "Unrecognized option: -%s. Valid options are:" "$OPTARG" >&2 show_help exit 1 ;; : ) printf "Option -%s needs an argument.\n" "$OPTARG" >&2 show_help echo "" exit 1 ;; esac done