我一直在开发一种解决方案,使用一个逻辑应用程序将Azure警报发送到Slack (为了将警报输出转换为一个JSON模式,该模式可以作为消息显示)。逻辑应用程序已部署为ARM模板,以便完全保留逻辑应用程序的内容,而其余的Azure资源则由Terraform部署。Terraform和ARM模板正在与Azure DevOps YAML管道一起部署,具有多个阶段。到目前为止,我已经编写了逻辑应用程序来将警报转换为消息(逻辑应用程序在模式转换后发布消息)。
我目前的困境是如何以编程的方式在Terraform配置中包含逻辑应用程序的URL (应该在其中发送警报)。由于逻辑应用工作流的可用数据块中没有配置属性,或者标准逻辑应用实例中没有配置属性,这使得这变得更加困难。
为了缓解Terraform功能的不足,我尝试使用Az Powershell模块命令检索逻辑应用程序URL ( Azure似乎没有功能 现在还没有)。使用一个简短的脚本,我可以获得url来触发逻辑应用程序:
$logicApp = Get-AzLogicAppTriggerCallbackUrl -ResourceGroupName "logic-app-rg" -Name "mylogicapp" -TriggerName "Manual"
$url = logicApp.Value通过添加以下行,可以将其添加到YAML管道中:
write-host "##vso[task.setvariable variable=outputURL;isOutput=true]$url"由于有多个阶段,并且只需要一个逻辑应用程序,所以将其放在第一阶段,在第一阶段创建核心基础设施( Terraform状态的存储帐户)。
当我无法将输出URL的任务中的数据发送到包含terraform的不同阶段时,就会出现困难。YAML管道的粗略结构(简化):
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的唯一方法吗?
(另一个问题可能是,这是解决当前挑战的最佳方法,还是我应该尝试的另一种解决方案?)
发布于 2022-07-01 13:48:54
最后,我为这个问题制定了一个变通的解决方案,将脚本添加到特定的作业中,使用只针对特定Terraform模块运行的条件,并更改脚本,以便它可以直接写入terraform文件。例如,为了在上面的管道基础上使用我现在手头的解决方案:
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 applylogic-app.yaml模板具有将url添加到变量文件的脚本,该文件存储在DevOps使用的代理上的临时存储位置:
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是存储库中用于管道的路径。通过将其添加到管道中,它现在已成功运行。
https://stackoverflow.com/questions/72467031
复制相似问题