#!/bin/bash if [[ $# -lt 1 ]]; then echo "Usage: $0 [ ]" exit 1 fi if [[ $# -eq 2 ]]; then HOSTID=${1} NODEID=${2} else HOSTID=${1} NODEID=${1} fi # Make sure you have all dependencies: # yum -y install libguestfs-tools virt-install # Directory where everything happens DIR=${PWD} # The image downloaded from the http://fedoraproject.org/en/get-fedora#clouds site # You can use this command: # mkdir -p ~/work/virt-install && cd ~/work/virt-install && wget http://download.fedoraproject.org/pub/fedora/linux/releases/20/Images/x86_64/Fedora-x86_64-20-20131211.1-sda.qcow2 #IMAGE=${DIR}/Fedora-x86_64-20-20131211.1-sda.qcow2 IMAGE=${DIR}/Fedora-Cloud-Base-20141203-21.x86_64.raw # Amount of RAM in MB MEM=512 # Number of virtual CPUs CPUS=1 # Start the vm afterwards? RUN_AFTER=true # Resize the disk? By default it's a 2GB HDD RESIZE_DISK=true DISK_SIZE=10G # You can change this too, but it's OK to leave it as-is META_DATA=meta-data CI_ISO=cloud-image.iso DISK=root.qcow2 # Bail out if anything already exists. virsh dominfo ${NODEID} >/dev/null 2>&1 if [[ $? -eq 0 ]]; then echo "Domain ${NODEID} exists!" exit 1 elif [[ -e "${NODEID}" ]]; then echo "Directory ${NODEID} exists!" exit 2 fi # Grab our next sequential IP export NEXTIP=$(( $(cat skel/next-ip ) + 1)) # Incriment the counter echo ${NEXTIP} > skel/next-ip # Make directories for node, cloud-image, and populate cloud-image mkdir -p ${DIR}/${NODEID}/cloud-image cp skel/* ${DIR}/${NODEID}/cloud-image/ pushd ${DIR}/${NODEID} > /dev/null touch ${NODEID}.log pushd ${DIR}/${NODEID}/cloud-image > /dev/null echo "instance-id: ${NODEID}" > $META_DATA echo "local-hostname: ${HOSTID}" > $META_DATA # Update IP in user-data sed -i user-data -e "s/XXIP/${NEXTIP}/" echo "$(date -R) Generating ISO for cloud-init..." \ | tee -a ../${NODEID}.log genisoimage -output ../$CI_ISO -volid cidata -joliet -r * \ >> ../${NODEID}.log 2>&1 popd > /dev/null echo "$(date -R) Cloning and Resizing the disk..." \ | tee -a ${NODEID}.log virt-filesystems --long -h --all -a $IMAGE \ >> ${NODEID}.log 2>&1 qemu-img create -f qcow2 -o preallocation=metadata $DISK $DISK_SIZE \ >> ${NODEID}.log 2>&1 virt-resize --quiet --expand /dev/sda1 $IMAGE $DISK \ >> ${NODEID}.log 2>&1 virt-filesystems --long -h --all -a $IMAGE \ >> ${NODEID}.log 2>&1 echo "$(date -R) Installing the domain and adjusting the configuration..." \ | tee -a ${NODEID}.log virt-install --import --name ${NODEID} \ --ram $MEM --vcpus $CPUS \ --disk $DISK,format=qcow2,bus=virtio \ --disk $CI_ISO,device=cdrom \ --network bridge=br_lan,model=virtio \ --os-type=linux \ >> ${NODEID}.log 2>&1 echo "$(date -R) Cleaning up cloud-init..." \ | tee -a ${NODEID}.log # We're not interested in having the cloud-init data still loaded, let's clean this up # Eject cdrom virsh change-media ${NODEID} hda --eject --config \ >> ${NODEID}.log if $RUN_AFTER; then echo "$(date -R) Launching the ${NODEID} domain..." \ | tee -a ${NODEID}.log virsh start ${NODEID} \ >> ${NODEID}.log mac=`virsh dumpxml ${NODEID} | grep "mac address" | tr -s \' ' ' | awk ' { print $3 } '` echo "$(date -R) DONE, ssh to the $ip" fi popd > /dev/null