Azure数据工厂YAML部署在带有空格的overrideParameter键上失败



我过去曾成功地通过yaml管道和多行overrideParameters部署过数据工厂实例,但Azure DevOps解析器似乎不喜欢其中有空格的键,并失败,错误为
There was an error while overriding [my-parameter] parameter because of 'TypeError: Cannot read property 'type' of undefined', make sure it follows JavaScript Object Notation (JSON)
参数名称是通过adf_publish分支自动创建的,因此我无法更改它(如果可以的话,我不想使用自定义模板)。以下是一些示例设置和我尝试过的内容。

adf_publish arm参数文件

{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"factoryName": {
"value": "my_adf"
},
"AAS-Shutdown-Trigger_properties_AAS Shutdown_parameters_AASServerName": {
"value": "my_aas_server"
}
}
}

管道.yml

- task: AzureResourceManagerTemplateDeployment@3
displayName: 'ARM Template deployment'
inputs:
deploymentScope: 'Resource Group'
azureResourceManagerConnection: ${{ variables.azureSubscription }}
subscriptionId: ${{ variables.subscriptionId }}
action: 'Create Or Update Resource Group'
resourceGroupName: ${{ variables.resourceGroupName }}
location: 'West Europe'
templateLocation: 'Linked artifact'
csmFile: '$(System.DefaultWorkingDirectory)/adf_branch/${{ variables.dataFactoryRepoPath }}/ARMTemplateForFactory.json'
csmParametersFile: '$(System.DefaultWorkingDirectory)/adf_branch/${{ variables.dataFactoryRepoPath }}/ARMTemplateParametersForFactory.json'
overrideParameters: >-
-factoryName "${{ variables.dataFactoryName }}"
-AAS-Shutdown-Trigger_properties_AAS Shutdown_parameters_AASServerName "${{ variables.aasShutdownServer }}"
deploymentMode: 'Incremental'

我在参数键上尝试了以下变体(无效)

  • -AAS-ShutdownTrigger_properties _AAS Shutdown_parameters_AASServerName
  • -"AAS-ShutdownTrigger_properties _AAS Shutdown_parameters_
  • -'AAS-ShutdownTrigger_properties _AAS Shutdown_parameters_AASServerName'
  • -["AAS-ShutdownTrigger_properties _AAS Shutdown_parameters_AASServerName"]
  • -[AAS关闭触发器属性_AAS关闭参数_ASServerName]

如果我删除有问题的参数,一切都很好。

编辑:添加有问题触发器的adf资源定义(根据@KamilNowinski 的要求

{
"name": "AAS-Shutdown-Trigger",
"properties": {
"annotations": [],
"runtimeState": "Started",
"pipelines": [
{
"pipelineReference": {
"referenceName": "AAS Shutdown",
"type": "PipelineReference"
},
"parameters": {
"AASServerName": "my-aas",
"ResourceGroupName": "my-rg",
"EtlPipelineName": "ETL Pipeline",
"KeyVaultName": "my-kv",
"OMSIdSecretName": "OMS-Workspace-ID",
"OMSKeySecretName": "OMS-Workspace-Key",
"AutomationAccountName": "my-atm",
"RunbookName": "aas-runbook"
}
}
],
"type": "ScheduleTrigger",
"typeProperties": {
"recurrence": {
"frequency": "Minute",
"interval": 10,
"startTime": "2020-10-07T13:27:00Z",
"timeZone": "UTC"
}
}
}
}

查看PowershellParameters.ts的AzureResourceManagerTemplateDeployment@3代码,我认为无法处理参数名称中的空格。

parse方法的顶部if块具有在空间上结束符号的解析器(这是好的,至少如果您可以处理引用的话),但是isName方法要求没有"0";特别的";其中的字符(并且引号/方括号被findLiteral限定为特殊字符)。

我采用了解析器类型脚本,并以多种不同的方式对其进行了练习,但没有一种方法(包括您的变体)允许该名称存在。

这并不意味着没有解决方案-可以使用像Replace Tokens这样的扩展将模板和参数文件中的参数名称更改为更简单的名称,然后使用overrideParameters更改该名称。

我发布了一个答案,总结了我们的发现,这样其他人就更轻松了。正如@WaitingForGuacamole所指出的,ARM任务源代码似乎无法处理参数键中的空格,无论如何引用它。因此,在ADF发布ARM模板后,必须引入一些函数来替换参数键中的空格,或者必须注意,正如@KamilNowinski所指出的,ADF管道名称中首先不要有空格。我仍然认为,ADF在发布之前用可接受的符号替换空格(或任何特殊字符)应该不会那么困难。如果不使用adf_publish ARM模板,而是直接编辑adf json定义,那么这仍然会留下问题。

最新更新