我对使用 ADO 创建管道还很陌生,需要一些艺术建议。
我有一个管道,可以在我的“订阅 A”中的 Azure 中创建虚拟机。作为此过程中的一个步骤,我想在我的 DNS 中创建一个“A RECORD”,但我的 DNS 位于“subscription-B”中。
也许最好的方法是拥有一个单独的“DNS 管道”,仅负责创建记录,但从逻辑上讲,单个管道应该能够一次性完成此设置似乎是有意义的。
现在我的 virtual-machine-terraform-yaml 被这样调用:
- task: TerraformCLI@0
displayName: 'Terraform Init'
inputs:
command: init
workingDirectory: '$(System.DefaultWorkingDirectory)/terraform'
backendType: azurerm
backendServiceArm: sc-my-vm-subscription-A
我可以创建第二个 terraform 目录,以及用于 DNS 订阅的第二个服务连接,假设我用于 DNS 工作的 git 存储库和我的 yaml 如下所示:
- task: TerraformCLI@0
displayName: 'Terraform Init'
inputs:
command: init
workingDirectory: '$(System.DefaultWorkingDirectory)/terraform'
backendType: azurerm
backendServiceArm: sc-gypsy-150dev
- task: TerraformCLI@0
displayName: 'Terraform Init'
inputs:
command: init
workingDirectory: '$(System.DefaultWorkingDirectory)/terraform-dns'
backendType: azurerm
backendServiceArm: sc-DNS-subscription-B
这个 Azure 布局适用于我的家庭项目。办公室里的事情要复杂得多。也许有人有一些很棒的 Azure/ADO 家庭实验室蓝图?我试图找到最简单、最干净的布局。感谢您的任何意见。 -斯科特
我一直在各种帖子中寻找,但我发现没有任何内容涵盖这一点。
将 terraform 模板中的资源部署到单个管道中的不同 Azure 订阅中。 以您的场景为例,您的存储库的 2 个文件夹中有 2 个
terraform templates
,我们需要运行
terraform init
(-> terraform validate
-> terraform plan
->) terraform apply
命令两次,每个命令通过设置 workingDirectory
的任务属性,我们可以使用不同的 Azure Resource Manager
服务连接来决定部署的目标订阅。作为优化,如果您购买了多个管道并行作业,您可以考虑通过 2 个代理作业
同时部署两个模板。这是一个示例 YAML 管道供您参考。 图片
trigger: none
pool:
vmImage: ubuntu-latest
variables:
ARMSvcCnnSubA: ARMSvcCnnAutoSub7
backendStateRgA: rg-azstorageaccount
backendStateStorageA: storageaccounta
backendStatecontainerA: containertf
ARMSvcCnnSubB: ARMSvcCnnAutoSub8
backendStateRgB: rg-azstorageaccount
backendStateStorageB: storageaccountb
backendStatecontainerB: containertf
jobs:
- job: TFDeploymentToSubA
steps:
- task: TerraformInstaller@2
inputs:
terraformVersion: 'latest'
displayName: Install Terraform on MS-hosted agent
- task: TerraformCLI@2
inputs:
command: 'init'
workingDirectory: '$(System.DefaultWorkingDirectory)/Terraform-DeployToSubA'
backendType: 'azurerm'
backendServiceArm: '$(ARMSvcCnnSubA)' # Save the backend state file in the storage account from SubA
backendAzureRmResourceGroupName: '$(backendStateRgA)'
backendAzureRmStorageAccountName: '$(backendStateStorageA)'
backendAzureRmContainerName: '$(backendStatecontainerA)'
backendAzureRmKey: 'deploytosuba.tfstate'
allowTelemetryCollection: true
displayName: Terraform init
- task: TerraformCLI@2
inputs:
command: 'validate'
workingDirectory: '$(System.DefaultWorkingDirectory)/Terraform-DeployToSubA'
allowTelemetryCollection: true
displayName: Terraform validate
- task: TerraformCLI@2
inputs:
command: 'plan'
workingDirectory: '$(System.DefaultWorkingDirectory)/Terraform-DeployToSubA'
environmentServiceName: '$(ARMSvcCnnSubA)'
commandOptions: '-input=false -var "RGNAME=subA-rg-tfdemo-$(Build.BuildId)"'
allowTelemetryCollection: true
displayName: Terraform plan
- task: TerraformCLI@2
inputs:
command: 'apply'
workingDirectory: '$(System.DefaultWorkingDirectory)/Terraform-DeployToSubA'
environmentServiceName: '$(ARMSvcCnnSubA)'
commandOptions: '-input=false -var "RGNAME=subA-rg-tfdemo-$(Build.BuildId)"'
allowTelemetryCollection: true
displayName: Terraform apply
- job: TFDeploymentToSubB
steps:
- task: TerraformInstaller@2
inputs:
terraformVersion: 'latest'
displayName: Install Terraform on MS-hosted agent
- task: TerraformCLI@2
inputs:
command: 'init'
workingDirectory: '$(System.DefaultWorkingDirectory)/Terraform-DeployToSubB'
backendType: 'azurerm'
backendServiceArm: '$(ARMSvcCnnSubB)' # Save the backend state file in the storage account from SubA
backendAzureRmResourceGroupName: '$(backendStateRgB)'
backendAzureRmStorageAccountName: '$(backendStateStorageB)'
backendAzureRmContainerName: '$(backendStatecontainerB)'
backendAzureRmKey: 'deploytosubb.tfstate'
allowTelemetryCollection: true
displayName: Terraform init
- task: TerraformCLI@2
inputs:
command: 'validate'
workingDirectory: '$(System.DefaultWorkingDirectory)/Terraform-DeployToSubB'
allowTelemetryCollection: true
displayName: Terraform validate
- task: TerraformCLI@2
inputs:
command: 'plan'
workingDirectory: '$(System.DefaultWorkingDirectory)/Terraform-DeployToSubB'
environmentServiceName: '$(ARMSvcCnnSubB)'
commandOptions: '-input=false -var "RGNAME=subB-rg-tfdemo-$(Build.BuildId)"'
allowTelemetryCollection: true
displayName: Terraform plan
- task: TerraformCLI@2
inputs:
command: 'apply'
workingDirectory: '$(System.DefaultWorkingDirectory)/Terraform-DeployToSubB'
environmentServiceName: '$(ARMSvcCnnSubB)'
commandOptions: '-input=false -var "RGNAME=subB-rg-tfdemo-$(Build.BuildId)"'
allowTelemetryCollection: true
displayName: Terraform apply