【问题标题】:Cannot pass an array type parameter in ARM template via Powershell无法通过 Powershell 在 ARM 模板中传递数组类型参数
【发布时间】:2018-11-26 09:54:42
【问题描述】:

我有一个带有以下参数的 ARM 模板:

"parameters": {
    "projectName": {
      "type": "string",
      "metadata": {
        "description": "Name of the project"
      }
    },
    "environmentName": {
      "type": "string",
      "defaultValue": "testing",
      "metadata": {
        "description": "Name/Type of the environment"
      }
    },
    "vmResourceGroupName": {
      "type": "string",
      "metadata": {
        "description": "Resource Group in which VMs wil be deployed"
      }
    },
    "vmName": {
      "type": "string",
      "metadata": {
        "description": "Name of the Virtual Machine"
      }
    },
    "vmIPAddress": {
      "type": "string",
      "metadata": {
        "description": "IP Address of the Virtual Machine"
      }
    },
    "osDiskVhdUri": {
      "type": "string",
      "metadata": {
        "description": "Uri of the existing VHD in ARM standard or premium storage"
      }
    },
    "dataDiskVhdUri": {
      "type": "array",
      "metadata": {
        "description": "Uri of the existing VHD in ARM standard or premium storage"
      }
    },
    "vmSize": {
      "type": "string",
      "metadata": {
        "description": "Size of the Virtual Machine"
      }
    },
    "osType": {
      "type": "string",
      "allowedValues": [
        "Windows",
        "Linux"
      ],
      "metadata": {
        "description": "OS of the VM - Typically Windows or Linux"
      }
    },
    "ManagedDisk": {
      "type": "string",
      "allowedValues": [
        "Yes",
        "No"
      ],
      "metadata": {
        "description":  "Yes for Managed Disks, No for VHDs"
      }
    }

显然,$dataDiskVHDURI 是 type:array,我正在尝试使用 -TemplateParameterObject 和 Powershell 中的 New-AzureRMresourceGroupDeployment cmdlet 使用以下代码部署模板:

{
        $vmWithDDTemplate = 'azuredeploy.json'
    $vmWithoutDDTemplate = 'azuredeploy-withoutdd.json'

    $dataDiskVhdUri = New-Object -TypeName System.Collections.ArrayList
    $dataDiskVhdUri.Add("$VM.dataDiskVhduri")


    #Creating VM param object    
    $VMTemplateObject = @{"projectname" = $projectName; `  
                          "environmentname" = $environmentName; `
                          "vmResourceGroupName" = $vmResourceGroupName; `
                          "vmName" = $VM.vmName; `
                          "vmIPAddress" = $VM.vmIPAddress; `
                          "osDiskVhdUri" = $VM.osDiskVhdUri; `
                          "dataDiskVhdUri" = ,$dataDiskVhdUri; `
                          "vmSize" = $VM.vmSize; `
                          "osType" = $VM.osType; `
                          "ManagedDisk" = $VM.ManagedDisk
                         }
    #$VMTemplateObject

    # Checking if VM contains a data disk
    if($VM.dataDiskVhdUri -ne $null) 
    {
        Write Output "$VM contains data disk"

        New-AzureRmResourceGroupDeployment -Name ('vmwithdd' + '-' + ((Get-Date).ToUniversalTime()).ToString('MMdd-HHmm')) `
                                   -ResourceGroupName $ResourceGroupName `
                                   -TemplateParameterObject $VMTemplateObject `
                                   -TemplateFile $vmWithDDTemplate `
                                    -Force -Verbose -ErrorVariable ErrorMessages `
                                    -ErrorAction Stop -DefaultProfile $azureCred

    }
    else
    {
        Write-output '$VM does not contain data disk'
    }
}

但是,我每次都会收到以下错误:

Microsoft.PowerShell.Utility\Write-Error:下午 4:46:14 - 错误: 代码=无效模板; Message=部署模板验证失败: '模板参数'dataDiskVhdUri'的提供值在 “44”行和“27”列无效。在创建环境:73 字符:73 + + CategoryInfo : NotSpecified: (:) [Write-Error], RemoteException + FullyQualifiedErrorId:System.Management.Automation.RemoteException,Microsoft.PowerShell.Commands.WriteErrorCommand + PSComputerName : [本地主机]

有谁知道如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    不确定,但也许通过使用前面的 , 将 ArrayList 对象封装在数组中,这不是它想要的。如果我查找示例,我只会看到那里添加了单个值,例如 "dataDiskVhdUri" = $VM.dataDiskVhduri;

    【讨论】:

    • 嗨 Theo,我已经使用 Visual Studio 测试了部署,它运行良好。我传递更多值的原因是因为我需要将多个数据磁盘附加到 VM。还有其他方法可以通过 powershell 将数组传递给 ARM 模板吗?
    • 对不起,我在这里画了一个空白。也许它想要一个简单的数组而不是数组列表?您是否尝试过将 $dataDiskVhdUri = New-Object -TypeName System.Collections.ArrayList 更改为 $dataDiskVhdUri = @() 而不是 $dataDiskVhdUri.Add("$VM.dataDiskVhduri") 只需执行 $dataDiskVhdUri += $VM.dataDiskVhduri 吗?
    • 我什至试过这个。但是,这似乎不起作用。 :(
    • 我想我在这里找到了一些东西:docs.microsoft.com/en-us/azure/azure-resource-manager/… 看来您必须将其添加为"[array(parameters('$VM.dataDiskVhduri'))]"
    • 我也面临同样的问题,我们有解决方案吗?我已经尝试了上面提到的所有步骤,仍然没有运气。
    【解决方案2】:

    试试这个:

    $OptionalParameters = New-Object -TypeName Hashtable
    
    $OptionalParameters.Add("aParam", @(1,2,3))
    
    New-AzureRmResourceGroupDeployment -ResourceGroupName $ResourceGroupName `
                                       -TemplateFile azuredeply.json `
                                       @OptionalParameters
    

    与:

    {
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "aParam": {
            "type": "array"
        }
    },
    "variables": { },
    "resources": [ ],
    "outputs": {
        "dump": {
            "type": "array",
            "value": "[parameters('aParam')]"
        }
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2020-12-31
      • 2019-01-28
      • 2020-06-13
      • 2016-04-26
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多