Private/New-CustomAzVmss.ps1

# Will be called in VM
function Global:New-CustomAzVmss {
    [CmdletBinding()]
    <#
    .SYNOPSIS
        ...
    .DESCRIPTION
        ...
    #>

    param(
        [Parameter(Mandatory = $true)]
        [string]
        $ResourceGroupName,        
        [Parameter(Mandatory = $true)]
        [string]
        $ResourceLocation,
        [Parameter(Mandatory = $true)]
        [string]
        $Name,
        [Parameter(Mandatory = $true)]
        [int]
        $NoOfInstances,
        [Parameter(Mandatory = $true)]
        [string]
        $BaseImageName,
        [Parameter(Mandatory = $true)]
        [string]
        $VMSize,
        [Parameter(Mandatory = $true)]
        [PSCredential]
        $VMCredentials,
        [Parameter(Mandatory = $true)]
        [string]
        $ComputerNamePrefix,
        [Parameter(Mandatory = $true)]
        [string]
        $NetworkIPConfigName,
        [Parameter(Mandatory = $true)]
        [string]
        $NetworkInterfaceConfigName,        
        [Parameter(Mandatory = $true)]
        [string]
        $LoadBalancerName,
        [Parameter(Mandatory = $true)]
        [string]
        $FrontendIpConfigName,
        [Parameter(Mandatory = $true)]
        [string]
        $VirtualNetworkName,
        [Parameter(Mandatory = $true)]
        [string]
        $SubnetName,
        [Parameter(Mandatory = $false)]
        [string]
        $SubnetAddressPrefix,
        [Parameter(Mandatory = $true)]
        [switch]
        $CreatePublicIP,
        [Parameter(Mandatory = $true)]
        [string]
        $BackendAddressPoolName,
        [Parameter(Mandatory = $true)]
        [string]
        $AdminUsername,
        [Parameter(Mandatory = $true)]
        [string]
        $AdminPassword
    )
    process {
        $VMSS = Get-AzVmss -ResourceGroupName $ResourceGroupName -VMScaleSetName $Name -ErrorAction SilentlyContinue
        if ($VMSS){
            Write-CustomHost -Message "Scale Set $Name already exists. Stopping here."
            return
        }
        # TODO: Add handling for Subnet-creation (if not existing)

        Write-CustomHost -Message "Creating Scale Set $Name..."
        $VNet = Get-AzVirtualNetwork -ResourceGroupName $ResourceGroupName -Name $VirtualNetworkName -ErrorAction SilentlyContinue
        $VMSSIPCfg = New-AzVmssIPConfig -Name $NetworkIPConfigName -SubnetId $VNet.Subnets[0].Id

        $VMSS = New-AzVmssConfig -Location $ResourceLocation -SkuCapacity $NoOfInstances -SkuName $vmAPSSize -UpgradePolicyMode "Automatic" -IdentityType SystemAssigned `
        | Add-AzVmssNetworkInterfaceConfiguration -Name $NetworkInterfaceConfigName -Primary $True -IPConfiguration $VMSSIPCfg `
        | Set-AzVmssOSProfile -ComputerNamePrefix $ComputerNamePrefix  -AdminUsername $AdminUsername -AdminPassword $AdminPassword `
        | Set-AzVmssStorageProfile  -OsDiskCreateOption 'FromImage' -OsDiskCaching "None" `
            -ImageReferenceId (Get-AzImage -ImageName $BaseImageName -ResourceGroupName $resourceGroupName).Id

        New-AzVmss -ResourceGroupName $ResourceGroupName -Name $Name -VirtualMachineScaleSet $VMSS | Out-Null
        Write-CustomHost -Message "Done."
        
        if (-not(Get-AzRoleAssignment -ObjectId $VMSS.Identity.PrincipalId -ResourceGroupName $ResourceGroupName -RoleDefinitionName Contributor -ErrorAction SilentlyContinue)) {
            Write-CustomHost -Message "Assigning access role to managed identity of VM Scale Set..."
            New-AzRoleAssignment -ObjectId $VMSS.Identity.PrincipalId -RoleDefinitionName Contributor -ResourceGroupName $ResourceGroupName | Out-Null
            Write-CustomHost -Message "Done."
        }
        return        
    }
}