[英]Is there any way in ARM Templates to use a Case-like statement?
Azure 中是否有任何方法可以根据参数或变量的值使用类似CASE
的语句?
例如:
if vmName = "DB" then adminloginName = "DBAdmin"
if vmName = "RDP" then adminlogonNAme = "RDPAdmin"
不,截至今天,ARM 模板功能尚不支持Case 之类的语句。
但是,它们确实已经支持逻辑if
函数。
逻辑功能
资源管理器提供以下用于处理逻辑条件的功能:
- 和
- 布尔值
- 如果
- 不
- 或
正如@juvchan 指出的那样。 尽管支持某些逻辑检查,但不支持 CASE 语句。 但是,要解决您所描述的问题,您可以将变量与参数结合使用来构造管理员名称。 例如...
"parameters": {
"vm_name": {
"defaultValue": "DB",
"type": "string"
},
"variables": {
"admin_name": "[concat(parameters('vm_name'), 'Admin')]"
}
然后你可以在资源定义中使用admin_name
变量。
"resources":[
{
...other resource properties
"adminloginName": "[variables('admin_name')]"
}
]
还有一些字符串操作函数( Azure ARM 字符串函数),包括一个substring
函数,这样如果您的 VM 名称以DB或RDP开头或结尾,则可以仅使用所需名称的一部分。
你可以用这个来模拟:
"variables": {
"vmName": "DB" # this supposed to be parameter, but for brievity i'll use variable
"adminloginNameDB": "DBADMIN"
"adminloginNameRDP": "RDPADMIN"
"adminlogin": "[variables(concat('adminloginName', variables('vmName')))]"
}
所以实际上你会像这样使用它: "[variables(concat('adminloginName', parameters('vmName')))]"
抱歉,但到目前为止还没有办法采用这种方法,但是,您可以应用一些解决方法/技巧:
选项 1:
"variables": {
"adminloginName": "[if(equals(parameters('vmName'),'DB'),'DBAdmin', 'RDPAdmin' )]"
}
选项 2:
"variables": {
"adminloginNames":["DBAdmin","RDPAdmin"],
"adminloginName": "[if(equals(parameters('vmName'),'DB'),first(variables('adminloginNames'),last(variables('adminloginNames') )]",
}
还有其他很多组合
您可以像这样使用嵌套的 if 语句来模拟 case 语句。
"variables": {
"subscription_id": "[if(equals(parameters('env'),'dev'), parameters('devsubscriptionid'), if(equals(parameters('env'),'uat'), parameters('uatsubscriptionid'), parameters('prodsubscriptionid')))]",
"routeTables_rt_gdp_apim_dev_ne_001_externalid": "[concat('/subscriptions/', variables('subscription_id'),'/resourceGroups/RG-COM-FIREWALL-DEV-NE-001-test/providers/Microsoft.Network/routeTables/rt-gdp-apim-dev-ne-001')]"
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.