如何将JSON数组作为参数传递给AzureDevOps管道中的另一个YAML模板

huangapple go评论66阅读模式
英文:

How pass JSON array as parameter to another YAML template in AzureDevOps pipeline

问题

我有一个情况,需要将JSON数组作为参数传递到另一个YAML模板中,我已经对JSON数组进行了清理,但仍然出现以下错误。

错误

在D:\a_temp\azureclitaskscript1689449876215_inlinescript.ps1:30处的字符338

  • … dt-sem-use2" ipSecurityRestrictions=" [{"action":"Allow","descri …
    1. ~

参数列表中缺少参数。
在D:\a_temp\azureclitaskscript1689449876215_inlinescript.ps1:30处的字符433

  • … :"64.136.252.163/32","priority":1},{"action":"Allow","ipAddr …
    1. ~

参数列表中缺少参数。
在D:\a_temp\azureclitaskscript1689449876215_inlinescript.ps1:30处的字符528

  • … ","priority":1,"tag":"Default"},{"action":"Allow","ipAddr …
    1. ~

参数列表中缺少参数。
在D:\a_temp\azureclitaskscript1689449876215_inlinescript.ps1:30处的字符641

  • … priority":1000,"tag":"ServiceTag"},{"action":"Deny","ipAddr …
    1. ~

参数列表中缺少参数。
在D:\a_temp\azureclitaskscript1689449876215_inlinescript.ps1:38处的字符366

  • … dt-sem-use2" ipSecurityRestrictions=" [{"action":"Allow","descri …
    1. ~

参数列表中缺少参数。
在D:\a_temp\azureclitaskscript1689449876215_inlinescript.ps1:38处的字符461

  • … :"64.136.252.163/32","priority":1},{"action":"Allow","ipAddr …
    1. ~

参数列表中缺少参数。
在D:\a_temp\azureclitaskscript1689449876215_inlinescript.ps1:38处的字符556

  • … ","priority":1,"tag":"Default"},{"action":"Allow","ipAddr …
    1. ~

参数列表中缺少参数。
在D:\a_temp\azureclitaskscript1689449876215_inlinescript.ps1:38处的字符669

  • … priority":1000,"tag":"ServiceTag"},{"action":"Deny","ipAddr …
    1. ~

参数列表中缺少参数。

  • CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
  • FullyQualifiedErrorId : MissingArgument

有人可以帮忙解决我在这里做错了什么吗?
非常感谢。

以下是我正在尝试的YAML代码

  • task: AzureCLI@2
    name: 'AllowedIPs'
    displayName: 'GET allowed IPs'
    inputs:
    azureSubscription: ${{ parameters.ams_service_connection }}
    location: $(region)
    scriptType: pscore
    scriptLocation: inlineScript
    inlineScript: |
    $jsonResult = az deployment group create -g "<groupname>" --template-file '$(Pipeline.Workspace)/infrastructure/api/ip-restrictions.json' --parameters apiManagementName=<amsname> apiManagementRg=<amsrgname> | ConvertFrom-Json
    $ips = @($jsonResult.properties.outputs.ips.value) | ConvertTo-Json -Compress
    $val = $ips.replace('"', '&quot;')
    Write-Host "##vso[task.setvariable variable=ips;isoutput=true]"$val

  • template: deploy/arm-deploy.yml
    parameters:
    displayName: 'Configure ADT API IP restrictions'
    azureSubscription: ${{ parameters.adt_service_connection }}
    location: $(region)
    resourceGroupName: '<groupname>'
    force: true
    file: '$(Pipeline.Workspace)/infrastructure/api/adt-api-confog.json'
    parameters:
    name="<serviceprincipalname>"
    appServicePlanName="<serviceplanname>"
    apiRgName="<groupname>"
    ipSecurityRestrictions="$(AllowedIPs.ips)"

英文:

I have a situation where I need to pass JSON array as parameter into another YAML template, I have already sanitized the json array but still getting below error.

Array

  1. {\&quot;arr\&quot;:[{\&quot;priority\&quot;:1,\&quot;ipAddress\&quot;:\&quot;&lt;IP Address&gt;\&quot;,\&quot;description\&quot;:\&quot;\&quot;,\&quot;name\&quot;:\&quot;test\&quot;,\&quot;action\&quot;:\&quot;Allow\&quot;},{\&quot;priority\&quot;:1,\&quot;ipAddress\&quot;:\&quot;&lt;IP Address&gt;\&quot;,\&quot;description\&quot;:\&quot;\&quot;,\&quot;name\&quot;:\&quot;test1\&quot;,\&quot;action\&quot;:\&quot;Allow\&quot;}]}

Error

  1. At D:\a\_temp\azureclitaskscript1689449876215_inlinescript.ps1:30 char:338
  2. + dt-sem-use2&quot; ipSecurityRestrictions=&quot; [{\&quot;action\&quot;:\&quot;Allow\&quot;,\&quot;descri
  3. + ~
  4. Missing argument in parameter list.
  5. At D:\a\_temp\azureclitaskscript1689449876215_inlinescript.ps1:30 char:433
  6. + :\&quot;64.136.252.163/32\&quot;,\&quot;priority\&quot;:1},{\&quot;action\&quot;:\&quot;Allow\&quot;,\&quot;ipAddr
  7. + ~
  8. Missing argument in parameter list.
  9. At D:\a\_temp\azureclitaskscript1689449876215_inlinescript.ps1:30 char:528
  10. + \&quot;,\&quot;priority\&quot;:1,\&quot;tag\&quot;:\&quot;Default\&quot;},{\&quot;action\&quot;:\&quot;Allow\&quot;,\&quot;ipAddr
  11. + ~
  12. Missing argument in parameter list.
  13. At D:\a\_temp\azureclitaskscript1689449876215_inlinescript.ps1:30 char:641
  14. + priority\&quot;:1000,\&quot;tag\&quot;:\&quot;ServiceTag\&quot;},{\&quot;action\&quot;:\&quot;Deny\&quot;,\&quot;ipAddr
  15. + ~
  16. Missing argument in parameter list.
  17. At D:\a\_temp\azureclitaskscript1689449876215_inlinescript.ps1:38 char:366
  18. + dt-sem-use2&quot; ipSecurityRestrictions=&quot; [{\&quot;action\&quot;:\&quot;Allow\&quot;,\&quot;descri
  19. + ~
  20. Missing argument in parameter list.
  21. At D:\a\_temp\azureclitaskscript1689449876215_inlinescript.ps1:38 char:461
  22. + :\&quot;64.136.252.163/32\&quot;,\&quot;priority\&quot;:1},{\&quot;action\&quot;:\&quot;Allow\&quot;,\&quot;ipAddr
  23. + ~
  24. Missing argument in parameter list.
  25. At D:\a\_temp\azureclitaskscript1689449876215_inlinescript.ps1:38 char:556
  26. + \&quot;,\&quot;priority\&quot;:1,\&quot;tag\&quot;:\&quot;Default\&quot;},{\&quot;action\&quot;:\&quot;Allow\&quot;,\&quot;ipAddr
  27. + ~
  28. Missing argument in parameter list.
  29. At D:\a\_temp\azureclitaskscript1689449876215_inlinescript.ps1:38 char:669
  30. + priority\&quot;:1000,\&quot;tag\&quot;:\&quot;ServiceTag\&quot;},{\&quot;action\&quot;:\&quot;Deny\&quot;,\&quot;ipAddr
  31. + ~
  32. Missing argument in parameter list.
  33. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
  34. + FullyQualifiedErrorId : MissingArgument

Can anybody help what I am doing wrong here.
Many thanks in advance.

Below is yaml code that I am trying

  1. - task: AzureCLI@2
  2. name: &#39;AllowedIPs&#39;
  3. displayName: &#39;GET allowed IPs&#39;
  4. inputs:
  5. azureSubscription: ${{ parameters.ams_service_connection }}
  6. location: $(region)
  7. scriptType: pscore
  8. scriptLocation: inlineScript
  9. inlineScript: |
  10. $jsonResult = az deployment group create -g &quot;&lt;groupname&gt;&quot; --template-file &#39;$(Pipeline.Workspace)/infrastructure/api/ip-restrictions.json&#39; --parameters apiManagementName=&lt;amsname&gt; apiManagementRg=&lt;amsrgname&gt; | ConvertFrom-Json
  11. $ips = @($jsonResult.properties.outputs.ips.value) | ConvertTo-Json -Compress
  12. $val = $ips.replace(&#39;&quot;&#39;, &#39;\&quot;&#39;)
  13. Write-Host &quot;##vso[task.setvariable variable=ips;isoutput=true]&quot;$val
  14. - template: deploy/arm-deploy.yml
  15. parameters:
  16. displayName: &#39;Configure ADT API IP restrictions&#39;
  17. azureSubscription: ${{ parameters.adt_service_connection }}
  18. location: $(region)
  19. resourceGroupName: &#39;&lt;groupname&gt;&#39;
  20. force: true
  21. file: &#39;$(Pipeline.Workspace)/infrastructure/api/adt-api-confog.json&#39;
  22. parameters:
  23. name=&quot;&lt;serviceprincipalname&gt;&quot;
  24. appServicePlanName=&quot;&lt;serviceplanname&gt;&quot;
  25. apiRgName=&quot;&lt;groupname&gt;&quot;
  26. ipSecurityRestrictions=&quot;$(AllowedIPs.ips)&quot;

答案1

得分: 0

发布修复后,我成功解决了这个问题。

  1. $deployment = az deployment group create --resource-group "<resource-group-name>" --template-file '$(Pipeline.Workspace)/infrastructure/api/adt-ip-restrictions.json' --parameters apiManagementName=<app service website name> apiManagementRg=<website-resource-group-name> --query 'properties.outputs.ips.value'
  2. $result = @($deployment) -replace '&quot;','\&quot;&quot;' // 我在这一行做了更改
  3. 之前我是这样做的
  4. $result = @($deployment) -replace '&quot;','\&quot;'
  5. 然后改成了
  6. $result = @($deployment) -replace '&quot;','\&quot;&quot;'
  7. Write-Host "##vso[task.setvariable variable=ips]$result"
  8. 然后在下一个任务中
  9. az deployment group create --resource-group "<website-resource-group-name>" --template-file '$(Pipeline.Workspace)/infrastructure/api/update-sites.json' --parameters name="<appservice-website-name>" location="<location>" ipSecurityRestrictions="$(ips)"
英文:

Posting the fix I was able to resolve the issue.

  1. $deployment = az deployment group create --resource-group &quot;&lt;resource-group-name&gt;&quot; --template-file &#39;$(Pipeline.Workspace)/infrastructure/api/adt-ip-restrictions.json&#39; --parameters apiManagementName=&lt;app service website name&gt; apiManagementRg=&lt;website-resource-group-name&gt; --query &#39;properties.outputs.ips.value&#39;
  2. $result = @($deployment) -replace &#39;&quot;&#39;,&#39;\&quot;&quot;&#39; // I had to make a change in this line

earlier I was doing

  1. $result = @($deployment) -replace &#39;&quot;&#39;,&#39;\&quot;&#39;

Then changed it to

  1. $result = @($deployment) -replace &#39;&quot;&#39;,&#39;\&quot;&quot;&#39;
  2. Write-Host &quot;##vso[task.setvariable variable=ips]$result&quot;

Then in next task

  1. az deployment group create --resource-group &quot;&lt;website-resource-group-name&gt;&quot; --template-file &#39;$(Pipeline.Workspace)/infrastructure/api/update-sites.json&#39; --parameters name=&quot;&lt;appservice-website-name&gt;&quot; location=&quot;&lt;location&gt;&quot; ipSecurityRestrictions=&quot;$(ips)&quot;

huangapple
  • 本文由 发表于 2023年7月17日 15:35:41
  • 转载请务必保留本文链接:https://go.coder-hub.com/76702349.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定