通过ARM Powershell方法创建多个VM

时间:2016-07-15 12:52:45

标签: azure azure-virtual-machine azure-powershell azure-resource-manager

我有一个ps工作流程(.psm文件),我试图并行创建5个vms。我正在使用ARM cmdlet。我收到错误 -

  

错误 - 无法验证参数'SubnetId'的参数。参数为null或空。提供非null或空的参数,然后尝试该命令   试。

这是我的挑战 -

  1. 即使我从-parallel删除foreach参数,即使它没有任何区别。

  2. 如果我在工作流程(ps1文件)中运行相同的代码,删除-parralel参数我能够 创建5个vms

  3. 代码 -

    workflow Create-VMs
    {
        $UserName = "abc@cde.onmicrosoft.com"
        $pwd = ConvertTo-SecureString "xxxxxxxx" -AsPlainText -Force
        $AzureCredential = New-Object System.Management.Automation.PSCredential($UserName, $pwd) 
        login-azurermaccount -credential $AzureCredential
        Add-AzureRmAccount -Credential $AzureCredential
        Select-AzureRmSubscription -SubscriptionName "xxxxx"
    
        $virtualNetworkName = "myvpn"
        $locationName = "East US"
        $ResourceGroupName = "myrg"
        $user = "adminuser"
        $password = "AdminPass123"
        $VMSize = "Standard_D2"
        $sourcevhd = "https://abc.blob.core.windows.net/vhds/windowsserver2008.vhd"
        $virtualNetwork = Get-AzureRmVirtualNetwork -ResourceGroupName $ResourceGroupName -Name $virtualNetworkName
    
        foreach -parallel($i in 1..5)
        {
            $VMName = "myname" + $i
            $destinationVhd = "https://abc.blob.core.windows.net/vhds/windowsserver2008" + $i + ".vhd"
            $staticip = "dynamicip" + $i
            $virtualNetwork = Get-AzureRmVirtualNetwork -ResourceGroupName $ResourceGroupName -Name $virtualNetworkName
            $publicIp = New-AzureRmPublicIpAddress -Name $staticip -ResourceGroupName $ResourceGroupName -Location $locationName -AllocationMethod Dynamic
            $networkInterface = New-AzureRmNetworkInterface -ResourceGroupName $ResourceGroupName -Name $VMName -Location $locationName -SubnetId $virtualNetwork.Subnets[0].Id -PublicIpAddressId $publicIp.Id
            $vmConfig = New-AzureRmVMConfig -VMName $VMName -VMSize $VMSize
            $vmConfig = Set-AzureRmVMOSDisk -VM $vmConfig -Name $VMName -VhdUri $destinationVhd -CreateOption FromImage -Windows -SourceImageUri $sourcevhd
            $vmConfig = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $networkInterface.Id
            $securePassword = ConvertTo-SecureString $password -AsPlainText -Force
            $cred = New-Object System.Management.Automation.PSCredential ($user, $securePassword) 
            Set-AzureRmVMOperatingSystem -VM $vmConfig -Windows -Credential $cred -ProvisionVMAgent -ComputerName $VMName
            New-AzureRmVM -VM $vmConfig -Location $locationName -ResourceGroupName $ResourceGroupName
        }
    }
    

    无法找出实际问题。使用ARM并行创建多个vms的其他方法吗?

1 个答案:

答案 0 :(得分:-1)

我对-parallel和Azure cmdlet没有太多运气,但我可以为您考虑两个选项:

1)使用PowerShell作业 - 这将要求您登录每个作业,这里是我如何做的片段 - 在这种情况下,“作业”是删除资源组。

foreach ($AzureResourceGroup in $AzureResourceGroups) {
  Start-Job -Name $AzureResourceGroup {
    Param($AzureResourceGroup, $creds, $tenantID, $subscriptionName)
      Login-AzureRmAccount -ServicePrincipal -Credential $creds -TenantId $tenantId
      Select-AzureRmSubscription -SubscriptionName $subscriptionName
      Remove-AzureRMResourceGroup -Force -Verbose -Name $AzureResourceGroup
  } -ArgumentList $AzureResourceGroup, $creds, $tenantId, $subscriptionName 
}
Get-Job | Wait-Job | Receive-Job

2)我认为更好的方法是使用JSON模板,并让Azure协调部署。有一个模板的示例以及如何在此处执行此操作:https://github.com/bmoore-msft/AzureRM-Samples/tree/master/VMFromImageMulti - 根目录中有一个自述文件,用于说明如何部署它。