├── .gitignore ├── README.md ├── blog ├── .gitignore ├── cloud_init.cfg ├── makedisks.sh ├── makesshkeys.sh ├── network_config_static.cfg └── run.sh ├── centos7 ├── cloud_init.cfg ├── local-km-cloudimage.sh └── network_config_static.cfg ├── rhel81 ├── cloud_init.cfg ├── local-km-cloudimage.sh └── network_config_static.cfg └── ubuntu-bionic ├── cloud_init.cfg ├── local-km-cloudimage.sh ├── network_config_static.cfg └── testcloud1-metadata /.gitignore: -------------------------------------------------------------------------------- 1 | *.iso 2 | *.qcow2 3 | *.img 4 | *.raw 5 | id_rsa* 6 | id_rsa.* 7 | *-metadata 8 | 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Supporting blog entry with Ubuntu guest OS: https://fabianlee.org/2020/02/23/kvm-testing-cloud-init-locally-using-kvm 2 | 3 | Supporting blog entry with CentOS guest OS: https://fabianlee.org/2020/03/14/kvm-testing-cloud-init-locally-using-kvm-for-a-centos-cloud-image 4 | 5 | Supporting blog entry with RHEL guest OS: https://fabianlee.org/2020/03/22/kvm-testing-cloud-init-locally-using-kvm-for-a-rhel-cloud-image 6 | 7 | test 8 | -------------------------------------------------------------------------------- /blog/.gitignore: -------------------------------------------------------------------------------- 1 | # only put template into source control 2 | cloud_init.cfg 3 | -------------------------------------------------------------------------------- /blog/cloud_init.cfg: -------------------------------------------------------------------------------- 1 | #cloud-config 2 | hostname: test1 3 | fqdn: test1.example.com 4 | manage_etc_hosts: true 5 | users: 6 | - name: ubuntu 7 | sudo: ALL=(ALL) NOPASSWD:ALL 8 | groups: users, admin 9 | home: /home/ubuntu 10 | shell: /bin/bash 11 | lock_passwd: false 12 | ssh-authorized-keys: 13 | - 14 | # only cert auth via ssh (console access can still login) 15 | ssh_pwauth: false 16 | disable_root: false 17 | chpasswd: 18 | list: | 19 | ubuntu:linux 20 | expire: False 21 | packages: 22 | - qemu-guest-agent 23 | # written to /var/log/cloud-init-output.log 24 | final_message: "The system is finally up, after $UPTIME seconds" 25 | -------------------------------------------------------------------------------- /blog/makedisks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | qemu-img create -b ~/Downloads/bionic-server-cloudimg-amd64.img -f qcow2 snapshot-bionic-server-cloudimg.qcow2 10G 4 | 5 | cloud-localds -v --network-config=network_config_static.cfg test1-seed.qcow2 cloud_init.cfg 6 | -------------------------------------------------------------------------------- /blog/makesshkeys.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ssh-keygen -t rsa -b 4096 -f id_rsa -C test1 -N "" -q 3 | -------------------------------------------------------------------------------- /blog/network_config_static.cfg: -------------------------------------------------------------------------------- 1 | version: 2 2 | ethernets: 3 | ens3: 4 | dhcp4: false 5 | # default libvirt network 6 | addresses: [ 192.168.122.58/24 ] 7 | gateway4: 192.168.122.1 8 | nameservers: 9 | addresses: [ 192.168.122.1 ] 10 | search: [ example.com ] 11 | -------------------------------------------------------------------------------- /blog/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | virt-install --name test1 --virt-type kvm --memory 2048 --vcpus 2 --boot hd,menu=on --disk path=test1-seed.qcow2,device=cdrom --disk path=snapshot-bionic-server-cloudimg.qcow2,device=disk --graphics vnc --os-type Linux --os-variant ubuntu18.04 --network network:default --console pty,target_type=serial 4 | -------------------------------------------------------------------------------- /centos7/cloud_init.cfg: -------------------------------------------------------------------------------- 1 | #cloud-config 2 | hostname: centos7cloud1 3 | fqdn: centos7cloud1.example.com 4 | manage_etc_hosts: true 5 | users: 6 | - name: centos 7 | sudo: ALL=(ALL) NOPASSWD:ALL 8 | groups: adm,sys 9 | home: /home/centos 10 | shell: /bin/bash 11 | lock_passwd: false 12 | ssh-authorized-keys: 13 | - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC4F9GpyrkAb3+2h480nZtR9UkYJ0LoLPjte9jwKUzSRlay+40Bg7hXecfHL230u5Tvb6fC1nD83OJ+zjVdRNM/hlvMfLr4p4sj8Tc4lX6bCaKdWlZAVwLmux7lOpz8tkcqGHF62nZBdW0H5VzSAjxJncZ4Upbp2tEYASFhUEPv3uM774IJRffCx+4IDnquQFhZpEMM/NoebCrHvOKuT9jHNufwNWfzPDYJDFFRSzsJKeIbU7WWRCB3jSO2aNKaYpWq5PI8P92u0hVllRv8/R479DnQaoqcoWPvN7yaCTkLI2xyIzqtb1dDSLg8gomezxga9koS40oN7l3E8wNoom+jgO7ji5vYSRGIu+GhH6q7JmG98ucZ1b2WF3HHkT21Jt29YhZRfO2jYdNdzBGJ9Qqwh9XngetyNRWvY+KKtAjR9rEp/u5g781Pl6dTn3frB8qdHh+NTtmIBgRXjoJaIf1BQGM9tAtyyH5Am9LB/XC/m5IJ645LNPJkC0EAFYGskFO+1mYgjtxgKWLlGJwD9t0gIYmsz2aIMm1cOxJo8dXSaLwHO7phKP4opI+bS3qUubEBNpO7UAudGX5PvK+foRavVI4TRsDvdInLLTqjr0lTraDlU1qVgJb13LvCKS/cD7blNRm9f1jk7aJRyUV1KUzPcngMVOX/0XDoAgYdQGdvYw== centos7cloud1 14 | # only cert auth via ssh (console access can still login) 15 | ssh_pwauth: false 16 | disable_root: false 17 | chpasswd: 18 | list: | 19 | root:linux 20 | centos:newpass123 21 | expire: False 22 | packages: 23 | - qemu-guest-agent 24 | # for nslookup and vim 25 | - bind-utils 26 | - vim-enhanced 27 | 28 | growpart: 29 | mode: auto 30 | devices: ['/'] 31 | disk_setup: 32 | /dev/vdb: 33 | table_type: gpt 34 | layout: True 35 | overwrite: False 36 | fs_setup: 37 | - label: DATA_XFS 38 | filesystem: xfs 39 | device: '/dev/vdb' 40 | partition: auto 41 | #cmd: mkfs -t %(filesystem)s -L %(label)s %(device)s 42 | mounts: 43 | # [ /dev/vdx, /mountpoint, fstype ] 44 | - [ LABEL=DATA_XFS, /dataxfs, xfs ] 45 | 46 | # 3rd col=fs type, 4th col=permissions, 5th=backup enabled, 6th=fsck order 47 | mount_default_fields: [ None, None, "ext4", "defaults,noatime","0","2"] 48 | 49 | # every boot 50 | bootcmd: 51 | - [ sh, -c, 'echo ran cloud-init again at $(date) | sudo tee -a /root/bootcmd.log' ] 52 | 53 | # run once for network static IP fix 54 | runcmd: 55 | - [ sh, -c, 'sed -i s/BOOTPROTO=dhcp/BOOTPROTO=static/ /etc/sysconfig/network-scripts/ifcfg-eth0' ] 56 | - [ sh, -c, 'ifdown eth0 && sleep 1 && ifup eth0 && sleep 1 && ip a' ] 57 | 58 | # written to /var/log/cloud-init-output.log 59 | final_message: "The system is finally up, after $UPTIME seconds" 60 | -------------------------------------------------------------------------------- /centos7/local-km-cloudimage.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Takes standard CentOS7 cloudimg and creates VM configured with cloud-init 4 | # 5 | # uses snapshot and increases size of root filesystem so base image not affected 6 | # inserts cloud-init user, network, metadata into disk 7 | # creates 2nd data disk 8 | # then uses cloud-init to configure OS 9 | # 10 | set -x 11 | 12 | # image should be downloaded from ubuntu site 13 | os_variant="centos7.0" # osinfo-query os | grep centos 14 | baseimg=CentOS-7-x86_64-GenericCloud.qcow2 15 | if [ ! -f ~/Downloads/$baseimg ]; then 16 | echo "ERROR did not find ~/Downloads/$baseimg" 17 | echo "Doing download...." 18 | wget http://cloud.centos.org/centos/7/images/$baseimg -O ~/Downloads/$baseimg 19 | echo "" 20 | echo "$baseimg downloaded now. Run again" 21 | exit 2 22 | fi 23 | 24 | 25 | hostname=centos7cloud1 26 | if [ ! -f id_rsa ]; then 27 | echo "ERROR did not find ssh public/private key, generating now" 28 | ssh-keygen -t rsa -b 4096 -f id_rsa -C $hostname -N "" -q 29 | echo "" 30 | echo "The contents of id_rsa.pub need to be manually copied into cloud_init.cfg" 31 | exit 3 32 | fi 33 | 34 | 35 | snapshot=$hostname-snapshot-cloudimg.qcow2 36 | seed=$hostname-seed.img 37 | disk2=$hostname-extra.qcow2 38 | # vnc|none 39 | graphicsType=vnc 40 | 41 | 42 | # create working snapshot, increase size to 10G 43 | sudo rm $snapshot 44 | qemu-img create -b ~/Downloads/$baseimg -f qcow2 $snapshot 10G 45 | qemu-img info $snapshot 46 | 47 | # insert metadata into seed image 48 | echo "instance-id: $(uuidgen || echo i-abcdefg)" > $hostname-metadata 49 | cloud-localds -v --network-config=network_config_static.cfg $seed cloud_init.cfg $hostname-metadata 50 | 51 | # ensure file permissions belong to kvm group 52 | sudo chmod 666 $baseimg 53 | sudo chmod 666 $snapshot 54 | sudo chown $USER:kvm $snapshot $seed 55 | 56 | # create 2nd data disk, 20G sparse 57 | sudo rm $disk2 58 | qemu-img create -f qcow2 $disk2 20G 59 | chmod 666 $disk2 60 | chown $USER:kvm $disk2 61 | 62 | # create VM using libvirt 63 | virt-install --name $hostname \ 64 | --virt-type kvm --memory 2048 --vcpus 4 \ 65 | --boot hd,menu=on \ 66 | --disk path=$seed,device=cdrom \ 67 | --disk path=$snapshot,device=disk \ 68 | --disk path=$disk2,device=disk \ 69 | --graphics $graphicsType \ 70 | --os-type Linux --os-variant $os_variant \ 71 | --network network:default \ 72 | --noautoconsole 73 | -------------------------------------------------------------------------------- /centos7/network_config_static.cfg: -------------------------------------------------------------------------------- 1 | version: 2 2 | ethernets: 3 | eth0: 4 | dhcp4: false 5 | # default libvirt network 6 | addresses: [ 192.168.122.152/24 ] 7 | gateway4: 192.168.122.1 8 | nameservers: 9 | addresses: [ 192.168.122.1,8.8.8.8 ] 10 | search: [ example.com ] 11 | -------------------------------------------------------------------------------- /rhel81/cloud_init.cfg: -------------------------------------------------------------------------------- 1 | #cloud-config 2 | hostname: rhel8cloud1 3 | fqdn: rhel8cloud1.example.com 4 | manage_etc_hosts: true 5 | users: 6 | - name: rhel 7 | sudo: ALL=(ALL) NOPASSWD:ALL 8 | groups: adm,sys 9 | home: /home/rhel 10 | shell: /bin/bash 11 | lock_passwd: false 12 | ssh-authorized-keys: 13 | - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC4F9GpyrkAb3+2h480nZtR9UkYJ0LoLPjte9jwKUzSRlay+40Bg7hXecfHL230u5Tvb6fC1nD83OJ+zjVdRNM/hlvMfLr4p4sj8Tc4lX6bCaKdWlZAVwLmux7lOpz8tkcqGHF62nZBdW0H5VzSAjxJncZ4Upbp2tEYASFhUEPv3uM774IJRffCx+4IDnquQFhZpEMM/NoebCrHvOKuT9jHNufwNWfzPDYJDFFRSzsJKeIbU7WWRCB3jSO2aNKaYpWq5PI8P92u0hVllRv8/R479DnQaoqcoWPvN7yaCTkLI2xyIzqtb1dDSLg8gomezxga9koS40oN7l3E8wNoom+jgO7ji5vYSRGIu+GhH6q7JmG98ucZ1b2WF3HHkT21Jt29YhZRfO2jYdNdzBGJ9Qqwh9XngetyNRWvY+KKtAjR9rEp/u5g781Pl6dTn3frB8qdHh+NTtmIBgRXjoJaIf1BQGM9tAtyyH5Am9LB/XC/m5IJ645LNPJkC0EAFYGskFO+1mYgjtxgKWLlGJwD9t0gIYmsz2aIMm1cOxJo8dXSaLwHO7phKP4opI+bS3qUubEBNpO7UAudGX5PvK+foRavVI4TRsDvdInLLTqjr0lTraDlU1qVgJb13LvCKS/cD7blNRm9f1jk7aJRyUV1KUzPcngMVOX/0XDoAgYdQGdvYw== rhelcloud1 14 | # only cert auth via ssh (console access can still login) 15 | ssh_pwauth: false 16 | disable_root: false 17 | chpasswd: 18 | list: | 19 | root:linux 20 | rhel:newpass123 21 | expire: False 22 | 23 | # https://cloudinit.readthedocs.io/en/latest/topics/examples.html#register-redhat-subscription 24 | # https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_atomic_host/7/html/installation_and_configuration_guide/setting_up_cloud_init 25 | #rh_subscription: 26 | # username: email@myemail.com 27 | # password: '1234abcd' 28 | # auto-attach: True 29 | # service-level: self-support 30 | # 31 | # no repo until rhel registration 32 | # alternative is to mount ISO or create local repo 33 | #packages: 34 | #- qemu-guest-agent 35 | # for nslookup and vim 36 | #- bind-utils 37 | #- vim-enhanced 38 | 39 | growpart: 40 | mode: auto 41 | devices: ['/'] 42 | disk_setup: 43 | /dev/vdb: 44 | table_type: gpt 45 | layout: True 46 | overwrite: False 47 | fs_setup: 48 | - label: DATA_XFS 49 | filesystem: xfs 50 | device: '/dev/vdb' 51 | partition: auto 52 | #cmd: mkfs -t %(filesystem)s -L %(label)s %(device)s 53 | mounts: 54 | # [ /dev/vdx, /mountpoint, fstype ] 55 | - [ LABEL=DATA_XFS, /dataxfs, xfs ] 56 | 57 | # 3rd col=fs type, 4th col=permissions, 5th=backup enabled, 6th=fsck order 58 | mount_default_fields: [ None, None, "ext4", "defaults,noatime","0","2"] 59 | 60 | # every boot 61 | bootcmd: 62 | - [ sh, -c, 'echo ran cloud-init again at $(date) | sudo tee -a /root/bootcmd.log' ] 63 | - [ sh, -c, 'echo $(date) instid=$INSTANCE_ID | sudo tee -a /root/bootcmd.log' ] 64 | 65 | # run once for network static IP fix 66 | runcmd: 67 | - [ sh, -c, 'sed -i s/BOOTPROTO=dhcp/BOOTPROTO=static/ /etc/sysconfig/network-scripts/ifcfg-eth0' ] 68 | - [ sh, -c, 'ifdown eth0 && sleep 1 && ifup eth0 && sleep 1 && ip a' ] 69 | - [ sh, -c, 'echo $(date) instid=$INSTANCE_ID | sudo tee -a /root/runcmd.log' ] 70 | 71 | # written to /var/log/cloud-init.log 72 | final_message: "The system is finally up, after $UPTIME seconds" 73 | -------------------------------------------------------------------------------- /rhel81/local-km-cloudimage.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Takes RHEL KVM cloud image and creates VM configured with cloud-init 4 | # 5 | # uses snapshot and increases size of root filesystem so base image not affected 6 | # inserts cloud-init user, network, metadata into disk 7 | # creates 2nd data disk 8 | # then uses cloud-init to configure OS 9 | # 10 | set -x 11 | 12 | # image should be downloaded from ubuntu site 13 | os_variant="rhel7" # osinfo-query os | grep rhel 14 | baseimg=rhel-8.1-x86_64-kvm.qcow2 15 | if [ ! -f ~/Downloads/$baseimg ]; then 16 | echo "ERROR did not find ~/Downloads/$baseimg" 17 | echo "Get the RHEL KVM cloud image manually at:" 18 | echo "https://access.redhat.com/downloads/content/479/ver=/rhel---8/8.1/x86_64/product-software" 19 | exit 2 20 | fi 21 | 22 | 23 | hostname=rhel8cloud1 24 | if [ ! -f id_rsa ]; then 25 | echo "ERROR did not find ssh public/private key, generating now" 26 | ssh-keygen -t rsa -b 4096 -f id_rsa -C $hostname -N "" -q 27 | echo "" 28 | echo "The contents of id_rsa.pub need to be manually copied into cloud_init.cfg" 29 | exit 3 30 | fi 31 | 32 | 33 | snapshot=$hostname-snapshot-cloudimg.qcow2 34 | seed=$hostname-seed.img 35 | disk2=$hostname-extra.qcow2 36 | # vnc|none 37 | graphicsType=vnc 38 | 39 | 40 | # create working snapshot, increase size from 10G to 12G 41 | sudo rm $snapshot 42 | qemu-img create -b ~/Downloads/$baseimg -f qcow2 $snapshot 12G 43 | qemu-img info $snapshot 44 | 45 | # insert metadata into seed image 46 | echo "instance-id: $(uuidgen || echo i-abcdefg)" > $hostname-metadata 47 | cloud-localds -v --network-config=network_config_static.cfg $seed cloud_init.cfg $hostname-metadata 48 | 49 | # ensure file permissions belong to kvm group 50 | sudo chmod 666 $baseimg 51 | sudo chmod 666 $snapshot 52 | sudo chown $USER:kvm $snapshot $seed 53 | 54 | # create 2nd data disk, 20G sparse 55 | sudo rm $disk2 56 | qemu-img create -f qcow2 $disk2 20G 57 | chmod 666 $disk2 58 | chown $USER:kvm $disk2 59 | 60 | # create VM using libvirt 61 | virt-install --name $hostname \ 62 | --virt-type kvm --memory 2048 --vcpus 4 \ 63 | --boot hd,menu=on \ 64 | --disk path=$seed,device=cdrom \ 65 | --disk path=$snapshot,device=disk \ 66 | --disk path=$disk2,device=disk \ 67 | --graphics $graphicsType \ 68 | --os-type Linux --os-variant $os_variant \ 69 | --network network:default \ 70 | --noautoconsole 71 | -------------------------------------------------------------------------------- /rhel81/network_config_static.cfg: -------------------------------------------------------------------------------- 1 | version: 2 2 | ethernets: 3 | eth0: 4 | dhcp4: false 5 | # default libvirt network 6 | addresses: [ 192.168.122.153/24 ] 7 | gateway4: 192.168.122.1 8 | nameservers: 9 | addresses: [ 192.168.122.1,8.8.8.8 ] 10 | search: [ example.com ] 11 | -------------------------------------------------------------------------------- /ubuntu-bionic/cloud_init.cfg: -------------------------------------------------------------------------------- 1 | #cloud-config 2 | hostname: bioniccloud1 3 | fqdn: bioniccloud1.example.com 4 | manage_etc_hosts: true 5 | users: 6 | - name: ubuntu 7 | sudo: ALL=(ALL) NOPASSWD:ALL 8 | groups: users, admin 9 | home: /home/ubuntu 10 | shell: /bin/bash 11 | lock_passwd: false 12 | ssh-authorized-keys: 13 | - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC4F9GpyrkAb3+2h480nZtR9UkYJ0LoLPjte9jwKUzSRlay+40Bg7hXecfHL230u5Tvb6fC1nD83OJ+zjVdRNM/hlvMfLr4p4sj8Tc4lX6bCaKdWlZAVwLmux7lOpz8tkcqGHF62nZBdW0H5VzSAjxJncZ4Upbp2tEYASFhUEPv3uM774IJRffCx+4IDnquQFhZpEMM/NoebCrHvOKuT9jHNufwNWfzPDYJDFFRSzsJKeIbU7WWRCB3jSO2aNKaYpWq5PI8P92u0hVllRv8/R479DnQaoqcoWPvN7yaCTkLI2xyIzqtb1dDSLg8gomezxga9koS40oN7l3E8wNoom+jgO7ji5vYSRGIu+GhH6q7JmG98ucZ1b2WF3HHkT21Jt29YhZRfO2jYdNdzBGJ9Qqwh9XngetyNRWvY+KKtAjR9rEp/u5g781Pl6dTn3frB8qdHh+NTtmIBgRXjoJaIf1BQGM9tAtyyH5Am9LB/XC/m5IJ645LNPJkC0EAFYGskFO+1mYgjtxgKWLlGJwD9t0gIYmsz2aIMm1cOxJo8dXSaLwHO7phKP4opI+bS3qUubEBNpO7UAudGX5PvK+foRavVI4TRsDvdInLLTqjr0lTraDlU1qVgJb13LvCKS/cD7blNRm9f1jk7aJRyUV1KUzPcngMVOX/0XDoAgYdQGdvYw== bioniccloud1 14 | # only cert auth via ssh (console access can still login) 15 | ssh_pwauth: false 16 | disable_root: false 17 | chpasswd: 18 | list: | 19 | ubuntu:linux 20 | expire: False 21 | packages: 22 | - qemu-guest-agent 23 | 24 | growpart: 25 | mode: auto 26 | devices: ['/'] 27 | disk_setup: 28 | /dev/vdb: 29 | table_type: gpt 30 | layout: True 31 | overwrite: False 32 | fs_setup: 33 | - label: DATA_XFS 34 | filesystem: xfs 35 | device: '/dev/vdb' 36 | partition: auto 37 | #cmd: mkfs -t %(filesystem)s -L %(label)s %(device)s 38 | mounts: 39 | # [ /dev/vdx, /mountpoint, fstype ] 40 | - [ LABEL=DATA_XFS, /dataxfs, xfs ] 41 | 42 | # 3rd col=fs type, 4th col=permissions, 5th=backup enabled, 6th=fsck order 43 | mount_default_fields: [ None, None, "ext4", "defaults,noatime","0","2"] 44 | 45 | # every boot 46 | bootcmd: 47 | - [ sh, -c, 'echo ran cloud-init again at $(date) | sudo tee -a /root/bootcmd.log' ] 48 | 49 | # run once for setup 50 | runcmd: 51 | - [ sh, -c, 'update-grub' ] 52 | 53 | # reboot so grub config takes affect 54 | power_state: 55 | mode: reboot 56 | 57 | # written to /var/log/cloud-init-output.log 58 | final_message: "The system is finall up, after $UPTIME seconds" 59 | -------------------------------------------------------------------------------- /ubuntu-bionic/local-km-cloudimage.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Takes standard Ubuntu 18.04 cloudimg and creates VM configured with cloud-init 4 | # 5 | # uses snapshot and increases size of root filesystem so base image not affected 6 | # inserts cloud-init user, network, metadata into disk 7 | # creates 2nd data disk 8 | # then uses cloud-init to configure OS 9 | # 10 | set -x 11 | 12 | # image should be downloaded from ubuntu site 13 | os_variant="ubuntu18.04" 14 | baseimg=bionic-server-cloudimg-amd64.img 15 | if [ ! -f ~/Downloads/$baseimg ]; then 16 | echo "ERROR did not find ~/Downloads/$baseimg" 17 | echo "Doing download...." 18 | wget https://cloud-images.ubuntu.com/bionic/current/$baseimg -O ~/Downloads/$baseimg 19 | echo "" 20 | echo "$baseimg downloaded now. Run again" 21 | exit 2 22 | fi 23 | 24 | 25 | hostname=bioniccloud1 26 | if [ ! -f id_rsa ]; then 27 | echo "ERROR did not find ssh public/private key, generating now" 28 | ssh-keygen -t rsa -b 4096 -f id_rsa -C $hostname -N "" -q 29 | echo "" 30 | echo "The contents of id_rsa.pub need to be manually copied into cloud_init.cfg" 31 | exit 3 32 | fi 33 | 34 | 35 | snapshot=$hostname-snapshot-cloudimg.qcow2 36 | seed=$hostname-seed.img 37 | disk2=$hostname-extra.qcow2 38 | # vnc|none 39 | graphicsType=vnc 40 | 41 | 42 | # create working snapshot, increase size to 5G 43 | sudo rm $snapshot 44 | qemu-img create -b ~/Downloads/$baseimg -f qcow2 $snapshot 5G 45 | qemu-img info $snapshot 46 | 47 | # insert metadata into seed image 48 | echo "instance-id: $(uuidgen || echo i-abcdefg)" > $hostname-metadata 49 | cloud-localds -v --network-config=network_config_static.cfg $seed cloud_init.cfg $hostname-metadata 50 | 51 | # ensure file permissions belong to kvm group 52 | sudo chmod 666 $baseimg 53 | sudo chmod 666 $snapshot 54 | sudo chown $USER:kvm $snapshot $seed 55 | 56 | # create 2nd data disk, 20G sparse 57 | sudo rm $disk2 58 | qemu-img create -f qcow2 $disk2 20G 59 | chmod 666 $disk2 60 | chown $USER:kvm $disk2 61 | 62 | # create VM using libvirt 63 | virt-install --name $hostname \ 64 | --virt-type kvm --memory 2048 --vcpus 2 \ 65 | --boot hd,menu=on \ 66 | --disk path=$seed,device=cdrom \ 67 | --disk path=$snapshot,device=disk \ 68 | --disk path=$disk2,device=disk \ 69 | --graphics $graphicsType \ 70 | --os-type Linux --os-variant $os_variant \ 71 | --network network:default \ 72 | --console pty,target_type=serial \ 73 | --noautoconsole 74 | 75 | 76 | -------------------------------------------------------------------------------- /ubuntu-bionic/network_config_static.cfg: -------------------------------------------------------------------------------- 1 | version: 2 2 | ethernets: 3 | ens3: 4 | dhcp4: false 5 | # default libvirt network 6 | addresses: [ 192.168.122.59/24 ] 7 | gateway4: 192.168.122.1 8 | nameservers: 9 | addresses: [ 192.168.122.1 ] 10 | search: [ example.com ] 11 | -------------------------------------------------------------------------------- /ubuntu-bionic/testcloud1-metadata: -------------------------------------------------------------------------------- 1 | instance-id: a01bbe40-f9f6-4dd3-9c10-8b8ecd343f21 2 | --------------------------------------------------------------------------------