Private/New-CustomAzVm.ps1
function Global:New-CustomAzVm{ [CmdletBinding()] <# .SYNOPSIS Creates a new Application Server, installs Business Central, sys-preps it and saves it as a Scale Set Source .DESCRIPTION ... #> param( [Parameter(Mandatory = $true)] [string] $ResourceGroupName, [Parameter(Mandatory = $true)] [string] $ResourceLocation, [Parameter(Mandatory = $true)] [string] $Name, [Alias("VirtualNetworkName")] [Parameter(Mandatory = $true)] [string] $VNetName, [Parameter(Mandatory = $true)] [string] $VMName, [Parameter(Mandatory = $true)] [string] $VMImagePublisher, [Parameter(Mandatory = $true)] [string] $VMImageOffer, [Parameter(Mandatory = $true)] [string] $VMImageSku, [Parameter(Mandatory = $true)] [string] $VMSize, [Parameter(Mandatory = $true)] [PSCredential] $VMCredentials, [Parameter(Mandatory = $true)] [int] $VMDiskSizeInGb, [Parameter(Mandatory = $true)] [string] $VMStorageAccountType, [Parameter(Mandatory = $true)] [string] $VMDataDiskName, [Alias("NetworkInterfaceName")] [Parameter(Mandatory = $true)] [string] $NicName, [Alias("NetworkInterfacePrivateIP")] [Parameter(Mandatory = $false)] [string] $NicPrivateIP, [Parameter(Mandatory = $false)] [string] $SubnetName, [Alias("PublicIPName")] [Parameter(Mandatory = $false)] [string] $PipName, [Alias("PublicIPDomainNameLabel")] [Parameter(Mandatory = $false)] [string] $PipDnsLabel, [Parameter(Mandatory = $false)] [switch] $AsJob ) process { # Create new VM (as Application Server) # Put Script in Autostart # Download and Install Business Central # Deactivate default service # Call Sys Prep # Put created VM as Scale Set Source # Copy arguments for NIC creation from parent call $NicArguments = @{} foreach ($param in $PsBoundParameters.GetEnumerator()| Where-Object {$_.Key -like "*net*" -or $_.Key -like 'Nic*' -or $_.Key -like 'Pip*' -or $_.Key -like 'Resource*'}){ $NicArguments.Add($param.Key,$param.Value) } $NIC = New-CustomAzNetworkInterface @NicArguments Write-CustomHost -Message "Checking if VM $VMName already exists..." $VirtualMachine = Get-AzVM -ResourceGroupName $ResourceGroupName -Name $VMName -ErrorAction SilentlyContinue if (-not ($VirtualMachine)){ Write-CustomHost -Message "Creating VM $VMName..." # Create new VM (as Application Server) $VirtualMachine = New-AzVMConfig -VMName $VMName -VMSize $VMSize -AssignIdentity:$SystemAssigned $VirtualMachine = Set-AzVMOperatingSystem -VM $VirtualMachine -Windows -ComputerName $VMName -Credential $VMCredentials -ProvisionVMAgent $VirtualMachine = Add-AzVMNetworkInterface -VM $VirtualMachine -Id $NIC.Id $VirtualMachine = Set-AzVMSourceImage -VM $VirtualMachine -PublisherName $VMImagePublisher -Offer $VMImageOffer -Skus $VMImageSku -Version latest $VirtualMachine = Add-AzVMDataDisk -VM $VirtualMachine -Name $VMDataDiskName -CreateOption "Empty" -DiskSizeInGB $VMDiskSizeInGb -StorageAccountType $VMStorageAccountType -Lun 0 Write-CustomHost -Message "Deploying VM (as job)..." $job = New-AzVM -ResourceGroupName $ResourceGroupName -Location $ResourceLocation -VM $VirtualMachine -AsJob:$AsJob Write-CustomHost -Message "VM Deployed (Job running)" $job } else { Write-CustomHost -Message "VM $VMName already exists" $VirtualMachine } } } |