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, [HashTable] $Tags ) process { # AsJob not implemented yet! # 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*' -or $_.Key -like 'Tags' }) { $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 -Tags $Tags $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)" if ($Tags.Count -eq 0) { $domainJoinSettings = Get-DomainJoinExtensionSettings -KeyVaultName $keyVaultName $domainJoinExtension = Set-AzVMExtension -ResourceGroupName $resourceGroupName -Location $resourceLocation -VMName $VMName ` -Publisher $domainJoinSettings.Publisher -Type $domainJoinSettings.Type -TypeHandlerVersion $domainJoinSettings.TypeHandlerVersion ` -Name $domainJoinSettings.Name -Settings $domainJoinSettings.Settings -ProtectedSettings $domainJoinSettings.ProtectedSetting -AsJob:$AsJob } $job } else { Write-CustomHost -Message "VM $VMName already exists" $VirtualMachine } } } |