Vagrant images using packer

Thought I’d come back and show our final setup since people might be interested:

Build script

$env:PACKER_CACHE_DIR = "$env:TEMP\packer_cache"
try {
    Get-VMSwitch packer -ErrorAction Stop
} catch {
    # the default switch doesn't have internet access so that's a no go
    New-VMSwitch packer -NetAdapterName Ethernet -AllowManagementOS $true
    # Windows sets some stuff up before the interface has internet
    Start-Sleep -Seconds 1
}

Remove-Item -Recurse -Force -ErrorAction SilentlyContinue output-rocky8

# packer build -var type=internal .\build.pkr.hcl
packer build .\build.pkr.hcl

Remove-VMSwitch packer -Force

build.pkr.hcl

source "hyperv-iso" "rocky8" {
  boot_command                     = [
    "c",
    "setparams 'kickstart'<enter>",
    "linuxefi /images/pxeboot/vmlinuz inst.stage2=hd:LABEL=Rocky-8-4-x86_64-dvd inst.ks=hd:LABEL=ksdata:ks.cfg<enter>",
    "initrdefi /images/pxeboot/initrd.img<enter>",
    "boot<enter>"
  ]
  boot_wait                        = "2s"
  enable_dynamic_memory            = true
  enable_virtualization_extensions = false
  generation                       = 2
  iso_checksum                     = "sha256:ffe2fae67da6702d859cfb0b321561a5d616ce87a963d8a25b018c9c3d52d9a4"
  iso_url                          = "https://download.rockylinux.org/pub/rocky/8/isos/x86_64/Rocky-8.4-x86_64-dvd1.iso"
  disable_shutdown                 = true
  shutdown_timeout                 = "10m"
  communicator                     = "none"
  vm_name                          = "packer_vdl-rocky8"

  switch_name = "packer"
  cd_files = [
    "ks.cfg",
  ]
  cd_label = "ksdata"
}

build {
  sources = ["source.hyperv-iso.rocky8"]

  post-processor "compress" {
    keep_input_artifact  = true
    output = "{{.BuildName}}_{{.BuilderType}}.zip"
  }

  # post-processor "vagrant" {
  #   keep_input_artifact  = true
  #   output               = "build/vdl-rocky8_hyperv.box"
  #   vagrantfile_template = "./Vagrantfile.template"
  # }
}

ks.cfg

cdrom
lang en_US.UTF-8 --addsupport=en_GB.UTF-8,fr_BE.UTF-8
keyboard be
network --bootproto=dhcp
rootpw --iscrypted ...
firewall --disabled
timezone UTC
bootloader --location=mbr
text
skipx
zerombr
clearpart --all --initlabel
autopart --nohome --type=lvm
firstboot --disabled
eula --agreed
services --enabled=NetworkManager,sshd,hypervfcopyd,hypervkvpd,hypervvssd
user --name=dsi --lock --groups=wheel
poweroff

%packages --excludedocs
@Base
@Core
openssh-clients
sudo
net-tools
curl

# hyperv stuff
hyperv-daemons

# unnecessary stuff for servers
-cockpit
-quota
-fprintd*
-parted

# unnecessary firmware
-aic94xx-firmware
-alsa-firmware
-alsa-tools-firmware
-atmel-firmware
-b43-openfwwf
-bfa-firmware
-dracut-config-rescue
-ipw*-firmware
-irqbalance
-ivtv-firmware
-iwl*-firmware
-kernel-firmware
-libertas-usb8388-firmware
-microcode_ctl
-ql*-firmware
-rt61pci-firmware
-rt73usb-firmware
-xorg-x11-drv-ati-firmware
-zd1211-firmware
%end

%post
set -x

dnf update -y
dnf clean all

echo 'SUBSYSTEM=="memory", ACTION=="add", ATTR{state}="online"' > /etc/udev/rules.d/100-hyperv-dynamic-memory.rules
echo 'ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="none"' > /etc/udev/rules.d/100-hyperv-none-scheduler.rules

# sudo
echo "dsi        ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers.d/dsi
sed -i "s/^.*requiretty/#Defaults requiretty/" /etc/sudoers

mkdir -p /home/dsi/.ssh
(umask 0077 && echo '...' >> /home/dsi/.ssh/authorized_keys)
chown -R dsi: /home/dsi/.ssh
%end