Ben*_*enV 24 powershell azure azure-web-sites azure-resource-manager
我正在尝试使用AzureResourceManager PowerShell模块来创建和配置网站.我开始使用Visual Studio生成的模板文件,当我使用它时,它可以正常工作New-AzureResourceGroup -TemplateFile website.json.
所以现在我正在尝试调整模板文件来配置站点.我正在尝试设置php和.NET Framework版本.根据模式,这些属性是通过资源数组中的配置对象设置的.
这是我的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"
}
}
]
},
Run Code Online (Sandbox Code Playgroud)
当我通过此模板时,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'.
Run Code Online (Sandbox Code Playgroud)
我找不到任何关于此的文件.有谁知道这个错误意味着什么,或者我做错了什么?
Ben*_*enV 41
永远不会失败,一旦我写出问题,我就会找出答案.
该错误意味着因为这是一个嵌套资源(配置对象嵌套在站点对象中),名称需要反映这一点.所以,而不是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"
}
}
]
Run Code Online (Sandbox Code Playgroud)
Mat*_*att 15
我遇到了同样的问题,其他答案都不适合我,结果实际上比其他答案显示的要多一些。首先,对于根级资源,文档指定它必须:
...名称中的段比资源类型中少一个段
换句话说,如果您正在创建一个:
"type": "Microsoft.Web/sites"
Run Code Online (Sandbox Code Playgroud)
那么由于名称必须比类型少一个段,所以在这个例子中我们只能使用一个段作为名称,即一个:
"name": "MySite"
Run Code Online (Sandbox Code Playgroud)
对于嵌套资源,规则是:
类型和名称具有相同数量的段
但是,这假设您正在缩短嵌套资源的类型,例如创建“Microsoft.Web/sites/config”类型作为“Microsoft.Web/sites”类型的父级中的嵌套资源,并为嵌套资源指定:
"type": "config"
Run Code Online (Sandbox Code Playgroud)
所以在这里你也可以只指定一个段名称,例如:
"name": "MyConfig"
Run Code Online (Sandbox Code Playgroud)
所以把所有这些放在一起你有:
{
"type": "Microsoft.Web/sites",
"name": "MySite",
"various other properties": ...,
"resources": [
{
"type": "config",
"name": "MyConfig"
"various other properties": ...
}
]
}
Run Code Online (Sandbox Code Playgroud)
另一方面,如果您在嵌套资源中指定完整的类型名称(如已接受的答案所示),则需要采用名称中比类型少一个段的根命名约定!转换上述内容,您将拥有:
{
"type": "Microsoft.Web/sites",
"name": "MySite",
"various other properties": ...,
"resources": [
{
"type": "Microsoft.Web/sites/config",
"name": "MySite/MyConfig"
"various other properties": ...
}
]
}
Run Code Online (Sandbox Code Playgroud)
对于非英语母语的人,“错误的段长”错误消息很难理解,因此使用纯英文/ json进行了解释:例如,您拥有一个资源类型为resource的 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
],
...
}
Run Code Online (Sandbox Code Playgroud)
ps:如果您需要根据第三个资源的数量动态生成嵌套资源,您可能也对此问题感兴趣:如何在ARM模板中动态生成Traffic Manager端点?
| 归档时间: |
|
| 查看次数: |
13248 次 |
| 最近记录: |