Cloudbase.it provides tools for creating OpenStack-ready cloud images. They've created a Windows Server 2012R2 images, which is ready for use (download and instructions here). This image is already imported into our environment.
If you need an another Windows Version, you must build the image yourself, with good help from the automated cloudbase-scripts. It is recommended to create the image on a Windows 10 host or VM. The following examples is a list of what we did to create a cloud ready Windows Server 2019 image.
- Install the latest Windows ADK (download) and choose only Deployment Tools
- Download the Windows 10 Enterprise Evaluation ISO, and mount it in your host/VM (you need to login with your Microsoft account to download ISOs)
- Download the stable amd64 virto-win iso, following this link
- Download the Windows OpenStack Imaging Tools
- Remember to download the WindowsUpdates tools referenced in the repo as well. This must be done separately.
- Change the following:
UnattendTemplate.xml: Change
InputLocale
andUserLocale
fromen-US
tonb-NO
- Create the following powershell-script, modify the three path-variables, and run it:
- CreateOpenStackImage.ps1
Import-Module c:\dev\windows-openstack-imaging-tools-master\WinImageBuilder.psm1 Import-Module C:\dev\windows-openstack-imaging-tools-master\Config.psm1 Import-Module C:\dev\windows-openstack-imaging-tools-master\UnattendResources\ini.psm1 function Set-Config { param($file, $section, $key, $value) Set-IniFileValue -Path (Resolve-Path $file) -Section $section ` -Key $key ` -Value $value } $date = Get-Date -UFormat "%Y%m%d" $virtualDiskPath = "C:\dev\images\WS2019_Standard_Eval_$date.qcow2" $virtIOISOPath = "C:\iso\virtio-win-0.1.160.iso" $winISOPath = "C:\iso\17763.1.180914-1434.rs5_release_SERVER_EVAL_x64FRE_en-us.iso" $mountResult = Mount-DiskImage -ImagePath $winISOPath -StorageType ISO -PassThru $imageDrive = ($mountResult | Get-Volume).DriveLetter $wimFilePath = "${imageDrive}:\sources\install.wim" $diskSize = 40GB $ramSize = 4GB # Check which SKU from the WimFile you want, and specify the corresponding index to $image $images = Get-WimFileImagesInfo -WimFilePath $wimFilePath $image = $images[1] $configfile = '.\config.ini' New-WindowsImageConfig -ConfigFilePath $configfile if ( ! (Test-Path C:\dev\images) ) { New-Item C:\dev\images -Type Directory } Set-Config -file $configfile -section "DEFAULT" -key "wim_file_path" -value $wimFilePath Set-Config -file $configfile -section "DEFAULT" -key "image_name" -value $image.ImageName Set-Config -file $configfile -section "DEFAULT" -key "image_path" -value $virtualDiskPath Set-Config -file $configfile -section "DEFAULT" -key "virtual_disk_format" -value "QCOW2" Set-Config -file $configfile -section "DEFAULT" -key "image_type" -value "KVM" Set-Config -file $configfile -section "DEFAULT" -key "disk_layout" -value "BIOS" Set-Config -file $configfile -section "DEFAULT" -key "wallpaper_solid_color" -value "0 0 0" Set-Config -file $configfile -section "vm" -key "external_switch" -value "ext-net" Set-Config -file $configfile -section "vm" -key "ram_size" -value $ramSize Set-Config -file $configfile -section "vm" -key "disk_size" -value $diskSize Set-Config -file $configfile -section "drivers" -key "virtio_iso_path" -value $virtIOISOPath Set-Config -file $configfile -section "updates" -key "install_updates" -value "True" Set-Config -file $configfile -section "updates" -key "purge_updates" -value "True" # Check if we are on a Hyper-V enabled host if ( $(Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V).State -eq "Enabled" ) { New-WindowsOnlineImage -ConfigFilePath $configfile } else { Write-Host "This script only works on Hyper-V enabled hosts" } Dismount-DiskImage -InputObject $mountResult
You now have a .qcow2 diskfile, which contains an updated and sysprepped Windows-installation with cloud-init installed
Convert the qcow2 disk to raw
qemu-img convert -f qcow2 -O raw disk.qcow2 disk.raw
The raw image can now be imported to glance.
When you spawn a Windows instance, be sure to attach a keypair. Cloudbase-init will generate a random password for the user Admin
, which can be retrieved with:
nova get-password <instance-id> <private-key-file>
The password can also be retrieved in Horizon through the "Retrieve password" action on the instance.
NOTE: There is a known issue with Windows 10 - the hostname will not be set to wahtever you chose for instance name. This might be fixed in the future... (Link)