首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将跨YAML管道的输出变量从powershell脚本解析为Terraform变量

将跨YAML管道的输出变量从powershell脚本解析为Terraform变量
EN

Stack Overflow用户
提问于 2022-06-01 19:16:10
回答 1查看 312关注 0票数 0

我一直在开发一种解决方案,使用一个逻辑应用程序将Azure警报发送到Slack (为了将警报输出转换为一个JSON模式,该模式可以作为消息显示)。逻辑应用程序已部署为ARM模板,以便完全保留逻辑应用程序的内容,而其余的Azure资源则由Terraform部署。Terraform和ARM模板正在与Azure DevOps YAML管道一起部署,具有多个阶段。到目前为止,我已经编写了逻辑应用程序来将警报转换为消息(逻辑应用程序在模式转换后发布消息)。

我目前的困境是如何以编程的方式在Terraform配置中包含逻辑应用程序的URL (应该在其中发送警报)。由于逻辑应用工作流的可用数据块中没有配置属性,或者标准逻辑应用实例中没有配置属性,这使得这变得更加困难。

为了缓解Terraform功能的不足,我尝试使用Az Powershell模块命令检索逻辑应用程序URL ( Azure似乎没有功能 现在还没有)。使用一个简短的脚本,我可以获得url来触发逻辑应用程序:

代码语言:javascript
复制
$logicApp = Get-AzLogicAppTriggerCallbackUrl -ResourceGroupName "logic-app-rg" -Name "mylogicapp" -TriggerName "Manual"
$url = logicApp.Value

通过添加以下行,可以将其添加到YAML管道中:

代码语言:javascript
复制
write-host "##vso[task.setvariable variable=outputURL;isOutput=true]$url"

由于有多个阶段,并且只需要一个逻辑应用程序,所以将其放在第一阶段,在第一阶段创建核心基础设施( Terraform状态的存储帐户)。

当我无法将输出URL的任务中的数据发送到包含terraform的不同阶段时,就会出现困难。YAML管道的粗略结构(简化):

代码语言:javascript
复制
stages:
- stage: infra-1
  jobs:
  - job: deploy-common-infra
    steps:
    - script: |
        cd core-infra
        terraform init
        terraform plan
        terraform apply
        $logicApp = Get-AzLogicAppTriggerCallbackUrl -ResourceGroupName "logic-app-rg" -Name "mylogicapp" -TriggerName "Manual"
        $url = logicApp.Value
        write-host "##vso[task.setvariable variable=outputURL;isOutput=true]$url"
      name: getLogicAppURL
- stage: build
  jobs:
  - job: build
    - task: build-app
- stage: infra-2
  dependsOn:
  - infrastructure-1
  variables:
    outputURL: $[stageDependencies.infra-1.deploy-common-infra.outputs['getLogicAppURL.outputURL']]
  jobs:
  - job: deploy-infra
    - script: |
        cd infra
        terraform init
        terraform plan -var="logicAppUrl='$(outputURL)'"
        terraform apply

应该注意的是,在真正的管道中,我使用的是专用的Terraform任务,而不是在脚本中编写Terraform命令。

我麻烦的主要部分是因为我不想跳过“构建”阶段,否则我将不会在最后阶段部署一个应用程序(不包括在上面的示例管道中)。此外,发送给terraform的值为"null“(没有发送URL!)

我已经使用并研究了关于如何在工作阶段以及管道中共享在使用依赖项时变量的现有答案,但是到目前为止,我还很难找到一种允许我跨阶段解析URL变量的解决方案。是将YAML变量跨阶段解析成Terraform的唯一方法吗?

(另一个问题可能是,这是解决当前挑战的最佳方法,还是我应该尝试的另一种解决方案?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-01 13:48:54

最后,我为这个问题制定了一个变通的解决方案,将脚本添加到特定的作业中,使用只针对特定Terraform模块运行的条件,并更改脚本,以便它可以直接写入terraform文件。例如,为了在上面的管道基础上使用我现在手头的解决方案:

代码语言:javascript
复制
stages:
- stage: infra-1
  jobs:
  - job: deploy-common-infra
    steps:
    - script: |
        cd core-infra
        terraform init
        terraform plan
        terraform apply
- stage: build
  jobs:
  - job: build
    steps:
    - task: build-app
- stage: infra-2
  dependsOn:
  - infrastructure-1
  variables:
    outputURL: $[stageDependencies.infra-1.deploy-common-infra.outputs['getLogicAppURL.outputURL']]
  jobs:
  - job: deploy-infra
    steps:
    - template: logic-app.yaml
    - script: |
        cd infra
        terraform init
        terraform plan -var="logicAppUrl='$(outputURL)'"
        terraform apply

logic-app.yaml模板具有将url添加到变量文件的脚本,该文件存储在DevOps使用的代理上的临时存储位置:

代码语言:javascript
复制
steps:
- script: |
    $logicApp = Get-AzLogicAppTriggerCallbackUrl -ResourceGroupName "logic-app-rg" -Name "mylogicapp" -TriggerName "Manual"
    $url = $logicApp.Value
    Add-Content -Path "$directory/infra/vars.tfvars" -Value "`nslack_url=`"$url`""

应该注意的是,terraform/vars.tfvars是存储库中用于管道的路径。通过将其添加到管道中,它现在已成功运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72467031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档