在 ADF 部署时触发状态更新

Trigger status update at the time of ADF deployment

我正在使用 Azure DevOps 管道将 ADF ARM 模板从 DEV 实例部署到 PROD。

下面的部署是我遵循的步骤。

  1. Microsoft 提供的用于在部署前停止触发器的脚本
  2. ARM 模板部署
  3. Microsoft 提供的脚本,用于启动触发器并删除不在 JSON 文件中的资源。 在下面页面的 header 示例前和 post-deployment 脚本 https://docs.microsoft.com/en-us/azure/data-factory/continuous-integration-deployment

我确实有大约 20 个触发器,其中 15 个处于 运行 状态,5 个在 PROD 中停止了一段时间。 在我的 DEV 实例中,所有触发器都处于停止状态,以避免不必要的管道运行。 但是在部署到 PROD 时,我需要将 20 个触发器中的 15 个的状态设置为 Started。

为了实现这一点,我在模板参数化中添加了触发器的运行时状态,现在我可以 select 从 ARM 模板部署任务中的覆盖参数选项中获取触发器状态,如下所示。

现在的问题是在 PROD 部署之后,所有触发器都处于 Stopped 状态,就像在 DEV 实例中一样。

尽管 runtimeState 在部署时被覆盖,但在部署后它不会反映在 PROD 实例中。

经过我的分析,我怀疑问题出在 Microsoft 的启动触发器脚本引用了 DEV 的 ARMTemplateForFactory.json 文件,其中所有触发器的状态都已停止。

如何解决?我必须在从 DEV 部署到 PROD 时更新每个触发作业的触发状态。

在 Microsoft STOP/START 触发器的脚本中,它正在从我们通过构建管道从 DEV 实例获取的 Json 文件中获取要启动的触发器列表。不会采用覆盖的管道状态来启动触发器。

我找到的解决方案之一是 在 ARM 部署后显式启动 触发器。为此,我找到了一份代理工作,如下所示。

但这项工作的问题是我无法一次提供多个触发器的名称。我能够提供单个触发器的名称,如下所示。

有没有办法在这个作业中添加多个触发器名称?

请检查以下事项:

  1. 在您的本地计算机上尝试相同的脚本,看看它们是否可以按预期工作。

  2. 如果脚本在您的本地计算机上也不起作用,则问题应该出在 ADF 或脚本上,而不是 Azure DevOps。检查您在 ADF 或脚本中是否有任何错误配置。

  3. 如果脚本可以在您的本地机器上按预期工作,请尝试在本地机器上安装一个自托管代理到 运行 管道,看看它是否可以按预期工作.

如您所述,Microsoft 提供的预post 部署脚本会在部署前暂停所有活动触发器,然后在部署后将它们恢复到 ARM 模板中指定的状态。 (他们建议在部署前暂停触发器以避免出现问题)

一种解决方案可能是创建自定义 powershell 脚本并在部署 ARM 模板后执行该脚本。您可以使用 Microsoft 提供的脚本中也使用的 Start-AzDataFactoryV2Trigger cmdlet。

例如:

$ResourceGroupName = "my-resource-group"
$DataFactoryName = "my-data-factory'
$triggersToStart = @("trigger-1", "trigger-2", "trigger-3")

$triggersToStart | ForEach-Object {
    Start-AzDataFactoryV2Trigger -ResourceGroupName $ResourceGroupName -DataFactoryName $DataFactoryName -Name $_ -Force
}

我暂时在ARM模板部署任务后添加了一个新的azure powershell任务来启动需要的触发器

ResourceGroupNameDataFactoryNameTriggersToStart 详细信息作为参数传递给脚本将启动触发器。这样我们就可以在每次部署期间 ADD/REMOVE 启用 的触发器。

下面是我用来获取参数并使用下面的脚本启动触发器的脚本。

param
(
 [parameter(Mandatory = $false)] [String] $ResourceGroupName,
 [parameter(Mandatory = $false)] [String] $DataFactoryName,
 [parameter(Mandatory = $false)] [Array] $triggersToStart
)

 Foreach($trigger_name in $triggersToStart)
 {
  Write-Host "Starting Trigger : " $trigger_name
  Start-AzDataFactoryV2Trigger -ResourceGroupName $ResourceGroupName -DataFactoryName $DataFactoryName -Name $trigger_name  -Force
 }