使用参数化数据库连接部署Azure数据工厂

使用参数化数据库连接部署Azure数据工厂,azure,azure-data-factory,azure-data-factory-2,Azure,Azure Data Factory,Azure Data Factory 2,我已在Azure Data Factory中为我的Azure SQL DB成功创建了参数化链接服务。但是,当我尝试跨环境部署它时,我会遇到问题。发布数据工厂时,生成的ARM模板参数文件仅包含链接服务的单个参数,并且未填充该文件 "Generic_Databases_connectionString": { "value": "" }, 根据microsoft提供的文档,我想我可以在部署中用正确的参数化值

我已在Azure Data Factory中为我的Azure SQL DB成功创建了参数化链接服务。但是,当我尝试跨环境部署它时,我会遇到问题。发布数据工厂时,生成的ARM模板参数文件仅包含链接服务的单个参数,并且未填充该文件

    "Generic_Databases_connectionString": {
        "value": ""
    },
根据microsoft提供的文档,我想我可以在部署中用正确的参数化值覆盖它。比如:

"Server=tcp:myserver.database.windows.net,1433;Database=@{linkedService().DBName};User ID=user;Password=fake;Trusted_Connection=False;Encrypt=True;Connection Timeout=30"
然而,由于我的密码存储在密钥库中,我不能简单地将其包含在这里。我认为问题在于我的ARM模板参数文件没有正确创建?有人面对过这个问题吗


有多种方法可以实现这一点。我假设您使用Azure管道来部署ARM模板。总的来说,您没有给出关于如何部署ARM模板的任何细节

对于下面的两个示例,我将创建一个ARM parameters.json文件并将其保存在存储库中

  • 您可以使用PowerShell脚本更改文件。以下是一个例子:
  • -任务:PowerShell@2
    投入:
    targetType:“内联”
    脚本:|
    $filePath='arm.parameters.json'
    $tempFilePath=“temp.arm.parameters.json”
    $find='dbSecret'
    $replace='VariableNameFromKV'
    (获取内容-路径$filePath)-替换$find,$replace |添加内容-路径$tempFilePath
    删除项-路径$filePath
    移动项目-路径$tempFilePath-目标$filePath
    
  • 我们个人使用这样的东西:
  • 然后将parameters.json中的值标记化

        "Generic_Databases_connectionString": {
            "value": "#{NameOfKVSecret}#"
        },
    
    然后在每个环境的管道中运行此任务,以替换标记化值:

    #YAML文件
    -任务:a8515ec8-7254-4ffd-912c-86772e2b5962@3
    displayName:“替换ARM参数中的令牌”
    投入:
    根目录:“$(Pipeline.Workspace)/drop”
    targetFiles:“**/fileToReplace.json”
    编码:“自动”
    writeBOM:对
    基普顿肯:错
    标记前缀:'#{'
    标记后缀:'}#'
    启用遥测:错误
    actionOnMissing:“继续”
    详细的
    #使用替换的parameters.json文件执行其余部署任务
    
    您需要将变量导入管道。有多种方法可以做到这一点,具体取决于您是使用经典管道还是YAML。例如,如果您的环境有单独的密钥保险库,您可以将这些值存储在其中并使用:

    #YAML文件
    -任务:AzureKeyVault@1
    displayName:获取KeyVault变量
    投入:
    azureSubscription:“${{parameters.KV_APP_NAME}”
    KeyVault名称:“$(vg.KeyVault名称)”
    
    此任务将KV中的值作为变量读取到管道中,然后您可以在部署中使用这些变量。在您的情况下,每个环境都有一个阶段

    上述两个任务也可以在经典管道中使用

    总的来说,为了实现这一点,您应该以这样的方式设计部署管道:每个环境都有自己的阶段,每个环境的配置值都可以替换,如下所示: