test
#!/bin/bash
set -e
# CONFIGURATION
VM_COUNT=3
BASE_IMG="/var/lib/libvirt/images/ubuntu-2004-base.qcow2"
RAM_MB=8192
VCPUS=8
DISK_SIZE_GB=32
NETWORK_PREFIX="10.10.10"
GATEWAY="10.10.10.1"
DNS="8.8.8.8"
START_VNC_PORT=5900
declare -a VM_INFO
for i in $(seq 1 $VM_COUNT); do
VM_NAME="vm${i}"
STATIC_IP="${NETWORK_PREFIX}.$((100 + i))"
LINKED_IMG="/var/lib/libvirt/images/${VM_NAME}.qcow2"
CI_ISO="/var/lib/libvirt/images/${VM_NAME}-cidata.iso"
MAC_ADDR=$(printf '52:54:00:%02x:%02x:%02x' $((RANDOM % 256)) $((RANDOM % 256)) $((RANDOM % 256)))
VNC_PORT=$((START_VNC_PORT + i))
echo "[+] Creating linked image for $VM_NAME..."
qemu-img create -f qcow2 -b "$BASE_IMG" -F qcow2 "$LINKED_IMG"
echo "[+] Creating cloud-init ISO for $VM_NAME..."
mkdir -p /tmp/${VM_NAME}-cloudinit
cat > /tmp/${VM_NAME}-cloudinit/user-data <<EOF
#cloud-config
hostname: ${VM_NAME}
manage_etc_hosts: true
users:
- name: ubuntu
ssh-authorized-keys:
- $(cat ~/.ssh/id_rsa.pub)
sudo: ['ALL=(ALL) NOPASSWD:ALL']
shell: /bin/bash
package_update: true
package_upgrade: true
packages:
- qemu-guest-agent
runcmd:
- systemctl enable qemu-guest-agent
EOF
cat > /tmp/${VM_NAME}-cloudinit/meta-data <<EOF
instance-id: ${VM_NAME}
local-hostname: ${VM_NAME}
EOF
cat > /tmp/${VM_NAME}-cloudinit/network-config <<EOF
version: 2
ethernets:
ens3:
dhcp4: false
addresses: [${STATIC_IP}/24]
gateway4: ${GATEWAY}
nameservers:
addresses: [${DNS}]
EOF
genisoimage -quiet -output "$CI_ISO" -volid cidata -joliet -rock \
/tmp/${VM_NAME}-cloudinit/user-data \
/tmp/${VM_NAME}-cloudinit/meta-data \
/tmp/${VM_NAME}-cloudinit/network-config
rm -rf /tmp/${VM_NAME}-cloudinit
echo "[+] Defining VM $VM_NAME with MAC $MAC_ADDR, IP $STATIC_IP, VNC port $VNC_PORT..."
virt-install \
--name "${VM_NAME}" \
--ram "$RAM_MB" \
--vcpus "$VCPUS" \
--disk path="$LINKED_IMG",format=qcow2,bus=virtio \
--disk path="$CI_ISO",device=cdrom \
--os-variant ubuntu20.04 \
--graphics vnc,listen=0.0.0.0,port=$VNC_PORT \
--network network=default,model=virtio,mac="$MAC_ADDR" \
--import \
--noautoconsole
VM_INFO+=("$VM_NAME $STATIC_IP $MAC_ADDR VNC:$VNC_PORT")
done
echo ""
echo "========================================="
echo "✅ VM Creation Complete. Summary:"
echo "========================================="
printf "%-10s %-15s %-20s %-10s\n" "VM Name" "IP Address" "MAC Address" "VNC Port"
for entry in "${VM_INFO[@]}"; do
printf "%-10s %-15s %-20s %-10s\n" $entry
done
Comments
Post a Comment