我有一个用于运行 terraform 计划的模板,或根据传递到模板中的命令参数进行应用。
舞台和模板文件如下所示(针对上下文进行了精简)。
- stage: terraform_${{ parameters.environment }}
displayName: "Stage1"
jobs:
- job: "TFPlan"
steps:
- template: ../steps/terraform-steps.yml
parameters:
command: plan
subscription: ${{ variables['Terraform.Subscription'] }}
- job: "TFApply"
variables:
changesPresent: $[ dependencies.TFPlan.outputs['Terraformplan.changesPresent'] ]
steps:
- template: ../steps/terraform-steps.yml
parameters:
command: apply
subscription: ${{ variables['Terraform.Subscription'] }}
changesPresent: $(changesPresent)
parameters:
- name: command
displayName: Terraform Command
type: string
default: plan
values:
- plan
- apply
- name: subscription
displayName: Azure Subscription
type: string
- name: changesPresent
displayName: Changes changesPresent
type: string
default: "false"
steps:
- ${{ if eq(parameters.command, 'apply') }}:
- powershell: |
Write-Host "command = ${{parameters.command}}"
Write-Host "changesPresent = ${{parameters.changesPresent}}"
Write-Host "equals commandIsApply = ${{ eq(parameters.command, 'apply') }}"
Write-Host "equals changesPresentisFalse = ${{ eq(parameters.changesPresent, 'false') }}"
Write-Host "equals changesPresentisFalse = ${{ eq(parameters.changesPresent, false) }}"
Write-Host "equals changesPresentisFalse = ${{ eq(parameters.changesPresent, False) }}"
Write-Host "equals changesPresentisTrue = ${{ eq(parameters.changesPresent, 'true') }}"
Write-Host "equals changesPresentisTrue = ${{ eq(parameters.changesPresent, true) }}"
Write-Host "equals changesPresentisTrue = ${{ eq(parameters.changesPresent, True) }}"
- ${{ if not(and(eq(parameters.command, 'apply'), eq(parameters.changesPresent, 'false'))) }}:
- task: TerraformTaskV4@4
name: Terraform${{ parameters.command }}
displayName: Terraform ${{ parameters.command }}
inputs:
provider: azurerm
command: ${{ parameters.command }}
environmentServiceNameAzureRM: ${{ parameters.subscription }}
TerraformTaskV4@4 步骤有 ChangePresent 的输出 (doc)。我正在尝试从运行 terraform plan 的第一个作业访问此输出变量,并将其传递到第二个作业中,以确定是否需要运行 terraform apply ,具体取决于是否存在任何更改。
正如您从模板中的所有调试输出中看到的,我正在尝试验证当changesPresent作为参数传递到模板中时,它是否设置为我期望的值。
奇怪的是,以下行显示的值为 false:
Write-Host "changesPresent = ${{parameters.changesPresent}}"
然而接下来的每一行尝试用 eq() 确认该值都会返回 False 值。 这是我得到的输出:
command = apply
changesPresent = false
equals commandIsApply = True
equals changesPresentisFalse = False
equals changesPresentisFalse = False
equals changesPresentisFalse = False
equals changesPresentisTrue = False
equals changesPresentisTrue = False
equals changesPresentisTrue = False
它正确地将命令参数等同于“apply”,但不将changesPresent参数等同于“false”。我确信它与编译/运行时/宏语法的疯狂有关,但我不知道如何让它工作。 非常感谢任何帮助。
看起来您正在尝试在调用模板时传入运行时变量作为参数值:
changesPresent: $(changesPresent)
如果这是一个运行时变量,那么这将不起作用。在管道开始运行之前,参数值必须在编译时已知。