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

Is there a way to ensure a string in an ARM template doesn't get too long

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

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

经过一些调查,我发现 Azure t运行 将分配的自定义域分类为 [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() 的地方使用条件参数可能会起作用,但这会使模板膨胀一点。

我认为这是最接近的:

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

按照建议使用 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')))]"

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

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

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

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

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

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