azure - 使用ARM参数选择对象变量中的字段

标签 azure azure-resource-manager

我正在构建 Azure 资源管理器 (ARM) 模板,但遇到了无法解决的问题。我们有多种开发环境(沙箱、开发、生产等),我正在努力思考如何最好地实现我想要的目标。

我想提供一个定义环境参数的参数文件来识别我们正在构建的环境。例如,这是“dev”环境的一个(有更多参数,这只是相关的最小参数)。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "environment": {
            "value": "dev"
        }
    }
}

我目前在 ARM 模板中有几个变量,我希望能够根据环境提取值,但是我在构建 ARM 模板时遇到了麻烦,并且错误消息很糟糕(“格式错误的字符串”)使用 Azure CLI 进行验证时,构建代理尝试部署资源时我得到的只是“BadRequest”)。

如果我有一个变量定义为:

"sampleObject": {
            "sbx": {
                "value1": true,
                "value2": true
            },
            "dev": {
                "value1": true,
                "value2": true
            },
            "prd": {
                "value1": false,
                "value2": true
            }
}

我想使用这些字段来进一步定义变量“envValue1”和“envValue2”,以便稍后在模板中定义资源时使用,所以我尝试了这样的操作:

"environmentParams": "[variables('sampleObject')[parameters('environment')]]",
"envValue1": "[variables('environmentParams').value1]",
"envValue2": "[variables('environmentParams').value2]"

但是,上面的内容似乎不起作用,虽然我在模板中使用了其他所有内容,但在这导致问题之前。具体来说,我认为是这条线

"environmentParams": "[variables('sampleObject')[parameters('environment')]]"

我可以找到几个使用 "[variables('environmentParams').value1]"的示例 之前抓取对象变量的片段,但我不确定是否可以像以前那样传递 parameters('environment)' 片段,并且我找不到任何以这种方式使用它的东西.

我做错了什么?是否可以传入环境参数来获取对象的一部分?我已尝试以下操作,但到目前为止没有任何效果(使用 Azure CLI 测试创建资源)。

"[variables('sampleObject')[parameters('environment')]]"
"[variables('sampleObject').[parameters('environment')]]"

如果我想做的事情不可能实现,那么人们如何管理多个环境?他们是否只是将所有内容都塞进参数文件中,从而很难通过查看 ARM 模板来了解环境之间的差异?

最佳答案

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "environment": {
            "type": "String"
        }
    },
    "variables": {
        "sampleObject": {
            "sbx": {
                "value1": true,
                "value2": true
            },
            "dev": {
                "value1": true,
                "value2": true
            },
            "prd": {
                "value1": false,
                "value2": true
            }
        },
        "value": "[variables('sampleObject')[parameters('environment')]]",
        "othervar": "[variables('value').value1]"
    },
    "resources": [ ],
    "outputs": {
        "we": {
            "type": "Bool",
            "value": "[variables('value').value1]"
        }
    }
}

这工作得很好,您可以使用点表示法轻松访问对象属性,您可以使用此示例。

但是你不能这样做:

"[variables('sampleObject').[parameters('environment')]]"

因此,如果您使用变量来访问属性,则无需点。

关于azure - 使用ARM参数选择对象变量中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43928235/

相关文章:

Azure API 管理访问 token 无效

.net - 从自定义镜像创建 Azure VM

azure - 如何将证书部署到 Azure CSES 中的角色?

azure - sys.resource_stats 没有数据

javascript - d3.js 从 url 获取 JSON

asp.net-mvc - 尝试了解 ASP.NET MVC 中应用程序池刷新和 View 预编译的更详细信息

azure - 如何在单个 ARM 模板中部署带有规则引擎的 Front Door

azure - 用于获取容器/目录/AZURE 存储中的文件列表的 Rest API

azure - 如何删除被不属于我的域锁定的 Front Door 资源

azure - Azure ARM 中负载均衡器的入站 NAT 规则,如何指定端口范围?