有没有办法确保 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 个字符,但如果它更长则会截断它。
我正在使用 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 个字符,但如果它更长则会截断它。