Skip to content

Instantly share code, notes, and snippets.

@xcnix
Forked from jnaulty/virt-install-centos
Last active July 27, 2020 12:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xcnix/da06aa490135ae205c160fceebe0c619 to your computer and use it in GitHub Desktop.
Save xcnix/da06aa490135ae205c160fceebe0c619 to your computer and use it in GitHub Desktop.
Install CentOS cloud images on KVM using cloud-init
#!/bin/bash
## **Updates to this file are now at https://github.com/giovtorres/kvm-install-vm.**
## **This updated version has more options and less hardcoded variables.**
# 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 ""
virsh destroy $1 > /dev/null
virsh undefine $1 > /dev/null
else
echo -e "\nNot overwriting $1. Exiting..."
exit 1
fi
fi
# Directory to store images
DIR=~/virt/images
# Location of cloud image
IMAGE=$DIR/CentOS-7-x86_64-GenericCloud.qcow2
# Amount of RAM in MB
MEM=4096
# Number of virtual CPUs
CPUS=2
# 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
# Hostname management
preserve_hostname: False
hostname: $1
fqdn: $1.example.local
# Remove cloud-init when finished with it
runcmd:
- [ yum, -y, remove, cloud-init ]
# Configure where output will go
output:
all: ">> /var/log/cloud-init.log"
# configure interaction with ssh server
ssh_svcname: ssh
ssh_deletekeys: True
ssh_genkeytypes: ['rsa', 'ecdsa']
# Install my public ssh key to the first user-defined user configured
# in cloud.cfg in the template (which is centos for CentOS cloud images)
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDEXseJriPU4c6VmFwyM0h4wtYcJruB1jj1xc9OZ5ADi+NRwD6GKgtxJ8Qp+H7azuMFinai58Mb22Rdjrk6JrA9KuHonKCOHxr8ikZfLlrZiWz6qKtTmMGl+UoOZx+FT9IFLABw6NUWJnH/dwYu02S/xLJ+ZJa3aQUVYY2nKqQ6b/NpgVSXixjnSzW9NJSk7/n5XbErtt97lIlVvVmGQsW5TpptadjI2kI2TYboQrybiAVXMz9CGmtWVM75FyPWQUCQ5cBQToTjmYfAs7n76AqMtFs3K5wC97kZFxSztkxZeka6vdCb0dKHnEolZcyGRtbGKxvOe9zQRWMJInuJOJdXxacmah1AEa37voLfNdmLXMYsR/p+UGLGFEgXk2UJ/PX9W5pszebDQklvDMpxiUBSIKXcEtB/MbuTiMI9TkoXFqWiLxDUPR1/3J3WykokGruhCZexKf4fIqEPisMfZiNItjGmfKi1Rh90rKr5e1oNOwO2qIAvGngC0eWFr5K4jUE=
_EOF_
echo "instance-id: $1; local-hostname: $1" > $META_DATA
echo "$(date -R) Copying template image..."
cp $IMAGE $DISK
qemu-img resize $DISK 30g
# 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=rhel7 --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=rhel7 --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 'centos'."
popd > /dev/null
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment