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

问题描述 投票:0回答:5

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

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

经过一番调查,我发现 Azure 将分配的自定义域截断为 [domain-name-up-to-40-characters]-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() 可能会起作用,但这会使模板膨胀一点。

azure azure-resource-manager
5个回答
2
投票

我认为这是你能得到的最接近的:

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

2
投票

这可以通过 ARM 中的“take”函数来完成。

这将占用名称字符串的前 16 个字符...... “[take(参数('storageAccountName'), 16))]”

它不关心字符串是否少于 16 个字符,但如果它更长,则会将其截断。


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')))]"


0
投票

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

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

[替换(子字符串(padLeft(您的字符串,最大长度,填充字符),0,最大长度), 填充字符,'')]


0
投票

Take() 函数是正确的选择,可在二头肌和 ARM 模板中使用:

take(originalValue, numberToTake)

“要取的元素或字符的数量。如果该值为0或小于0,则返回空数组或字符串。如果大于给定数组或字符串的长度,则返回数组或字符串中的所有元素.”

https://learn.microsoft.com/en-us/azure/azure-resource-manager/templates/template-functions-string#take

© www.soinside.com 2019 - 2024. All rights reserved.