发布后如何将 Azure 数据工厂参数放入 ARM 模板参数文件 (ARMTemplateParametersForFactory.json)

Posted

技术标签:

【中文标题】发布后如何将 Azure 数据工厂参数放入 ARM 模板参数文件 (ARMTemplateParametersForFactory.json)【英文标题】:How to get the Azure Data Factory parameters into the ARM template parameters file (ARMTemplateParametersForFactory.json) after publishing 【发布时间】:2019-05-08 14:55:22 【问题描述】:

我正在尝试为 Azure 数据工厂创建我的 Azure DevOps 发布管道。

我已遵循 Microsoft (https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment) 提供的关于向发布时生成的 ARM 模板添加其他参数的相当神秘的指南 (https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment#use-custom-parameters-with-the-resource-manager-template)

在 master 分支的路由中创建了一个arm-template-parameters-definition.json 文件。当我发布时,adf_publish 分支中的ARMTemplateParametersForFactory.json 保持完全不变。我尝试了很多配置。

我在数据工厂中定义了一些管道参数,并希望它们可以在我的部署管道中进行配置。对我来说似乎是一个明显的要求。

我错过了一些基本的东西吗?请帮忙!

JSON如下:


    "Microsoft.DataFactory/factories/pipelines": 
        "*": 
            "properties": 
                "parameters": 
                        "*": "="                
                
            
        
    ,
    "Microsoft.DataFactory/factories/integrationRuntimes": 
        "*": "="
    ,
    "Microsoft.DataFactory/factories/triggers": ,
    "Microsoft.DataFactory/factories/linkedServices": ,
    "Microsoft.DataFactory/factories/datasets": 

【问题讨论】:

为什么你认为它必须改变?它不应该。它应该使用这些参数来部署你需要的任何东西。它不会在 repo 中更新该文件的内容(为什么会这样?) @4c74356b41 是的,当您发布时应该这样做,但并非始终如一。我建议您阅读问题中发布的链接。 【参考方案1】:

我已经为此苦苦挣扎了几天,并没有找到很多信息,所以这里是我发现的。您必须将arm-template-parameters-definition.json 放在协作分支的已配置根文件夹中:

所以在我的示例中,它必须如下所示:

如果您在单独的分支中工作,则可以通过从数据工厂下载 arm 模板来测试您的配置。当您更改参数定义时,您必须重新加载浏览器屏幕 (f5) 以刷新配置。

如果您真的想对所有管道中的所有参数进行参数化,以下应该可以工作:

"Microsoft.DataFactory/factories/pipelines": 
    "properties": 
        "parameters":
            "*":
                "defaultValue":"="
            
        
    

我更喜欢指定要参数化的参数:

"Microsoft.DataFactory/factories/pipelines": 
    "properties": 
        "parameters":
            "LogicApp_RemoveFileFromADLSURL":
                "defaultValue":"=:-LogicApp_RemoveFileFromADLSURL:"
            ,
            "LogicApp_RemoveBlob":
                "defaultValue":"=:-LogicApp_RemoveBlob:"
            
        
    

【讨论】:

谢谢...我会试一试并告诉你。 如果您不使用标准布局文件夹,请在下面添加一个小说明。 HTH 只是一个注释,以防它帮助其他人......我不确定名称是否应该在末尾有一个冒号 - 即我认为 LogicApp_RemoveFileFromADLSURL: 应该是 LogicApp_RemoveFileFromADLSURL 冒号使我的自动化崩溃了部署脚本。【参考方案2】:

只是为了澄清西蒙的好答案。如果您有非标准的 git 层次结构(即,您将根移动到一个子文件夹,就像我在下面使用“Source”所做的那样),当文档引用“repo root”时可能会造成混淆。希望这张图有所帮助。

【讨论】:

【参考方案3】:

您的想法是对的,但是 arm-template-parameters-definition.json 文件需要遵循您要参数化的元素的层次结构。

这是我想要参数化的管道活动。 “url”应该根据它部署的环境而改变


    "name": "[concat(parameters('factoryName'), '/ExecuteSPForNetPriceExpiringContractsReport')]",
    "type": "Microsoft.DataFactory/factories/pipelines",
    "apiVersion": "2018-06-01",
    "properties": 
        "description": "",
        "activities": [
            
                "name": "NetPriceExpiringContractsReport",
                "description": "Passing values to the Logic App to generate the CSV file.",
                "type": "WebActivity",
                "typeProperties": 
                    "url": "[parameters('ExecuteSPForNetPriceExpiringContractsReport_properties_1_typeProperties')]",
                    "method": "POST",
                    "headers": 
                        "Content-Type": "application/json"
                    ,
                    "body": 
                        "resultSet": "@activity('NetPriceExpiringContractsReportLookup').output"
                    
                
            
        ]
    

这里是将 URL 转换为参数的 arm-template-parameters-definition.json 文件。


   "Microsoft.DataFactory/factories/pipelines": 
        "properties": 
            "activities": [
                "typeProperties": 
                    "url": "-::string"
                
            ]
        
    ,
    "Microsoft.DataFactory/factories/integrationRuntimes": ,
    "Microsoft.DataFactory/factories/triggers": ,
    "Microsoft.DataFactory/factories/linkedServices": 
        "*": "="
    ,
    "Microsoft.DataFactory/factories/datasets": 
        "*": "="
    

所以基本上在 ARM 模板的管道中,它会在 JSON 中查找属性 -> 活动 -> typeProperties -> url 并对其进行参数化。

【讨论】:

我正在尝试返回没有参数化的 adf_publish 模板,但无论我做什么,它总是参数化我的所有linkedServices 连接字符串。你知道这是为什么吗? OK 在文档中它说“默认情况下,所有安全字符串(例如 Key Vault 机密)和安全字符串(例如连接字符串、密钥和令牌)都是参数化的。”.. 这就是为什么我不能取消参数化它们。【参考方案4】:

以下是消除混淆的必要步骤:

    将 arm-template-parameters-definition.json 添加到您的 master 分支。 关闭并重新打开您的 Dev ADF 门户 重新发布

然后您的 ARMTemplateParametersForFactory.json 将被更新。

【讨论】:

【参考方案5】:

我遇到过类似的问题,ARMTemplateParametersForFactory.json 文件在我发布并更改了arm-template-parameters-definition.json 时没有更新。

我想我可以通过执行以下操作来强制更新 Publish 分支:

    根据需要更新自定义参数定义文件。 从 Publish 分支中删除 ARMTemplateParametersForFactory.json。 刷新 (F5) 数据工厂门户。 发布。

正如 Simon 提到的,验证自定义参数 .json 语法的最简单方法似乎是导出 ARM 模板。

【讨论】:

以上是关于发布后如何将 Azure 数据工厂参数放入 ARM 模板参数文件 (ARMTemplateParametersForFactory.json)的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 ARM 模板重新部署 Azure 数据工厂

如何将Azure管道变量传递给AzureResourceManagerTemplateDeployment @ 3任务使用的ARM模板?

将嵌套参数传递到 Azure 数据工厂

如何将 Azure 管道变量传递给 AzureResourceManagerTemplateDeployment@3 任务使用的 ARM 模板?

在 Azure 数据工厂中完成活动后,如何向 Azure 服务总线发送消息

Azure 数据工厂 - 尝试将参数添加到 REST API 请求正文中的动态内容