Private/Set-VMPreparation.ps1
function Global:Set-VMPreparation { [CmdletBinding()] <# .SYNOPSIS ... .DESCRIPTION ... #> param( [Parameter(Mandatory = $true)] [string] $ResourceGroupName, [Parameter(Mandatory = $true)] [string] $ResourceLocation, [Parameter(Mandatory = $true)] [string] [Alias("Version")] [string] $BCVersion, [Alias("CumulativeUpdate")] [Parameter(Mandatory = $false)] [string] $BCCumulativeUpdate, [Alias("Language")] [Parameter(Mandatory = $false)] [string] $BCLanguage, [ValidateSet('App', 'Web')] [string] $InstallationType = "App", [Parameter(Mandatory = $false)] [string] $DownloadDirectory, [Parameter(Mandatory = $false)] [string] $ConfigurationFile, [Parameter(Mandatory = $false)] [string] $LicenseFilename, [Parameter(Mandatory = $true)] [string] $VMName, [Parameter(Mandatory = $true)] [string] $LocalPropScaleSetName, [Parameter(Mandatory = $true)] [string] $LocalPropStorageAccountName, [Parameter(Mandatory = $true)] [string] $LocalPropKeyVaultName, [Parameter(Mandatory = $true)] [string] $LocalPropStorageTableNameSetup, [Parameter(Mandatory = $true)] [string] $LocalPropStorageTableNameEnvironments, [Parameter(Mandatory = $true)] [string] $LocalPropStorageTableNameEnvironmentDefaults, [Parameter(Mandatory = $true)] [string] $LocalPropStorageTableNameInfrastructureData, [Parameter(Mandatory = $false)] [PSCredential] $VMCredentials ) process { $VirtualMachine = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -ErrorAction SilentlyContinue if (-not($VirtualMachine)) { throw "VM $VMName does not exist" } # Prepare parameter $bcVersionArgs = @{ } foreach ($param in $PsBoundParameters.GetEnumerator() | Where-Object { $_.Key -like "BC*" }) { $bcVersionArgs.Add($param.Key.Remove(0, 2), $param.Value) } $localProperties = @{ ScaleSetName = $LocalPropScaleSetName ResourceGroupName = $ResourceGroupName StorageAccountName = $LocalPropStorageAccountName KeyVaultName = $LocalPropKeyVaultName StorageTableNameSetup = $LocalPropStorageTableNameSetup StorageTableNameEnvironments = $LocalPropStorageTableNameEnvironments StorageTableNameEnvironmentDefaults = $LocalPropStorageTableNameEnvironmentDefaults StorageTableNameInfrastructureData = $LocalPropStorageTableNameInfrastructureData } $scriptExecutionParams = @{ ResourceGroupName = $ResourceGroupName ResourceLocation = $ResourceLocation VMName = $VMName } $installBCParams = @{ InstallationType = $InstallationType } if (-not([string]::IsNullOrEmpty($DownloadDirectory))) { $installBCParams.Add('DownloadDirectory', $DownloadDirectory) } if (-not([string]::IsNullOrEmpty($ConfigurationFile))) { $installBCParams.Add('ConfigurationFile', $ConfigurationFile) } if (-not([string]::IsNullOrEmpty($LicenseFilename))) { $installBCParams.Add('LicenseFilename', $LicenseFilename) } if (-not([string]::IsNullOrEmpty($BCVersion))) { $installBCParams.Add('Version', $BCVersion) } if (-not([string]::IsNullOrEmpty($VMCredentials))) { $installBCParams.Add('VMCredentials', $VMCredentials) } <# Write-CustomHost "Setting Properties via DSC on VM $vmName ..." Set-AzVMDscExtension -ResourceGroupName $ResourceGroupName -VMName $VMName ` -ArchiveBlobName "ScriptTest.ps1.zip" -ArchiveStorageAccountName $LocalPropStorageAccountName -ArchiveContainerName "windows-powershell-dsc" ` -ConfigurationName "ScriptTest" ` -Version "2.19" -Location $ResourceLocation -AutoUpdate:$false | Out-Null Write-CustomHost "Done" return Write-CustomHost "Setting Properties via DSC on VM $vmName ..." Set-AzVMDscExtension -ResourceGroupName $ResourceGroupName -VMName $VMName ` -ArchiveBlobName "WriteProperties.ps1.zip" -ArchiveStorageAccountName $LocalPropStorageAccountName -ArchiveContainerName "windows-powershell-dsc" ` -ConfigurationName "WriteProperties" -ConfigurationArgument $localProperties ` -Version "2.19" -Location $ResourceLocation -AutoUpdate:$false | Out-Null Write-CustomHost "Done" #> Submit-ScriptToVmAndExecute @scriptExecutionParams -ScriptBlockName WriteProperties -RunParameter $localProperties -MsgBeforeExecuting "Attempting to set local properties for autostart-update..." Submit-ScriptToVmAndExecute @scriptExecutionParams -ScriptBlockName WaitForNetwork -MsgBeforeExecuting "Waiting for network being available..." Submit-ScriptToVmAndExecute @scriptExecutionParams -ScriptBlockName InstallD365Module -MsgBeforeExecuting "Attempting to Install module on VM..." Submit-ScriptToVmAndExecute @scriptExecutionParams -ScriptBlockName InstallChoco -RunParameter @{Packages = @('sysinternals')} -MsgBeforeExecuting "Attempting to Install Chocolatey on VM..." Submit-ScriptToVmAndExecute @scriptExecutionParams -ScriptBlockName InitVM -MsgBeforeExecuting "Attempting to initialize some basics on VM..." Submit-ScriptToVmAndExecute @scriptExecutionParams -ScriptBlockName DownloadBC -RunParameter $bcVersionArgs -MsgBeforeExecuting "Attempting to download BC to VM..." Submit-ScriptToVmAndExecute @scriptExecutionParams -ScriptBlockName InstallBC -RunParameter $installBCParams -MsgBeforeExecuting "Attempting to install BC to VM..." Submit-ScriptToVmAndExecute @scriptExecutionParams -ScriptBlockName CreateUpdateScheduledTask -MsgBeforeExecuting "Attempting to create scheduled task for auto-updating..." return # TODO: Remove again Submit-ScriptToVmAndExecute @scriptExecutionParams -ScriptBlockName GeneralizeVM -MsgBeforeExecuting "Attempting to generalize VM (calling sysprep.exe)..." $vmStatus = (Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -Status).Statuses[1].Code $vmStatusReadyToProceed = ($vmStatus -eq 'PowerState/stopped') -or ($vmStatus -eq 'PowerState/deallocated') if (-not($vmStatusReadyToProceed)) { Write-CustomHost -Message "Wating for VM to finalize sysprep..." while (-not $vmStatusReadyToProceed) { Start-Sleep -Seconds 2 $vmStatus = (Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -Status).Statuses[1].Code $vmStatusReadyToProceed = ($vmStatus -eq 'PowerState/stopped') -or ($vmStatus -eq 'PowerState/deallocated') } Write-CustomHost -Message "Done waiting." } } } |