有没有办法确保ARM模板中的字符串不会太长

时间:2019-08-06 11:31:18

标签: azure azure-resource-manager

我正在使用ARM模板在我们的Web应用程序上创建部署插槽,并且在定义主机名绑定时似乎遇到了问题。我从Azure中提取了模板,然后将其修改为使用变量,但是在部署时出现错误:

Too many (2) hostnames in the default DNS zone. Limit is 1.

经过一番调查,我发现Azure将指定的自定义域截断为[最多40个字符的域名] -staging.azurewebsites.net,这意味着域名不匹配。因此,我在ARM模板中尝试了以下操作:

"type": "Microsoft.Web/sites/slots/hostNameBindings",
"apiVersion": "[variables('myWebapp').apiVersion]",
"name": "[concat(variables('myWebapp').name, '/staging/', substring(variables('myWebapp').name, 0, 40), '-staging', parameters('domain'))]",

这可以解决问题,但前提是应用程序的名称为40个字符或更多。当名称低于该名称时,我会显示以下错误消息:

The index and length parameters must refer to a location within the string. The index parameter: '0', the length parameter:  '40', the length of the string parameter: '38'

查看文档,如果字符串较短,substring()将会失败,但是我真的很想让ARM模板处理类似的事情,而不是在应用程序名称上施加矛盾。我错过了一些合理的解决方法吗?我猜想在我检查length()的地方使用条件参数,但这会使模板膨胀一些。

3 个答案:

答案 0 :(得分:0)

我认为这是您可以获得的最接近的东西

if(greater(length(your-parameter-goes-here), 40), do-substring, return-original-value)

答案 1 :(得分:0)

按照建议使用if()比我想象的要好,即使它有点混乱。作为其他人遇到此问题的参考,它的最终结果是这样:

"name": "[if(greater(length(variables('myWebapp').name), 39), concat(variables('myWebapp').name, '/staging/', substring(variables('myWebapp').name, 0, 40), '-staging', parameters('domain')), concat(variables('myWebapp').name, '/staging/', variables('myWebapp').name, '-staging', parameters('domain')))]"

答案 2 :(得分:0)

您还可以做的是首先使字符串足够长以保留子字符串,然后再次删除填充字符,以防开始时较短。

您需要填充字符,因为也没有 padRight。在我的情况下,padding-char 只是一个空格,因为在给定的上下文中无论如何它都是非法字符。

<块引用>

[replace(substring(padLeft(your-string,maxlength,padding-char),0,maxlengt), 填充字符,'')]