Comportamento imprevisto con le variabili di Azure Pipelines tramite gruppi di variabili e modelli
Dispongo di una pipeline YAML di Azure DevOps per eseguire una distribuzione Terraform utilizzando l'estensione Terraform by MS DevLabs e una connessione al servizio Azure Resource Manager.
L'ultimo stato di lavoro era l'utilizzo di un file yaml del modello di pipeline, tuttavia ho dovuto configurare un parametro all'interno del modello e chiamare la variabile utilizzando la sintassi dell'espressione del modello.
...
...
stages:
- stage: Plan
displayName: Terrafom Plan
jobs:
- job: DEV PLAN
displayName: Plan (DEV)
pool:
vmImage: "ubuntu-latest"
variables:
az_service_connection: "MyServiceConnection"
tf_environment: "DEV"
tf_state_rg: "DEV"
tz_state_location: "canadacentral"
tf_state_stgacct_name: "mystorageaccuontname1231231"
tf_state_container_name: "tfstate"
steps:
- template: templates/terraform-plan.yml
parameters:
az_service_connection: ${{ variables.az_service_connection }}
...
...
steps:
- task: terraformInstaller@0
displayName: "Install Terraform $(tf_version)"
inputs:
terraformVersion: $(tf_version) - task: TerraformTaskV1@0 displayName: "Run > terraform init" inputs: command: "init" commandOptions: "-input=false" backendServiceArm: ${{ parameters.az_service_connection }}
...
...
Credo che il motivo per cui funziona è perché la sintassi dell'espressione del modello ${{ variables.varname}}valuta in fase di compilazione rispetto al runtime. Se non lo facessi in questo modo, verrei $(az_service_connection)passato backendServiceArmnell'input o un valore vuoto.
Con l'introduzione dei gruppi di variabili, ora sto affrontando un comportamento simile. Mi aspetto che il gruppo di variabili valuti dopo la variabile dell'espressione del modello che fa sì ${{ variables.az_service_connection }}che abbia un valore vuoto. Non sono sicuro di come farlo funzionare.
Come posso utilizzare i gruppi di variabili con un modello di pipeline che utilizza una connessione di servizio?
Risposte
Ho usato la $()sintassi per passare la connessione arm al modello:
File modello:
parameters:
- name: 'instances'
type: object
default: {}
- name: 'server'
type: string
default: ''
- name: 'armConnection'
type: string
default: ''
steps:
- task: TerraformTaskV1@0
inputs:
provider: 'azurerm'
command: 'init'
backendServiceArm: '${{ parameters.armConnection }}'
backendAzureRmResourceGroupName: 'TheCodeManual'
backendAzureRmStorageAccountName: 'thecodemanual'
backendAzureRmContainerName: 'infra'
backendAzureRmKey: 'some-terrform'
- ${{ each instance in parameters.instances }}: - script: echo ${{ parameters.server }}:${{ instance }}
File principale:
trigger:
branches:
include:
- master
paths:
include:
- stackoverflow/09-array-parameter-for-template/*
# no PR triggers
pr: none
pool:
vmImage: 'ubuntu-latest'
variables:
- group: my-variable-group
- name: my-passed-variable
value: $[variables.myhello] # uses runtime expression
steps:
- template: template.yaml
parameters:
instances:
- test1
- test2
server: $(myhello) armConnection: $(armConnection)
Nota: il gruppo my-variable-groupcontiene una armConnectionvariabile