与环境无关的 ARM 模板参数文件

environment agnostic ARM template parameter file

我有一个用于存储帐户部署的(简化的)ARM 模板:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters":{
    "env_storage_name": {
      "type": "string"
    }
  },
  "resources":[
    {
        "type": "Microsoft.Storage/storageAccounts",
        "name":"[parameters('env_storage_name')]",
        "apiVersion": "2019-06-01"
    }
  ]
}

此模板使用关联的参数文件:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "env_storage_name": {
            "value": "<env>-storage_name"
        }
    }
}

我的目标是通过以下方式使用 Powershell 部署此模板:

az deployment group create --name "someDeploymentName" --resource-group "myRG" --template-file "pathToTemplate.json" --parameters "pathToParameters.json"

我用谷歌搜索了很多,但到目前为止我还没有找到一种方法来动态替换参数中的 env 子字符串,例如“dev”、“tst”、“acc”、“prd”。我想做的是在环境中有效地使用相同的 Powershell 命令“管道”。我试过玩弄变量,但到目前为止我还没有设法完成它。

这可能吗?谁能帮帮我?

根据上述要求,我们创建了下面的 arm 模板来创建存储帐户并在我们的环境中测试它工作正常。

{
   "$schema":"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
   "contentVersion":"1.0.0.0",
   "parameters":{
      "env_storage":{
         "type":"string",
         "allowedValues":[
            "dev",
            "test",
            "acc",
            "prd"
         ]
      },
      "storageName":{
         "type":"string"
      }
   },
   "functions":[
      
   ],
   "variables":{
      
   },
   "resources":[
      {
         "type":"Microsoft.Storage/storageAccounts",
         "apiVersion":"2021-04-01",
         "name":"[concat(parameters('env_storage'),parameters('storageName'))]",
         "location":"[resourceGroup().location]",
         "kind":"StorageV2",
         "sku":{
            "name":"Premium_LRS",
            "tier":"Premium"
         }
      }
   ],
   "outputs":{
      
   }
}

无需为 parameters.json 创建单独的文件,您可以直接在 az 部署组 cmdlet 中传递参数,如下所示。

对于 PowerShell:

$paramObject = @{ <list of parameters that declared in the deploymenttemplate.json>
    'env_storage' = '<env_value>'
    'storageName'  = '<account Name>'
}

$parameters = @{
    'Name'                  = '<deploymentName>'
    'ResourceGroupName'     = '<resourcegroupname>'
    'TemplateFile'          = '<deploymenttemplate.json'
    'TemplateParameterObject'  = $paramObject
    'Verbose'               = $true
}

New-AzResourceGroupDeployment @parameters

如果您使用 Bash,您可以使用以下格式在 az deployment group create cmdlet 期间传递参数

 $params = '{ \"env_storage\": {\"value\":\"<env_value>\"}, \"<storageName>\": {\"value\":\"<stroageaccountName\"} }'
        
 az deployment group create  --resource-group <resourcegrpName> --template-file <deploymenttemplate.json>  --parameters $params

这里是参考文档,可以了解有关如何 pass parameters in azure deployment group cli cmdlet

的更多信息

解决我的问题的方法是,使用变量从参数中连接我的相关资源名称等。我花了一段时间才了解 ARM 在这里为您提供的可能性。

我现在正在使用这个模板:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "subscription": {
        "type": "string"
      },
        "env": {
        "type": "string"
      }
    },
    "variables": {
        "storage_name":  "[concat(parameters('subscription'),'-',parameters('env'),'-storage_account_name')]"
    },
    "resources": [
        {
          "type": "Microsoft.Storage/storageAccounts",
          "name":"[variables('storage_name')]",
          "apiVersion": "2019-06-01"
      }
    ]
}

并用此参数文件提供给它:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
            "subscription": {
            "value": "mySub"
        },
            "env": {
            "value": "dev"
        }
    }
}

所以我唯一要做的就是更改参数文件中的“env”参数。

这并没有给我按下按钮的可能性,所有四个环境都是按顺序创建的,但这不是 atm 要求的一部分。例如,我仍然必须手动将“dev”更改为“tst”并重新运行我的 PowerShell 脚本,但这对我来说是可以接受的。