3 BASE_IMAGE=https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-disk1.img
4 declare -A NODES=( [cfg01]=4096 [ctl01]=14336 [gtw01]=2048 [cmp01]=6144 [cmp02]=6144 )
6 # get required packages
7 apt-get install -y mkisofs curl virtinst cpu-checker qemu-kvm
10 [ -f $SSH_KEY ] || ssh-keygen -f $SSH_KEY -N ''
11 install -o jenkins -m 0600 ${SSH_KEY} /tmp/
15 wget -P /tmp -nc $BASE_IMAGE
17 # generate cloud-init user data
18 envsubst < user-data.template > user-data.sh
20 for node in "${!NODES[@]}"; do
21 # clean up existing nodes
22 if [ "$(virsh domstate $node 2>/dev/null)" == 'running' ]; then
27 # create/prepare images
28 [ -f images/mcp_${node}.iso ] || ./create-config-drive.sh -k ${SSH_KEY}.pub -u user-data.sh -h ${node} images/mcp_${node}.iso
29 cp /tmp/${BASE_IMAGE/*\/} images/mcp_${node}.qcow2
30 qemu-img resize images/mcp_${node}.qcow2 100G
33 # create required networks
34 for net in pxe mgmt internal public; do
35 if virsh net-info $net >/dev/null 2>&1; then
36 virsh net-destroy ${net}
37 virsh net-undefine ${net}
39 virsh net-define net_${net}.xml
40 virsh net-autostart ${net}
41 virsh net-start ${net}
44 # create vms with specified options
45 for node in "${!NODES[@]}"; do
46 virt-install --name ${node} --ram ${NODES[$node]} --vcpus=2 --cpu host --accelerate \
47 --network network:pxe,model=virtio \
48 --network network:mgmt,model=virtio \
49 --network network:internal,model=virtio \
50 --network network:public,model=virtio \
51 --disk path=$(pwd)/images/mcp_${node}.qcow2,format=qcow2,bus=virtio,cache=none,io=native \
52 --os-type linux --os-variant none \
53 --boot hd --vnc --console pty --autostart --noreboot \
54 --disk path=$(pwd)/images/mcp_${node}.iso,device=cdrom
57 # set static ip address for salt master node
58 virsh net-update pxe add ip-dhcp-host \
59 "<host mac='$(virsh domiflist cfg01 | awk '/pxe/ {print $5}')' name='cfg01' ip='$SALT_MASTER'/>" --live
62 for node in "${!NODES[@]}"; do
67 CONNECTION_ATTEMPTS=60
70 # wait until ssh on Salt master is available
71 echo "Attempting to ssh to Salt master ..."
74 while (($ATTEMPT <= $CONNECTION_ATTEMPTS)); do
75 ssh $SSH_OPTS ubuntu@$SALT_MASTER uptime
77 (0) echo "${ATTEMPT}> Success"; break ;;
78 (*) echo "${ATTEMPT}/${CONNECTION_ATTEMPTS}> ssh server ain't ready yet, waiting for ${SLEEP} seconds ..." ;;