Skip to content

Instantly share code, notes, and snippets.

@Ara4Sh
Created December 11, 2019 09:20
Show Gist options
  • Save Ara4Sh/e4168b90999813be6f96699a7303ac87 to your computer and use it in GitHub Desktop.
Save Ara4Sh/e4168b90999813be6f96699a7303ac87 to your computer and use it in GitHub Desktop.
sample script to install ubuntu cloud with virt-install and cloud-init
#!/bin/bash
# Take one argument from the commandline: VM name
if ! [ $# -eq 1 ]; then
echo "Usage: $0 <node-name>"
exit 1
fi
# Check if domain already exists
virsh dominfo $1 > /dev/null 2>&1
if [ "$?" -eq 0 ]; then
echo -n "[WARNING] $1 already exists. "
read -p "Do you want to overwrite $1 [y/N]? " -r
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo ""
else
echo -e "\nNot overwriting $1. Exiting..."
exit 1
fi
fi
# Directory to store images
DIR=~/virt/images
# Location of cloud image
IMAGE=$DIR/bionic-server-cloudimg-arm64.img
# Amount of RAM in MB
MEM=4096
# Number of virtual CPUs
CPUS=4
# Cloud init files
USER_DATA=user-data
META_DATA=meta-data
CI_ISO=$1-cidata.iso
DISK=$1.qcow2
# Bridge for VMs (default on Fedora is virbr0)
BRIDGE=virbr0
# Start clean
rm -rf $DIR/$1
mkdir -p $DIR/$1
pushd $DIR/$1 > /dev/null
# Create log file
touch $1.log
echo "$(date -R) Destroying the $1 domain (if it exists)..."
# Remove domain with the same name
virsh destroy $1 >> $1.log 2>&1
virsh undefine $1 >> $1.log 2>&1
# cloud-init config: set hostname, remove cloud-init package,
# and add ssh-key
cat > $USER_DATA << _EOF_
#cloud-config
users:
- default
- name: stack
lock_passwd: False
sudo: ["ALL=(ALL) NOPASSWD:ALL\nDefaults:stack !requiretty"]
shell: /bin/bash
write_files:
- content: |
#!/bin/sh
DEBIAN_FRONTEND=noninteractive sudo apt-get -qqy update || sudo yum update -qy
DEBIAN_FRONTEND=noninteractive sudo apt-get install -qqy git || sudo yum install -qy git
sudo chown stack:stack /home/stack
cd /home/stack
git clone https://git.openstack.org/openstack-dev/devstack
cd devstack
echo '[[local|localrc]]' > local.conf
echo ADMIN_PASSWORD=password >> local.conf
echo DATABASE_PASSWORD=password >> local.conf
echo RABBIT_PASSWORD=password >> local.conf
echo SERVICE_PASSWORD=password >> local.conf
./stack.sh
path: /home/stack/start.sh
permissions: 0755
runcmd:
- su -l stack ./start.sh
_EOF_
echo "instance-id: $1; local-hostname: $1" > $META_DATA
echo "$(date -R) Copying template image..."
cp $IMAGE $DISK
# Create CD-ROM ISO with cloud-init config
echo "$(date -R) Generating ISO for cloud-init..."
genisoimage -output $CI_ISO -volid cidata -joliet -r $USER_DATA $META_DATA &>> $1.log
echo "$(date -R) Installing the domain and adjusting the configuration..."
echo "[INFO] Installing with the following parameters:"
echo "virt-install --import --name $1 --ram $MEM --vcpus $CPUS --disk
$DISK,format=qcow2,bus=virtio --disk $CI_ISO,device=cdrom --network
bridge=virbr0,model=virtio --os-type=linux --os-variant=rhel6 --noautoconsole"
virt-install --import --name $1 --ram $MEM --vcpus $CPUS --disk \
$DISK,format=qcow2,bus=virtio --disk $CI_ISO,device=cdrom --network \
bridge=virbr0,model=virtio --os-type=linux --os-variant=rhel6 --noautoconsole
MAC=$(virsh dumpxml $1 | awk -F\' '/mac address/ {print $2}')
while true
do
IP=$(grep -B1 $MAC /var/lib/libvirt/dnsmasq/$BRIDGE.status | head \
-n 1 | awk '{print $2}' | sed -e s/\"//g -e s/,//)
if [ "$IP" = "" ]
then
sleep 1
else
break
fi
done
# Eject cdrom
echo "$(date -R) Cleaning up cloud-init..."
virsh change-media $1 hda --eject --config >> $1.log
# Remove the unnecessary cloud init files
rm $USER_DATA $CI_ISO
echo "$(date -R) DONE. SSH to $1 using $IP, with username 'stack'."
popd > /dev/null
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment