Azure Terraform(十)利用 Azure DevOps 的条件语句选择发布环境
一,引言
之前我讲过的所有的案例中,都是将整个Azure Resource 部署到同一个订阅下,没有做到灵活的在 Azure Pipeline 在运行前选择需要部署的环境。在实际的项目开发中,我们也会遇到将这些基础设施资源验证完成后,分别部署到 DEV,UAT,PRD 等多个环境 。那么我们就带着个整个问题开始今天的分析。
--------------------Azure Terraform 系列--------------------
1,Azure Terraform(一)入门简介
2,Azure Terraform(二)语法详解
3,Azure Terraform(三)部署 Web 应用程序
4,Azure Terraform(四)状态文件存储
5,Azure Terraform(五)利用Azure DevOps 实现自动化部署基础资源
6,Azure Terraform(六)Common Module
7,Azure Terraform(七)利用Azure DevOps 实现自动化部署基础资源(补充)
8,Azure Terraform(八)利用Azure DevOps 实现Infra资源和.NET CORE Web 应用程序的持续集成、持续部署
9,Azure Terraform(九)利用 Azure DevOps Pipeline 的审批来控制流程发布
10,Azure Terraform(十)利用 Azure DevOps 的条件语句选择发布环境
二,正文
1,Azure DevOps Pipeline 中的条件语句
首先我们需要先定义参数,以便在 Pipeline 运行的时候进行选择哪个环境
parameters:
- name: deployEnv
displayName: Select a Deployment Environment???
type: string
default: 'dev'
values:
- dev
- uat
- prd
接下来设置条件语句的变量的值可以根据 “deployEnv” 的值变化
variables:
- name: tf_version
value: 'latest'
- name: env_name
${{ if eq(parameters['deployEnv'],'dev') }}:
value: 'dev'
${{elseif eq(parameters['DeployEnv'],'uat') }}:
value: 'uat'
${{elseif eq(parameters['DeployEnv'],'prd') }}:
value: 'prd'
以上两段代码我们不难看出,veriables.env_name 的值取决于 parameters.deployEnv 的值,再经过条件语句的过滤,重新赋值
复制以上两段代码到 azure-pipelines.yml 中

azure-pipeline.yml 完整代码
1 # Starter pipeline
2 # Start with a minimal pipeline that you can customize to build and deploy your code.
3 # Add steps that build, run tests, deploy, and more:
4 # https://aka.ms/yaml
5
6 trigger:
7 - remote_stats
8
9 pool:
10 vmImage: ubuntu-latest
11
12 parameters:
13 - name: deployEnv
14 displayName: Selecting a Deployment Environment???
15 type: string
16 default: 'dev'
17 values:
18 - dev
19 - uat
20 - prd
21
22 variables:
23 - name: tf_version
24 value: 'latest'
25 - name: env_name
26 ${{ if eq(parameters['deployEnv'],'dev') }}:
27 value: 'dev'
28 ${{elseif eq(parameters['DeployEnv'],'uat') }}:
29 value: 'uat'
30 ${{elseif eq(parameters['DeployEnv'],'prd') }}:
31 value: 'prd'
32
33 stages:
34 - stage: script
35 jobs:
36 - job: azure_cli_script
37 steps:
38 - task: AzureCLI@2
39 displayName: 'Azure CLI :Create Storage Account,Key Vault And Set KeyVault Secret'
40 inputs:
41 azureSubscription: 'Microsoft Azure Subscription(xxxx-xxx-xxx-xxxx)'
42 scriptType: 'bash'
43 scriptLocation: 'inlineScript'
44 inlineScript: |
45 # create azure resource group
46 az group create --location eastasia --name $(terraform_rg)
47
48 # create azure storage account
49 az storage account create --name $(storage_account) --resource-group $(terraform_rg) --location eastasia --sku Standard_LRS
50
51 # create storage account container for tf state
52 az storage container create --name $(storage_account_container) --account-name $(storage_account)
53
54 # query storage key and set variable
55 ACCOUNT_KEY=$(az storage account keys list --resource-group $(terraform_rg) --account-name $(storage_account) --query "[?keyName == 'key1'][value]" --output tsv)
56
57 # create azure keyvault
58 az keyvault create --name $(keyvault) --resource-group $(terraform_rg) --location eastasia --enable-soft-delete false
59
60 # set keyvault secret,secret value is ACCOUNT_KEY
61 az keyvault secret set --name $(keyvault_sc) --vault-name $(keyvault) --value $ACCOUNT_KEY
62
63 - task: AzureKeyVault@2
64 displayName: 'Azure Key Vault :Get Storage Access Secret'
65 inputs:
66 azureSubscription: 'Microsoft Azure Subscription(xxxx-xxx-xxx-xxxx)'
67 KeyVaultName: '$(keyvault)'
68 SecretsFilter: 'terraform-stste-storage-key'
69 RunAsPreJob: false
70
71 - stage: terraform_validate
72 jobs:
73 - job: terraform_validate
74 steps:
75 - task: TerraformInstaller@0
76 inputs:
77 terraformVersion: ${{variables.tf_version}}
78 - task: TerraformTaskV2@2
79 displayName: 'terraform init'
80 inputs:
81 provider: 'azurerm'
82 command: 'init'
83 # commandOptions: '-backend-config="access_key=$(terraform-stste-storage-key)"'
84 backendServiceArm: 'Microsoft Azure Subscription(xxxx-xxx-xxx-xxxx)'
85 backendAzureRmResourceGroupName: $(terraform_rg)
86 backendAzureRmStorageAccountName: $(storage_account)
87 backendAzureRmContainerName: $(storage_account_container)
88 backendAzureRmKey: $(container_key)
89 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
90 - task: TerraformTaskV2@2
91 inputs:
92 provider: 'azurerm'
93 command: 'validate'
94 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
95
96 - stage: terraform_plan
97 dependsOn: [terraform_validate]
98 condition: succeeded('terraform_validate')
99 jobs:
100 - job: terraform_plan
101 steps:
102 - task: TerraformInstaller@0
103 inputs:
104 terraformVersion: ${{ variables.tf_version }}
105 - task: TerraformTaskV2@2
106 displayName: 'terraform init'
107 inputs:
108 provider: 'azurerm'
109 command: 'init'
110 # commandOptions: '-backend-config="access_key=$(terraform-stste-storage-key)"'
111 backendServiceArm: 'Microsoft Azure Subscription(xxxx-xxx-xxx-xxxx)'
112 backendAzureRmResourceGroupName: $(terraform_rg)
113 backendAzureRmStorageAccountName: $(storage_account)
114 backendAzureRmContainerName: $(storage_account_container)
115 backendAzureRmKey: $(container_key)
116 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
117 - task: TerraformTaskV2@2
118 inputs:
119 provider: 'azurerm'
120 command: 'plan'
121 environmentServiceNameAzureRM: 'Microsoft Azure Subscription(xxxx-xxx-xxx-xxxx)'
122 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
123
124 - stage: terraform_apply
125 dependsOn: [terraform_plan]
126 condition: succeeded('terraform_plan')
127 jobs:
128 - deployment: terraform_apply
129 continueOnError: false
130 environment: 'Approve_Production'
131 timeoutInMinutes: 120
132 strategy:
133 runOnce:
134 deploy:
135 steps:
136 - checkout: self
137 - task: TerraformInstaller@0
138 inputs:
139 terraformVersion: ${{ variables.tf_version }}
140 - task: TerraformTaskV2@2
141 displayName: 'terraform init'
142 inputs:
143 provider: 'azurerm'
144 command: 'init'
145 # commandOptions: '-backend-config="access_key=$(terraform-stste-storage-key)"'
146 backendServiceArm: 'Microsoft Azure Subscription(xxxx-xxx-xxx-xxxx)'
147 backendAzureRmResourceGroupName: $(terraform_rg)
148 backendAzureRmStorageAccountName: $(storage_account)
149 backendAzureRmContainerName: $(storage_account_container)
150 backendAzureRmKey: $(container_key)
151 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
152 - task: TerraformTaskV2@2
153 inputs:
154 provider: 'azurerm'
155 command: 'plan'
156 environmentServiceNameAzureRM: 'Microsoft Azure Subscription(xxxx-xxx-xxx-xxxx)'
157 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
158 - task: TerraformTaskV2@2
159 inputs:
160 provider: 'azurerm'
161 command: 'apply'
162 commandOptions: '-auto-approve'
163 environmentServiceNameAzureRM: 'Microsoft Azure Subscription(xxxx-xxx-xxx-xxxx)'
164 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
165
166 # - stage: terraform_apply
167 # dependsOn: [terraform_plan]
168 # condition: succeeded('terraform_plan')
169 # jobs:
170 # - job: terraform_apply
171 # steps:
172 # - task: TerraformInstaller@0
173 # inputs:
174 # terraformVersion: ${{ variables.tf_version }}
175 # - task: TerraformTaskV2@2
176 # displayName: 'terraform init'
177 # inputs:
178 # provider: 'azurerm'
179 # command: 'init'
180 # # commandOptions: '-backend-config="access_key=$(terraform-stste-storage-key)"'
181 # backendServiceArm: 'Microsoft Azure Subscription(xxxx-xxx-xxx-xxxx)'
182 # backendAzureRmResourceGroupName: $(terraform_rg)
183 # backendAzureRmStorageAccountName: $(storage_account)
184 # backendAzureRmContainerName: $(storage_account_container)
185 # backendAzureRmKey: $(container_key)
186 # workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
187 # - task: TerraformTaskV2@2
188 # inputs:
189 # provider: 'azurerm'
190 # command: 'plan'
191 # environmentServiceNameAzureRM: 'Microsoft Azure Subscription(xxxx-xxx-xxx-xxxx)'
192 # workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
193 # - task: TerraformTaskV2@2
194 # inputs:
195 # provider: 'azurerm'
196 # command: 'apply'
197 # commandOptions: '-auto-approve'
198 # environmentServiceNameAzureRM: 'Microsoft Azure Subscription(xxxx-xxx-xxx-xxxx)'
199 # workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
200
201 - stage: terraform_destroy
202 dependsOn: [terraform_apply]
203 condition: succeeded('terraform_apply')
204 jobs:
205 - job: terraform_destroy
206 steps:
207 - task: TerraformInstaller@0
208 inputs:
209 terraformVersion: ${{ variables.tf_version }}
210 - task: TerraformTaskV2@2
211 displayName: 'terraform init'
212 inputs:
213 provider: 'azurerm'
214 command: 'init'
215 # commandOptions: '-backend-config="access_key=$(terraform-stste-storage-key)"'
216 backendServiceArm: 'Microsoft Azure Subscription(xxxx-xxx-xxx-xxxx)'
217 backendAzureRmResourceGroupName: $(terraform_rg)
218 backendAzureRmStorageAccountName: $(storage_account)
219 backendAzureRmContainerName: $(storage_account_container)
220 backendAzureRmKey: $(container_key)
221 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
222 - task: TerraformTaskV2@2
223 inputs:
224 provider: 'azurerm'
225 command: 'plan'
226 environmentServiceNameAzureRM: 'Microsoft Azure Subscription(xxxx-xxx-xxx-xxxx)'
227 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
228 - task: TerraformTaskV2@2
229 inputs:
230 provider: 'azurerm'
231 command: 'destroy'
232 commandOptions: '-auto-approve'
233 environmentServiceNameAzureRM: 'Microsoft Azure Subscription(xxxx-xxx-xxx-xxxx)'
234 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
2,Azure Pipeline 条件语句运行效果
保存完 yml 文件后,点击 ”Run“,手动触发 Pipeline 管道

可以看到除了默认 Run pipeline 的默认分支,还需要选择我们自定义的 Parameters-----"deployEnv"

bingo !! 我们的目的已经达到了。通过这种条件语句的判定,我们就可以做一些部署变量的替换,从而达到部署不同环境的目的了。
三,结尾
以上内容,大家多做做练习。下一篇,我们继续介绍多环境部署Azure Pipeline
参考资料:Terraform 官方,Azure Pipeline 文档
Terraform_Cnbate_Traffic_Manager github Address:https://github.com/yunqian44/Terraform_Cnbate_Traffic_Manager
欢迎大家关注博主的博客:https://allenmasters.com/
作者:Allen
版权:转载请在文章明显位置注明作者及出处。如发现错误,欢迎批评指正。
Azure Terraform(十)利用 Azure DevOps 的条件语句选择发布环境的更多相关文章
- python流程控制-条件语句If,while循环
一.If,条件语句-选择 格式:python简洁优美,注意缩进 1.第一种: if 条件: 四个空格(tab键) 满足条件时的执行步骤 if 5>4 : print(666) print(77 ...
- Azure Terraform(五)利用Azure DevOps 实现自动化部署基础资源
一,引言 上一篇我们结合学习 Azure Traffic Manger 的内容,做了一个负载均衡的基础设施架构.通过 Terraform 部署执行计划,将整个 Azure Traffic Manage ...
- Azure Terraform(七)利用Azure DevOps 实现自动化部署基础资源(补充)
一,引言 之前一篇文章有讲解到利用 利用Azure DevOps 实现自动化部署基础资源,当时 TF 代码没有针对 Azure 各个资源的封装,所有的资源代码全部写在一个 main.tf 文件中.然后 ...
- Azure Terraform(八)利用Azure DevOps 实现Infra资源和.NET CORE Web 应用程序的持续集成、持续部署
一,引言 上一篇讲解到利用 Azure DevOps 将整个 Azure Web App,Azure Traffic Manager profile,Azure Storage Account,Azu ...
- Azure Terraform(九)利用 Azure DevOps Pipeline 的审批来控制流程发布
一,引言 Azure Pipeline 管道是一个自动化过程:但是往往我们由于某种原因,需要在多个阶段之前获得批准之后再继续下一步流程,所以我们可以向Azure Pipeline 管道添加审批!批准流 ...
- Azure DevOps(二)利用Azure DevOps Pipeline 构建基础设施资源
一,引言 上一篇文章记录了利用 Azure DevOps 跨云进行构建 Docker images,并且将构建好的 Docker Images 推送到 AWS 的 ECR 中.今天我们继续讲解 Azu ...
- Azure DevOps(一)利用Azure DevOps Pipeline 构建应用程序镜像到AWS ECR
一,引言 最近项目上让开始学习AWS,作为一名合格的开发人员,当然也是学会利用Azure DevOps Pipeline 将应用程序部署到 AWS ECS(完全托管的容器编排服务).我们要学会将应用程 ...
- Azure Terraform(十一)Azure DevOps Pipeline 内的动态临时变量的使用
思路浅析 在我们分析的 Azure Terraform 系列文中有介绍到关于 Terraform 的状态文件远程存储的问题,我们在 Azure DevOps Pipeline 的 Task Job ...
- 利用 Azure Devops 创建和发布 Nuget 包
利用 Azure Devops 创建和发布 Nuget 包 原 Visual Studio Team Service ,简称 VSTS,能够创建 pipelines 管道以构建应用程序,并将其部署到任 ...
随机推荐
- JAVA根据URL生成二维码图片、根据路径生成二维码图片
引入jar包 zxing-2.3.0.jar.IKAnalyzer2012_u6.jar 下载地址:https://yvioo.lanzous.com/b00nlbp6h ...
- UDP&串口调试助手用法(5)
note 提供安装包 基于win10开发 已通过win10测试,windows其他平台,没有测试 日志 2021-09-18 1.修复计算校验和错误的现象 2.屏蔽不计算校验和位置的REG验证(后期更 ...
- 【九度OJ】题目1163:素数 解题报告
[九度OJ]题目1163:素数 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1163 题目描述: 输入一个整数n(2< ...
- 前端性能和加载体验优化实践(附:PWA、离线包、内存优化、预渲染)
一.背景:页面为何会卡? 1.1 等待时间长(性能) 项目本身包/第三方脚本比较大. JavaScript 执行阻塞页面加载. 图片体积大且多. 特别是对于首屏资源加载中的白屏时间,用户等待的时间就越 ...
- C++判断月份天数(判断闰年)
题目描述 输入年份和月份,输出这一年的这一月有多少天.需要考虑闰年. 输入格式 无 输出格式 无 输入输出样例 输入 #1 输出 #1 1926 8 31 输入 #2 输出 #2 2000 2 29 ...
- Missing Data in Kernel PCA
目录 引 主要内容 关于缺失数据的导数 附录 极大似然估计 代码 Sanguinetti G, Lawrence N D. Missing data in kernel PCA[J]. europea ...
- TensorFlow.NET机器学习入门【7】采用卷积神经网络(CNN)处理Fashion-MNIST
本文将介绍如何采用卷积神经网络(CNN)来处理Fashion-MNIST数据集. 程序流程如下: 1.准备样本数据 2.构建卷积神经网络模型 3.网络学习(训练) 4.消费.测试 除了网络模型的构建, ...
- Java面向对象笔记 • 【第4章 抽象类和接口】
全部章节 >>>> 本章目录 4.1 抽象类 4.1.1 抽象方法和抽象类 4.1.2 抽象类的作用 4.1.3 实践练习 4.2 final修饰符 4.2.1 final ...
- WPF 使用 Silk.NET 进行 DirectX 渲染入门
本文告诉大家如何使用 dotnet 基金会新开源的 Silk.NET 库调用 DirectX 进行渲染的方法.此库是对 DirectX 的底层基础封装,用上了 dotnet 和 C# 的各个新特性,相 ...
- SQLAlchemy(十)
ORM操作在实际项目中的应用非常多,涉及到的框架也是根据不同的项目有不同的处理模块,不过操作流程和步骤都是大同小异基本没有什么太大变化,唯一需要注意的就是在实际操作过程中你要使用的ORM框架的处理性能 ...