【问题标题】:Multiple VM Creation by ARM Powershell approach通过 ARM Powershell 方法创建多个 VM
【发布时间】:2016-07-15 12:52:44
【问题描述】:

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

错误 - 无法验证参数“SubnetId”上的参数。参数为 null 或空。提供一个不为 null 或空的参数,然后尝试该命令 再次。

这是我的挑战-

  1. 即使我从 foreach 中删除了 -parallel 参数,即使这样也没有任何区别。

  2. 如果我不在工作流(ps1 文件)中运行相同的代码,删除 -parralel 参数,我可以 创建 5 个虚拟机

代码-

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 并行创建多个虚拟机的任何其他方法?

【问题讨论】:

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


    【解决方案1】:

    我对 -parallel 和 Azure cmdlet 不太满意,但我可以为您想到两个选择:

    1) 使用 PowerShell 作业 - 这需要您为每个作业登录,这是我如何做的 sn-p - 在这种情况下,“作业”是删除资源组。

    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 - 根目录中有一个自述文件来显示如何部署它。

    【讨论】:

      猜你喜欢
      • 2019-03-10
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      相关资源
      最近更新 更多