# install-cloudbase-init.ps1 # Packer provisioner: downloads, installs and configures Cloudbase-Init # for Proxmox cloud-init (ConfigDrive metadata service). $msiUrl = "https://cloudbase.it/downloads/CloudbaseInitSetup_Stable_x64.msi" $msiPath = "C:\Windows\Temp\CloudbaseInitSetup.msi" $cbDir = "C:\Program Files\Cloudbase Solutions\Cloudbase-Init" # ---- Download ---- Write-Host "Downloading Cloudbase-Init..." [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $retries = 3 for ($i = 1; $i -le $retries; $i++) { try { Invoke-WebRequest -Uri $msiUrl -OutFile $msiPath -UseBasicParsing break } catch { Write-Host "Download attempt $i failed: $_" if ($i -eq $retries) { throw "Failed to download Cloudbase-Init after $retries attempts" } Start-Sleep -Seconds 10 } } Unblock-File -Path $msiPath # ---- Install (silent, Local System account) ---- Write-Host "Installing Cloudbase-Init..." $proc = Start-Process msiexec.exe -ArgumentList "/i `"$msiPath`" /qn /norestart /l*v C:\Windows\Temp\cloudbase-install.log RUN_SERVICE_AS_LOCAL_SYSTEM=1" -Wait -PassThru Write-Host "MSI exit code: $($proc.ExitCode)" if ($proc.ExitCode -ne 0) { # Dump the MSI log on failure if (Test-Path "C:\Windows\Temp\cloudbase-install.log") { Get-Content "C:\Windows\Temp\cloudbase-install.log" | Select-Object -Last 50 } throw "Cloudbase-Init MSI install failed with exit code $($proc.ExitCode)" } # Wait for MSI to finish writing files Start-Sleep -Seconds 15 # ---- Verify installation ---- Write-Host "Verifying Cloudbase-Init installation..." # Check the service exists $svc = Get-Service -Name "cloudbase-init" -ErrorAction SilentlyContinue if (-not $svc) { Write-Host "Service not found. Listing directory..." if (Test-Path $cbDir) { Get-ChildItem $cbDir -Recurse -Depth 2 | Select-Object FullName } else { Write-Host "$cbDir does not exist!" } throw "Cloudbase-Init service not found after install!" } Write-Host "Cloudbase-Init installed. Service status: $($svc.Status)" Write-Host "Cloudbase-Init installed successfully." # ---- cloudbase-init.conf (main service - runs on normal boot after sysprep) ---- $mainConf = @" [DEFAULT] username=Administrator groups=Administrators inject_user_password=true config_drive_raw_hhd=true config_drive_cdrom=true config_drive_vfat=true bsdtar_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\bsdtar.exe mtools_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\ verbose=true debug=true log_dir=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\log\ log_file=cloudbase-init.log default_log_levels=comtypes=INFO,suds=INFO,iso8601=WARN,requests=WARN logging_serial_port_settings= first_logon_behaviour=no mtu_use_dhcp_config=true ntp_use_dhcp_config=true local_scripts_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\LocalScripts\ check_latest_version=false plugins=cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin, cloudbaseinit.plugins.common.networkconfig.NetworkConfigPlugin, cloudbaseinit.plugins.common.setuserpassword.SetUserPasswordPlugin, cloudbaseinit.plugins.windows.extendvolumes.ExtendVolumesPlugin metadata_services=cloudbaseinit.metadata.services.configdrive.ConfigDriveService "@ Write-Host "Writing cloudbase-init.conf..." Set-Content -Path "$cbDir\conf\cloudbase-init.conf" -Value $mainConf -Encoding ASCII # ---- cloudbase-init-unattend.conf (specialize phase on first boot after sysprep) ---- $unattendConf = @" [DEFAULT] username=Administrator groups=Administrators inject_user_password=false config_drive_raw_hhd=true config_drive_cdrom=true config_drive_vfat=true bsdtar_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\bsdtar.exe mtools_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\bin\ verbose=true debug=true log_dir=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\log\ log_file=cloudbase-init-unattend.log default_log_levels=comtypes=INFO,suds=INFO,iso8601=WARN,requests=WARN logging_serial_port_settings= mtu_use_dhcp_config=false ntp_use_dhcp_config=false first_logon_behaviour=no local_scripts_path=C:\Program Files\Cloudbase Solutions\Cloudbase-Init\LocalScripts\ check_latest_version=false plugins=cloudbaseinit.plugins.common.sethostname.SetHostNamePlugin, cloudbaseinit.plugins.common.networkconfig.NetworkConfigPlugin, cloudbaseinit.plugins.windows.extendvolumes.ExtendVolumesPlugin metadata_services=cloudbaseinit.metadata.services.configdrive.ConfigDriveService allow_reboot=true stop_service_on_exit=false "@ Write-Host "Writing cloudbase-init-unattend.conf..." Set-Content -Path "$cbDir\conf\cloudbase-init-unattend.conf" -Value $unattendConf -Encoding ASCII # ---- Service configuration ---- Write-Host "Configuring Cloudbase-Init service..." Set-Service -Name "cloudbase-init" -StartupType Automatic # ---- Cleanup ---- Remove-Item $msiPath -Force -ErrorAction SilentlyContinue Write-Host "=== Cloudbase-Init setup complete ==="