#!/bin/bash set -e if [[ $# -lt 3 ]] ; then cat <<-EOF USAGE (RAM in megabytes) create_vm VMNAME RAM CPUS DISKSIZE EOF exit 1 fi VMNAME=$1 RAM=$2 CPUS=$3 DISKSIZE=${4:-10} # 10GB default # Directory where image files will be stored IMAGE_DIR=/var/lib/libvirt/images IMAGE_PATH=$IMAGE_DIR/${VMNAME}.qcow2 CIDATA_PATH=${IMAGE_DIR}/${VMNAME}-cloudinit BASE_FILE=<%= @base_image_path %> # Create the VM image if it does not already exist if [ ! -f "$IMAGE_PATH" ]; then echo "info: image file $IMAGE_PATH not found. creating new image" # Important: -F qcow2 is required to set the image format qemu-img create -b "$BASE_FILE" -f qcow2 -F qcow2 "$IMAGE_PATH" ${DISKSIZE}G chmod 600 "$IMAGE_PATH" if [ $? -ne 0 ]; then echo "error: failed to create image" exit 1 fi fi # Dump the image info qemu-img info "$IMAGE_PATH" # Check if the cloud-init metadata file exists # if not, generate it if [ ! -r $CIDATA_PATH ]; then mkdir -p $CIDATA_PATH pushd $CIDATA_PATH cat > user-data <<-EOS #cloud-config ssh_authorized_keys: - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCw0I82gT8R4tpsqWGovLyjm2SR2F863MqNz224h3h/wl0xA5Eu0eRro+ELLv2hoebqQbcMsb89X5+7ObhDRar+b7tzDlXq4x+ECkAy6WbDSmBp3kNVd7muT4c9Zw7UxKsIvIm1ven1TkJ3UG80o6PyGiAUlBj4puIQwhp7OVknVutBBe8Rpp4f6BEuWluwpnPxc3KSaGhhr9p10xeX69cfspH40r8vHpI0zp19O5GpfYSOEH64UbwRpN2QypNB8ISmDHFsNGwdz0Ba4qrEOSGU9GveyOcsvEtt630/0fHqtbPBovOYu/FJISQZya2tofDig4EngBCJNfsPCbXFHtlp greg@karekinian.com - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDyUDR7ZE6HWmjvlfKrG8Ci+q5E4adbyboKvyYVkUXaTYt+DgisPPAqfGkd0yAHgVnmOS/3f5c3D6RrIXcxFmzwpV2BtmGZztBnEYvC5q8XPQhmu6AFl6ZDjh9XzUeO52py8tt5ZJ9W1R2ob/rlgX8txNHi6XwzuvPxZ7NR/iNup7cruBzkHABhwTvTfwaErufr6eNmNjh5VatNTei1ld6yWtmvbYJqJlpq6YyPu9vYNYPg0AB7I+OqOJhzHXhelY28GSP9KF3GDcHDtN1bV21g9+COcdKhMShQaw1WIkfQKdiuFictZIOCP0/uYSiFhyyoSvISiC3eT8zIimRbDRj basti@skddc.local runcmd: # Enable serial console (for virsh) - systemctl enable serial-getty@ttyS0.service && systemctl start serial-getty@ttyS0.service - curl -s 'https://raw.githubusercontent.com/zerotier/ZeroTierOne/master/doc/contact%40zerotier.com.gpg' | gpg --import - curl -s -o /tmp/install_zerotier 'https://install.zerotier.com/' - cat /tmp/install_zerotier | gpg && bash /tmp/install_zerotier - zerotier-cli join 8541e5153eb4327c EOS cat > meta-data <<-EOS instance-id: $VMNAME local-hostname: $VMNAME EOS popd fi virt-install \ --name "$VMNAME" \ --ram "$RAM" \ --vcpus "$CPUS" \ --cpu host \ --arch x86_64 \ --osinfo detect=on,name=ubuntujammy \ --hvm \ --virt-type kvm \ --disk "$IMAGE_PATH" \ --boot hd \ --network=bridge=virbr0,model=virtio \ --graphics none \ --serial pty \ --console pty \ --channel unix,mode=bind,path=/var/lib/libvirt/qemu/$VMNAME.guest_agent.0,target_type=virtio,name=org.qemu.guest_agent.0 \ --autostart \ --import \ --cloud-init root-password-generate=off,disable=on,meta-data=$CIDATA_PATH/meta-data,user-data=$CIDATA_PATH/user-data