json - Azure Powershell - 部署模板验证失败 - Jtoken
问题描述
我正在尝试使用 Powershell 和模板文件一次部署多个虚拟机,但我不断收到此错误:
New-AzResourceGroupDeployment : 9:27:40 AM - Error: Code=InvalidTemplate; Message=Deployment template validation
failed: 'Template parameter JToken type is not valid. Expected 'String, Uri'. Actual 'Object'. Please see
https://aka.ms/resource-manager-parameter-files for usage details.'.
At C:\Users\jackk\OneDrive\Desktop\AzureAutomation\main.ps1:193 char:9
+ New-AzResourceGroupDeployment @parameters
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [New-AzResourceGroupDeployment], Exception
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDep
loymentCmdlet
New-AzResourceGroupDeployment : The deployment validation failed
At C:\Users\jackk\OneDrive\Desktop\AzureAutomation\main.ps1:193 char:9
+ New-AzResourceGroupDeployment @parameters
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : CloseError: (:) [New-AzResourceGroupDeployment], InvalidOperationException
+ FullyQualifiedErrorId : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.NewAzureResourceGroupDep
loymentCmdlet
这是我的 powershell 脚本的相关部分:
$location = "eastus2"
$networkInterfaceName = ""
$networkSecurityGroupName = ""
#$networkSecurityGroupRules = @()
$subnetName = $SubnetSelection
$virtualNetworkId = "/subscriptions/1234-1234-123-123-123/resourceGroups/MainGroup/providers/Microsoft.Network/virtualNetworks/Main_Network"
$virtualMachineName = ""
$virtualMachineComputerName = ""
$virtualMachineRG = $resourceGroupSelection
$osDiskType = "StandardSSD_LRS"
$virtualMachineSize = "Standard_B2s"
$adminUsername = "ADMIN"
$adminPassword = ConvertTo-SecureString "Password1234" -AsPlainText -Force
$diagnosticsStorageAccountName = $StorageAccountName
$diagnosticsStorageAccountId = $StorageAccountID
$imageName = $ImageSelection
foreach ($i in 1..5) {
$virtualMachineName = "test-$i".ToString()
$virtualMachineComputerName = "test-$i".ToString()
$rand = Get-Random -Maximum 1000
$networkInterfaceName = "test-$i$rand".ToString()
$networkSecurityGroupName = "test-$i-nsg".ToString()
$paramObject = @{
'location' = $location
'networkInterfaceName' = $networkInterfaceName
'networkSecurityGroupName' = $networkSecurityGroupName
'subnetName' = $SubnetSelection
'virtualNetworkId' = $virtualNetworkId
'virtualMachineName' = $virtualMachineName
'virtualMachineComputerName' = $virtualMachineComputerName
'virtualMachineRG' = $resourceGroupSelection
'osDiskType' = $osDiskType
'virtualMachineSize' = $virtualMachineSize
'adminUsername' = $adminUsername
'adminPassword' = $adminPassword
'diagnosticsStorageAccountName' = $diagnosticsStorageAccountName
'diagnosticsStorageAccountId' = $diagnosticsStorageAccountId
'imageName' = $imageName
}
$parameters = @{
'ResourceGroupName' = $resourceGroupSelection
'TemplateFile' = $PathTemplate
'TemplateParameterObject' = $paramObject
'Verbose' = $True
}
New-AzResourceGroupDeployment @parameters
}
假设此代码段中未定义的任何变量都是在其他地方定义的具有有效信息的字符串。
我正在使用的模板文件:
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"location": {
"type": "String"
},
"networkInterfaceName": {
"type": "String"
},
"networkSecurityGroupName": {
"type": "String"
},
"networkSecurityGroupRules": {
"type": "Array",
"defaultValue": []
},
"subnetName": {
"type": "String"
},
"virtualNetworkId": {
"type": "String"
},
"virtualMachineName": {
"type": "String"
},
"virtualMachineComputerName": {
"type": "String"
},
"virtualMachineRG": {
"type": "String"
},
"osDiskType": {
"type": "String"
},
"virtualMachineSize": {
"type": "String"
},
"adminUsername": {
"type": "String"
},
"adminPassword": {
"type": "SecureString"
},
"diagnosticsStorageAccountName": {
"type": "String"
},
"diagnosticsStorageAccountId": {
"type": "String"
},
"imageName": {
"type": "String"
}
},
"variables": {
"nsgId": "[resourceId(resourceGroup().name, 'Microsoft.Network/networkSecurityGroups', parameters('networkSecurityGroupName'))]",
"vnetId": "[parameters('virtualNetworkId')]",
"subnetRef": "[concat(variables('vnetId'), '/subnets/', parameters('subnetName'))]"
},
"resources": [
{
"type": "Microsoft.Network/networkInterfaces",
"apiVersion": "2019-07-01",
"name": "[parameters('networkInterfaceName')]",
"location": "[parameters('location')]",
"dependsOn": [
"[concat('Microsoft.Network/networkSecurityGroups/', parameters('networkSecurityGroupName'))]"
],
"properties": {
"ipConfigurations": [
{
"name": "ipconfig1",
"properties": {
"subnet": {
"id": "[variables('subnetRef')]"
},
"privateIPAllocationMethod": "Dynamic"
}
}
],
"networkSecurityGroup": {
"id": "[variables('nsgId')]"
}
}
},
{
"type": "Microsoft.Network/networkSecurityGroups",
"apiVersion": "2019-02-01",
"name": "[parameters('networkSecurityGroupName')]",
"location": "[parameters('location')]",
"properties": {
"securityRules": "[parameters('networkSecurityGroupRules')]"
}
},
{
"type": "Microsoft.Compute/virtualMachines",
"apiVersion": "2019-07-01",
"name": "[parameters('virtualMachineName')]",
"location": "[parameters('location')]",
"dependsOn": [
"[concat('Microsoft.Network/networkInterfaces/', parameters('networkInterfaceName'))]"
],
"properties": {
"hardwareProfile": {
"vmSize": "[parameters('virtualMachineSize')]"
},
"storageProfile": {
"osDisk": {
"createOption": "fromImage",
"managedDisk": {
"storageAccountType": "[parameters('osDiskType')]"
}
},
"imageReference": {
"id": "[parameters('imageName')]"
}
},
"networkProfile": {
"networkInterfaces": [
{
"id": "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaceName'))]"
}
]
},
"osProfile": {
"computerName": "[parameters('virtualMachineComputerName')]",
"adminUsername": "[parameters('adminUsername')]",
"adminPassword": "[parameters('adminPassword')]",
"windowsConfiguration": {
"enableAutomaticUpdates": true,
"provisionVmAgent": true
}
},
"diagnosticsProfile": {
"bootDiagnostics": {
"enabled": true,
"storageUri": "[concat('https://', parameters('diagnosticsStorageAccountName'), '.blob.core.windows.net/')]"
}
}
}
}
],
"outputs": {
"adminUsername": {
"type": "String",
"value": "[parameters('adminUsername')]"
}
}
}
我已经尝试了我能想到的一切,并且我认为我已经将问题缩小到networkSecurityGroupRules
. 我从 Azure 中的有效部署中获取了这个模板文件,并且附带的参数文件networkSecurityGroupRules
的值设置为[]
. 所以我为它创建了一个默认值,但它不起作用。我还尝试在 powershell 中将其声明为空数组并将其与其他 paramObjects 一起传递,但我得到了同样的错误。我也尝试过 ArrayList 无济于事。我还用我传递给它的确切值填写了一个 parameter.json 文件,$paramObjects
它可以完美地工作。如果我改变defaultValue
为 null,然后在部署时它会要求我填写 networkSecurityGroupRules[0]、networkSecurityGroupRules[1] 等。我真的不知道问题出在哪里,所以非常感谢任何帮助,谢谢。
解决方案
发现问题。'paramObject' 中的所有内容都必须用引号引起来。例如,'location' = $location
必须是'location' = "$location"
推荐阅读
- macos - :cached 和 :delegated 在 OSX 中挂载的卷性能
- javascript - 如何在 selenium java 中设计一个逻辑以根据问题在 2 个不同的路径之间切换
- c - FreeType 颜色渲染 FT_Load_Glyph 返回“未实现的功能”
- wpf - 将 XML 输入 XAML/PowerShell WPF 表单
- python - 拆分 Pandas 数据框
- cucumber - 黄瓜标签:类型不匹配:无法从 String[] 转换为 String
- jquery - Django 和 AJAX - replaceWith 不替换我的元素,它正在添加它而不是删除原始元素
- sql-server - 如何在维度表中查找未使用的行
- wcag2.0 - Web 可访问性:冗余链接 - 相邻链接指向标签的相同 URL
- python - 带有--keepdb的django测试用例不会在测试之间重置对象ID