133 lines
4.9 KiB
PowerShell
133 lines
4.9 KiB
PowerShell
# 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 ==="
|