我尝试使用AzureResourceManager PowerShell模块来创建和配置网站。我开始使用Visual Studio生成的模板文件,当我通过New-AzureResourceGroup -TemplateFile website.json
使用它时工作正常。
所以现在我试图调整模板文件来配置网站。我试图设置php和.NET Framework版本。根据{{3}},这些属性是通过资源数组中的配置对象设置的。
这是我的json模板的网站部分。 "资源"部分是我添加的:
{
"apiVersion": "2014-06-01",
"name": "[parameters('siteName')]",
"type": "Microsoft.Web/sites",
"location": "[parameters('siteLocation')]",
"tags": {
"[concat('hidden-related:', resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]": "Resource"
},
"dependsOn": [
"[concat('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"
],
"properties": {
"name": "[parameters('siteName')]",
"serverFarm": "[parameters('hostingPlanName')]"
},
"resources": [
{
"apiVersion": "2014-04-01",
"type": "Microsoft.Web/sites/config",
"name": "config",
"properties": {
"name": "config",
"phpVersion": "",
"netFrameworkVersion": "V4.5"
}
}
]
},
当我将此模板传递给Test-AzureResourceGroupTemplate
时,我收到此错误:
Code : InvalidTemplate
Message : Deployment template validation failed: 'The template resource 'config' for type 'Microsoft.Web/sites/config' has
incorrect segment lengths. A nested resource type must have identical number of segments as its resource name. A root
resource type must have segment length one greater than its resource name'.
我无法找到相关的任何文档。有谁知道这个错误意味着什么,或者我做错了什么?
答案 0 :(得分:35)
永远不会失败,一旦我写出问题,我就会找到答案。
错误意味着因为这是一个嵌套资源(配置对象嵌套在站点对象中),所以名称需要反映这一点。因此,config
代替mysite/config
,而不是dependsOn
。我还需要添加"resources": [
{
"apiVersion": "2014-04-01",
"type": "Microsoft.Web/sites/config",
"name": "[concat(parameters('siteName'), '/config')]",
"dependsOn": [
"[concat('Microsoft.Web/sites/', parameters('siteName'))]"
],
"properties": {
"phpVersion": "",
"netFrameworkVersion": "V4.5"
}
}
]
部分。这是成功验证的模板:
{{1}}
答案 1 :(得分:4)
错误的段长度'错误信息很难理解为非英语原生,所以有简明英语/ json的解释:
例如,您拥有类型为Microsoft.Network/trafficManagerProfiles
的资源,并且由于某种原因,您需要将类型为Microsoft.Network/trafficManagerProfiles/ExternalEndpoints
的嵌套资源定义为单独的资源。
嵌套资源必须具有名称parent_resource_name/nested_res_name
正确(简化)架构是:
{
"type": "Microsoft.Network/trafficManagerProfiles",
"name": "[variables('trafManagerProfileName')]",
...
},
{
"type": "Microsoft.Network/trafficManagerProfiles/ExternalEndpoints",
"name": "[concat(variables('trafManagerProfileName'), '/Endpoint', copyIndex())]",
"dependsOn": [
"[concat('Microsoft.Network/trafficManagerProfiles/', variables('trafManagerProfileName'))]",
"[parameters('app_name')]" # where the endpoint should look at
],
...
}
P.S。如果您需要根据第三个资源的计数动态生成嵌套资源,您可能对此问题感兴趣:How do I dynamically generate Traffic Manager endpoints in an ARM template?
答案 2 :(得分:2)
我遇到了同样的问题,其他答案对我都不起作用,事实证明,实际上这个问题比其他答案显示的要多。首先,对于根级资源,the docs specify必须:
...名称中的句段比资源类型少
换句话说,如果您要创建一个:
"type": "Microsoft.Web/sites"
然后,名称必须比类型少一个段,在此示例中,我们只能对名称使用单个段,即:
"name": "MySite"
对于嵌套资源,规则为:
类型和名称具有相同的段数
但是,这假设您正在缩短嵌套资源的类型,例如在类型“ Microsoft.Web / sites”的父级中为嵌套资源创建类型“ Microsoft.Web / sites / config”,并为嵌套资源指定:
"type": "config"
因此,您在这里也只能指定一个细分名称,例如:
"name": "MyConfig"
因此,您将所有这些放在一起:
{
"type": "Microsoft.Web/sites",
"name": "MySite",
"various other properties": ...,
"resources": [
{
"type": "config",
"name": "MyConfig"
"various other properties": ...
}
]
}
另一方面,如果您在嵌套资源中指定完整类型名称(如接受的答案所示),则需要采用根命名约定,即名称中的段数要比类型少!转换上面的内容:
{
"type": "Microsoft.Web/sites",
"name": "MySite",
"various other properties": ...,
"resources": [
{
"type": "Microsoft.Web/sites/config",
"name": "MySite/MyConfig"
"various other properties": ...
}
]
}
答案 3 :(得分:0)
您可以在这里找到答案。 对于子资源,类型和名称具有相同数量的段。该段数之所以有意义,是因为子代的全名和类型包括父代的名称和类型。因此,全名仍然比全名少一个分段。
https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/error-invalid-template
答案 4 :(得分:0)
像这样的事情发生在对Vnet凝视的时候。我使用了Microsoft文档中的以下模板:
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
},
"variables": {
},
"resources": [
{
"apiVersion": "2016-06-01",
"type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
"name": "myVnetA/myVnetAToMyVnetB",
"location": "[resourceGroup().location]",
"properties": {
"allowVirtualNetworkAccess": true,
"allowForwardedTraffic": false,
"allowGatewayTransit": false,
"useRemoteGateways": false,
"remoteVirtualNetwork": {
"id": "/subscriptions/<subscription ID>/resourceGroups/PeeringTest/providers/Microsoft.Network/virtualNetworks/myVnetB"
}
}
}
]
}
但是后来我将name
修改为vneta-tovnetb
,这给了我错误。
如果我将vneta/vnetb
用作name
,它将验证。