From 7386de86d77235799e9548422adf958ca34031d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Fri, 24 Jul 2026 15:19:59 +0200 Subject: [PATCH] Make create_vm work on all OS versions in use Makes it work with the same cloudinit code on Ubuntu 20.04 by mounting it from a custom ISO as CD-ROM --- site-cookbooks/kosmos_kvm/recipes/host.rb | 10 ++++++- .../kosmos_kvm/templates/create_vm.erb | 28 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/site-cookbooks/kosmos_kvm/recipes/host.rb b/site-cookbooks/kosmos_kvm/recipes/host.rb index be25ce8..e1d72cf 100644 --- a/site-cookbooks/kosmos_kvm/recipes/host.rb +++ b/site-cookbooks/kosmos_kvm/recipes/host.rb @@ -5,6 +5,11 @@ package %w(virtinst libvirt-daemon-system libvirt-clients) +# Required on legacy hosts (Ubuntu 20.04) to build the NoCloud seed ISO +# via cloud-localds. Modern virt-install (>= 4.0.0, Ubuntu >= 22.04) +# handles cloud-init natively via --cloud-init and does not need it. +package "cloud-image-utils" if node["platform_version"].to_f < 22.04 + directory "/var/lib/libvirt/images/base" do recursive true owner "libvirt-qemu" @@ -24,7 +29,10 @@ end template "/usr/local/sbin/create_vm" do source "create_vm.erb" mode "0750" - variables base_image_path: node["kosmos_kvm"]["host"]["qemu_base_image"]["path"] + variables( + base_image_path: node["kosmos_kvm"]["host"]["qemu_base_image"]["path"], + modern_virt_install: node["platform_version"].to_f >= 22.04 + ) end firewall_rule 'ssh-alt-port' do diff --git a/site-cookbooks/kosmos_kvm/templates/create_vm.erb b/site-cookbooks/kosmos_kvm/templates/create_vm.erb index b94b79b..8dd3ed7 100644 --- a/site-cookbooks/kosmos_kvm/templates/create_vm.erb +++ b/site-cookbooks/kosmos_kvm/templates/create_vm.erb @@ -64,6 +64,7 @@ EOS popd fi +<% if @modern_virt_install -%> virt-install \ --name "$VMNAME" \ --ram "$RAM" \ @@ -83,3 +84,30 @@ virt-install \ --autostart \ --import \ --cloud-init root-password-generate=off,disable=on,meta-data=$CIDATA_PATH/meta-data,user-data=$CIDATA_PATH/user-data +<% else -%> +# Legacy path for hosts running virt-install < 4.0.0 (e.g. Ubuntu 20.04, +# virt-install 2.2.x). These versions predate the --osinfo/--cloud-init +# options, so we build a NoCloud seed ISO from the same user-data and +# meta-data files and attach it as a cdrom. The guest receives the +# exact same cloud-init configuration as on modern hosts. +cloud-localds "$CIDATA_PATH/seed.iso" "$CIDATA_PATH/user-data" "$CIDATA_PATH/meta-data" + +virt-install \ + --name "$VMNAME" \ + --ram "$RAM" \ + --vcpus "$CPUS" \ + --cpu host \ + --arch x86_64 \ + --hvm \ + --virt-type kvm \ + --disk "$IMAGE_PATH" \ + --disk "$CIDATA_PATH/seed.iso,device=cdrom" \ + --boot hd \ + --network=bridge=virbr0,model=virtio \ + --graphics none \ + --serial pty \ + --console pty \ + --channel unix,mode=bind,path=/var/lib/libvirt/qemu/$VMNAME.guest_agent.0,target_type=virtio,name=org.qemu.guest_agent.0 \ + --autostart \ + --import +<% end -%> -- 2.50.1