Add packer scripts to build mosk image
Automate steps with building image for virtual mosk deployments.
Related-Prod: PRODX-35395
Change-Id: Ideff56310d153ceb034899f2efd8995f930e65d9
diff --git a/mosk-images/Makefile b/mosk-images/Makefile
new file mode 100644
index 0000000..9ca4013
--- /dev/null
+++ b/mosk-images/Makefile
@@ -0,0 +1,12 @@
+.PHONY: build cloud-config
+default: cloud-config build
+
+all: cloud-config build
+
+build:
+ ./build_image.sh
+
+clean:
+ rm -rf config-drive/cloudata.iso
+ rm -rf images
+ rm -rf packer_images_cache
diff --git a/mosk-images/build_image.sh b/mosk-images/build_image.sh
new file mode 100755
index 0000000..10450a8
--- /dev/null
+++ b/mosk-images/build_image.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+set -ex
+
+export ENVIRONMENT=${ENVIRONMENT:-'mosk-23.3'}
+
+source env/${ENVIRONMENT}.sh
+export VM_NAME=${VM_NAME:-"${ENVIRONMENT}-amd64-$(date +"%Y%m%d%H%M%S").qcow2"}
+
+export PACKER_LOG=1
+export PACKER_IMAGES_CACHE="./packer_images_cache"
+mkdir -p "${PACKER_IMAGES_CACHE}"
+
+PACKER_BINARY=${PACKER_BINARY:-"$(which packer)"}
+
+
+./config_drive.sh
+
+$PACKER_BINARY build -on-error=abort template.json
diff --git a/mosk-images/config-drive/meta-data b/mosk-images/config-drive/meta-data
new file mode 100644
index 0000000..d819e91
--- /dev/null
+++ b/mosk-images/config-drive/meta-data
@@ -0,0 +1 @@
+hostname: mosk
diff --git a/mosk-images/config-drive/user-data b/mosk-images/config-drive/user-data
new file mode 100644
index 0000000..28d97fd
--- /dev/null
+++ b/mosk-images/config-drive/user-data
@@ -0,0 +1,13 @@
+#cloud-config
+debug: True
+ssh_pwauth: True
+disable_root: false
+chpasswd:
+ list: |
+ root:r00tme
+ expire: False
+output: {all: '| tee -a /var/log/cloud-init-output.log'}
+runcmd:
+ - sed -i'.orig' -e's/\#PermitRootLogin.*/PermitRootLogin yes/g' -e's/PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config
+ - service sshd restart
+ - sed -i'.orig' -e's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
diff --git a/mosk-images/config_drive.sh b/mosk-images/config_drive.sh
new file mode 100755
index 0000000..9596b21
--- /dev/null
+++ b/mosk-images/config_drive.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+[ -f config-drive/cloudata.iso ] && rm -v config-drive/cloudata.iso
+mkisofs -o config-drive/cloudata.iso -V cidata -r -J --quiet config-drive
diff --git a/mosk-images/env/23.3.sh b/mosk-images/env/23.3.sh
new file mode 100644
index 0000000..7ac544d
--- /dev/null
+++ b/mosk-images/env/23.3.sh
@@ -0,0 +1,3 @@
+export IMAGE_BASE_URL="https://cloud-images.ubuntu.com/focal/20230915/focal-server-cloudimg-amd64.img"
+export IMAGE_MD5_URL="https://cloud-images.ubuntu.com/focal/20230915/MD5SUMS"
+export KERNEL_VERSION=${KERNEL_VERSION:-'5.15.0-83-generic'}
diff --git a/mosk-images/scripts/apt.sh b/mosk-images/scripts/apt.sh
new file mode 100644
index 0000000..11d52ec
--- /dev/null
+++ b/mosk-images/scripts/apt.sh
@@ -0,0 +1,9 @@
+set -ex
+
+apt update
+
+DEBIAN_FRONTEND=noninteractive apt install -y \
+ linux-headers-${KERNEL_VERSION} \
+ linux-image-${KERNEL_VERSION}
+
+echo "Kernel is installed."
diff --git a/mosk-images/scripts/cleanup.sh b/mosk-images/scripts/cleanup.sh
new file mode 100644
index 0000000..9c2c2df
--- /dev/null
+++ b/mosk-images/scripts/cleanup.sh
@@ -0,0 +1,3 @@
+set -ex
+
+echo -n "" > /etc/machine-id
diff --git a/mosk-images/template.json b/mosk-images/template.json
new file mode 100644
index 0000000..6df1ee9
--- /dev/null
+++ b/mosk-images/template.json
@@ -0,0 +1,62 @@
+{
+ "variables": {
+ "user": "root",
+ "password": "r00tme",
+ "disk_size": "2500M",
+ "images_cache": "{{ env `PACKER_IMAGES_CACHE` }}",
+ "image_base_url": "{{ env `IMAGE_BASE_URL` }}",
+ "image_md5_url": "{{ env `IMAGE_MD5_URL` }}",
+ "vm_name": "{{ env `VM_NAME` }}"
+ },
+ "provisioners": [
+ {
+ "type": "shell",
+ "scripts": [
+ "scripts/apt.sh",
+ "scripts/cleanup.sh"
+ ]
+ }
+ ],
+ "builders": [
+ {
+ "type": "qemu",
+ "qemuargs": [
+ [
+ "-m",
+ "8096M"
+ ],
+ [
+ "-smp",
+ "4"
+ ],
+ [
+ "-cdrom",
+ "config-drive/cloudata.iso"
+ ],
+ ["-device", "virtio-net,netdev=user.0"],
+ ["-object","rng-random,id=objrng0,filename=/dev/urandom"],
+ ["-device", "virtio-rng-pci,rng=objrng0,id=rng0,bus=pci.0,addr=0x10" ]
+ ],
+ "vm_name": "{{user `vm_name`}}",
+ "output_directory": "images",
+ "disk_compression": true,
+ "disk_size": "{{ user `disk_size`}}",
+ "format": "qcow2",
+ "iso_url": "{{ user `image_base_url`}}",
+ "iso_checksum": "file:{{ user `image_md5_url`}}",
+ "iso_target_path": "{{ user `images_cache`}}",
+ "disk_image": true,
+ "accelerator": "kvm",
+ "headless": true,
+ "ssh_username": "{{user `user`}}",
+ "ssh_password": "{{user `password`}}",
+ "ssh_host_port_min": 7000,
+ "ssh_host_port_max": 7050,
+ "vnc_port_max": "5956",
+ "vnc_port_min": "5956",
+ "shutdown_command": "shutdown -P now",
+ "boot_wait": "10s",
+ "ssh_wait_timeout": "360s"
+ }
+ ]
+}