Azure Terraform(九)利用 Azure DevOps Pipeline 的审批来控制流程发布
一,引言
Azure Pipeline 管道是一个自动化过程;但是往往我们由于某种原因,需要在多个阶段之前获得批准之后再继续下一步流程,所以我们可以向Azure Pipeline 管道添加审批!批准流程可帮助我们进一步控制自己的管道;我们可以控制管道内特定阶段的 Step 开始,通过审批,并决定 Azure Pipeline 管道何时完成。
而至于为什么要添加审批流程,是因为基础设施资源的部署是需要进行评估,慎重操作。有了审批,可以查看前一阶段以确认配置代码是否正确。
--------------------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 的审批来控制流程发布
二,正文
1,Azure DevOps 创建新的项目
登录 Azure DevOps 的地址:https://www.dev.azure.com ,点击 “+ New project” 创建新的项目
输入项目描述等信息
Project name:“Terraform_CnBateBlogWeb_AutoDeploy”
Visibility 选择:“Private” ----- (根据现有项目进行设置)
Version control 选择 “Git”
Work item process:“Agile”
确认完以上信息,点击 “Create” 进行创建。
2,配置Azure DevOps 审批
选择左侧菜单 ”Pipelines =》Environments“,点击 ”Create environment“ 创建环境
输入配置以下参数
Name:”Approve_AutoDeploy"
Resoure 选择:“None” (默认即可)
点击 “Create” 创建环境
接下来为当前 “Approve_AutoDeploy” 环境创建审批
点击红色箭头所指,选择 “Approve and checks” 添加审批请求
选择 "Approvals" ,并将自己设置为申请人
添加完成后,可看到类型为 “Approvals” 的记录,大家需要注意的是,审批的过期时间默认是 “30天”,大家可以根据实际情况更改。
3,配置 Azure DevOps Pipeline
选择左侧菜单 “Pipelines”,点击 “Create Pipeline“ 创建 管道作业
今天不使用经典编辑器模式,而选择 GitHub (yaml)
选择对应的 TF Code 的代码仓库
选择 “Start Pipeline” 开启新的管道构建部署代码
Azure DevOps 会为我们自动在项目根目录生成一个名称叫 “azure-pipelines.yaml” 的文件,我们将定义好的管道步骤添加到该文件中
管道步骤审批 yaml 示例代码
jobs:
- deployment: terraform_apply
continueOnError: false
environment: 'Approve_Production'
timeoutInMinutes: 120
strategy:
runOnce:
deploy:
steps:
注意:我将在 terraform_apply 阶段之前添加一个申请请求
红色标记是需要改成自己Azure的订阅,
橙色标记是需要添加的变量:
1,管道变量:tf_version
2,秘密变量:terraform_rg,storage_account,storage_account_container,container_key,keyvault,keyvault_sc
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 variables:
13 - name: tf_version
14 value: 'latest'
15
16 stages:
17 - stage: script
18 jobs:
19 - job: azure_cli_script
20 steps:
21 - task: AzureCLI@2
22 displayName: 'Azure CLI :Create Storage Account,Key Vault And Set KeyVault Secret'
23 inputs:
24 azureSubscription: 'Microsoft Azure Subscription(XXXX-XXX-XX-XX-XXX)'
25 scriptType: 'bash'
26 scriptLocation: 'inlineScript'
27 inlineScript: |
28 # create azure resource group
29 az group create --location eastasia --name $(terraform_rg)
30
31 # create azure storage account
32 az storage account create --name $(storage_account) --resource-group $(terraform_rg) --location eastasia --sku Standard_LRS
33
34 # create storage account container for tf state
35 az storage container create --name $(storage_account_container) --account-name $(storage_account)
36
37 # query storage key and set variable
38 ACCOUNT_KEY=$(az storage account keys list --resource-group $(terraform_rg) --account-name $(storage_account) --query "[?keyName == 'key1'][value]" --output tsv)
39
40 # create azure keyvault
41 az keyvault create --name $(keyvault) --resource-group $(terraform_rg) --location eastasia --enable-soft-delete false
42
43 # set keyvault secret,secret value is ACCOUNT_KEY
44 az keyvault secret set --name $(keyvault_sc) --vault-name $(keyvault) --value $ACCOUNT_KEY
45
46 - task: AzureKeyVault@2
47 displayName: 'Azure Key Vault :Get Storage Access Secret'
48 inputs:
49 azureSubscription: 'Microsoft Azure Subscription(XXXX-XXX-XX-XX-XXX)'
50 KeyVaultName: '$(keyvault)'
51 SecretsFilter: 'terraform-stste-storage-key'
52 RunAsPreJob: false
53
54 - stage: terraform_validate
55 jobs:
56 - job: terraform_validate
57 steps:
58 - task: TerraformInstaller@0
59 inputs:
60 terraformVersion: ${{variables.tf_version}}
61 - task: TerraformTaskV2@2
62 displayName: 'terraform init'
63 inputs:
64 provider: 'azurerm'
65 command: 'init'
66 # commandOptions: '-backend-config="access_key=$(terraform-stste-storage-key)"'
67 backendServiceArm: 'Microsoft Azure Subscription(XXXX-XXX-XX-XX-XXX)'
68 backendAzureRmResourceGroupName: $(terraform_rg)
69 backendAzureRmStorageAccountName: $(storage_account)
70 backendAzureRmContainerName: $(storage_account_container)
71 backendAzureRmKey: $(container_key)
72 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
73 - task: TerraformTaskV2@2
74 inputs:
75 provider: 'azurerm'
76 command: 'validate'
77 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
78
79 - stage: terraform_plan
80 dependsOn: [terraform_validate]
81 condition: succeeded('terraform_validate')
82 jobs:
83 - job: terraform_plan
84 steps:
85 - task: TerraformInstaller@0
86 inputs:
87 terraformVersion: ${{ variables.tf_version }}
88 - task: TerraformTaskV2@2
89 displayName: 'terraform init'
90 inputs:
91 provider: 'azurerm'
92 command: 'init'
93 # commandOptions: '-backend-config="access_key=$(terraform-stste-storage-key)"'
94 backendServiceArm: 'Microsoft Azure Subscription(XXXX-XXX-XX-XX-XXX)'
95 backendAzureRmResourceGroupName: $(terraform_rg)
96 backendAzureRmStorageAccountName: $(storage_account)
97 backendAzureRmContainerName: $(storage_account_container)
98 backendAzureRmKey: $(container_key)
99 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
100 - task: TerraformTaskV2@2
101 inputs:
102 provider: 'azurerm'
103 command: 'plan'
104 environmentServiceNameAzureRM: 'Microsoft Azure Subscription(XXXX-XXX-XX-XX-XXX)'
105 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
106
107 - stage: terraform_apply
108 dependsOn: [terraform_plan]
109 condition: succeeded('terraform_plan')
110 jobs:
111 - deployment: terraform_apply
112 continueOnError: false
113 environment: 'Approve_Production'
114 timeoutInMinutes: 120
115 strategy:
116 runOnce:
117 deploy:
118 steps:
119 - checkout: self
120 - task: TerraformInstaller@0
121 inputs:
122 terraformVersion: ${{ variables.tf_version }}
123 - task: TerraformTaskV2@2
124 displayName: 'terraform init'
125 inputs:
126 provider: 'azurerm'
127 command: 'init'
128 # commandOptions: '-backend-config="access_key=$(terraform-stste-storage-key)"'
129 backendServiceArm: 'Microsoft Azure Subscrription(XXXX-XXX-XX-XX-XXX)'
130 backendAzureRmResourceGroupName: $(terraform_rg)
131 backendAzureRmStorageAccountName: $(storage_account)
132 backendAzureRmContainerName: $(storage_account_container)
133 backendAzureRmKey: $(container_key)
134 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
135 - task: TerraformTaskV2@2
136 inputs:
137 provider: 'azurerm'
138 command: 'plan'
139 environmentServiceNameAzureRM: 'Microsoft Azure Subscription(XXXX-XXX-XX-XX-XXX)'
140 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
141 - task: TerraformTaskV2@2
142 inputs:
143 provider: 'azurerm'
144 command: 'apply'
145 commandOptions: '-auto-approve'
146 environmentServiceNameAzureRM: 'Microsoft Azure Subscription(XXXX-XXX-XX-XX-XXX)'
147 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
148
149 # - stage: terraform_apply
150 # dependsOn: [terraform_plan]
151 # condition: succeeded('terraform_plan')
152 # jobs:
153 # - job: terraform_apply
154 # steps:
155 # - task: TerraformInstaller@0
156 # inputs:
157 # terraformVersion: ${{ variables.tf_version }}
158 # - task: TerraformTaskV2@2
159 # displayName: 'terraform init'
160 # inputs:
161 # provider: 'azurerm'
162 # command: 'init'
163 # # commandOptions: '-backend-config="access_key=$(terraform-stste-storage-key)"'
164 # backendServiceArm: 'Microsoft Azure Subscription(XXXX-XXX-XX-XX-XXX)'
165 # backendAzureRmResourceGroupName: $(terraform_rg)
166 # backendAzureRmStorageAccountName: $(storage_account)
167 # backendAzureRmContainerName: $(storage_account_container)
168 # backendAzureRmKey: $(container_key)
169 # workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
170 # - task: TerraformTaskV2@2
171 # inputs:
172 # provider: 'azurerm'
173 # command: 'plan'
174 # environmentServiceNameAzureRM: 'Microsoft Azure Subscription(XXXX-XXX-XX-XX-XXX)'
175 # workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
176 # - task: TerraformTaskV2@2
177 # inputs:
178 # provider: 'azurerm'
179 # command: 'apply'
180 # commandOptions: '-auto-approve'
181 # environmentServiceNameAzureRM: 'Microsoft Azure Subscription(XXXX-XXX-XX-XX-XXX)'
182 # workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
183
184 - stage: terraform_destroy
185 dependsOn: [terraform_apply]
186 condition: succeeded('terraform_apply')
187 jobs:
188 - job: terraform_destroy
189 steps:
190 - task: TerraformInstaller@0
191 inputs:
192 terraformVersion: ${{ variables.tf_version }}
193 - task: TerraformTaskV2@2
194 displayName: 'terraform init'
195 inputs:
196 provider: 'azurerm'
197 command: 'init'
198 # commandOptions: '-backend-config="access_key=$(terraform-stste-storage-key)"'
199 backendServiceArm: 'Microsoft Azure Subscription(XXXX-XXX-XX-XX-XXX)'
200 backendAzureRmResourceGroupName: $(terraform_rg)
201 backendAzureRmStorageAccountName: $(storage_account)
202 backendAzureRmContainerName: $(storage_account_container)
203 backendAzureRmKey: $(container_key)
204 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
205 - task: TerraformTaskV2@2
206 inputs:
207 provider: 'azurerm'
208 command: 'plan'
209 environmentServiceNameAzureRM: 'Microsoft Azure Subscription(XXXX-XXX-XX-XX-XXX)'
210 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
211 - task: TerraformTaskV2@2
212 inputs:
213 provider: 'azurerm'
214 command: 'destroy'
215 commandOptions: '-auto-approve'
216 environmentServiceNameAzureRM: 'Microsoft Azure Subscription(XXXX-XXX-XX-XX-XXX)'
217 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'
添加秘密变量,点击 “ Variables=》New variable”
输入机密的名称和值
Name:“terraform_rg”
Value:“Web_Test_TF_RG”
点击 “OK” 确认添加操作
按照以上方式一次添加以下机密信息
terraform_rg:"Web_Test_TF_RG"
storage_account:"cnbatetfstorage"
storage_account_container:"tf-state001"
container_key:"cnbate.tf.stats"
keyvault:"cnbate-terraform-kv001"
keyvault_sc:"terraform-stste-storage-key"
完成以上信息后,点击 ”Run” 手动触发当前 Pipeline
选择分支 ‘“remote_stats”,点击 “Run”
接下来我们就会看到整个流程步骤,以及当前运行运行的步骤,如果需要审批,流程就会暂停,等待审批完成后,再执行后续操作
点击 “Approve” 同意审批,进行下一步执行 TF Code 执行部署计划
OK,成功!!!部署完成。是ヾ(≧▽≦*)o
三,结尾
对于今天实验的操作,大家可以多多练习,参考作者的 github 仓库。今天的内容需要在Azure DevOps 上进行操作的,大家要多加练习。至于 Terraform 代码方面没有过多的讲解,主要是因为结合之前部署Azure 资源,大家都会Terraform 有了一定的理解了。所以大家可以自行下载,进行分析修改。
参考资料: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 Pipeline 的审批来控制流程发布的更多相关文章
- Azure Terraform(十)利用 Azure DevOps 的条件语句选择发布环境
一,引言 之前我讲过的所有的案例中,都是将整个Azure Resource 部署到同一个订阅下,没有做到灵活的在 Azure Pipeline 在运行前选择需要部署的环境.在实际的项目开发中,我们也会 ...
- 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 DevOps(二)利用Azure DevOps Pipeline 构建基础设施资源
一,引言 上一篇文章记录了利用 Azure DevOps 跨云进行构建 Docker images,并且将构建好的 Docker Images 推送到 AWS 的 ECR 中.今天我们继续讲解 Azu ...
- Azure Terraform(十一)Azure DevOps Pipeline 内的动态临时变量的使用
思路浅析 在我们分析的 Azure Terraform 系列文中有介绍到关于 Terraform 的状态文件远程存储的问题,我们在 Azure DevOps Pipeline 的 Task Job ...
- Azure App Service(一)利用Azure DevOps Pipeline 构建镜像,部署应用程序
一,引言 起因是前两天项目上做测试,需要我把写好的基于.NET 5 的 Web 测试程序作成 Docker 镜像.当我在本地验证完功能后,准备利用 Docker 构建应用程序镜像的时候,发现系统不支持 ...
- Azure DevOps(一)利用Azure DevOps Pipeline 构建应用程序镜像到AWS ECR
一,引言 最近项目上让开始学习AWS,作为一名合格的开发人员,当然也是学会利用Azure DevOps Pipeline 将应用程序部署到 AWS ECS(完全托管的容器编排服务).我们要学会将应用程 ...
- 利用 Azure Devops 创建和发布 Nuget 包
利用 Azure Devops 创建和发布 Nuget 包 原 Visual Studio Team Service ,简称 VSTS,能够创建 pipelines 管道以构建应用程序,并将其部署到任 ...
随机推荐
- Charles ios设备抓包
在Mac下做开发,用Fiddler抓包由于离不开Windows比较痛苦,还好有Charles,到官网http://www.charlesproxy.com/可下载到最新版本(若不支持rMBP可拖到Re ...
- pf4j及pf4j-spring
什么是PF4J 一个插件框架,用于实现插件的动态加载,支持的插件格式(zip.jar). 核心组件 Plugin:是所有插件类型的基类.每个插件都被加载到一个单独的类加载器中以避免冲突. Plugin ...
- 『学了就忘』Linux系统管理 — 86、查看系统资源相关命令
目录 1.vmstat命令 2.dmesg命令 3.free命令 4.查看CPU信息 5.查看本机登陆用户信息 (1)w命令 (2)who命令 6.uptime命令 7.查看系统与内核相关信息 1.v ...
- CF981B Businessmen Problems 题解
Content 有一个长度为 \(n\) 的序列和长度为 \(m\) 的序列,两个序列中的元素都有一个编号 \(num\) 和一个值 \(val\),且同一个序列的元素之间的编号互不相同.现在从这两个 ...
- 通过一道简单的例题了解Linux内核PWN
写在前面 这篇文章目的在于简单介绍内核PWN题,揭开内核的神秘面纱.背后的知识点包含Linux驱动和内核源码,学习路线非常陡峭.也就是说,会一道Linux内核PWN需要非常多的铺垫知识,如果要学习可以 ...
- [转]详细ADB使用大全
原文链接:https://github.com/mzlogin/awesome-adb ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也 ...
- 【LeetCode】1079. Letter Tile Possibilities 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 回溯 日期 题目地址:https://leetcode ...
- 【LeetCode】851. Loud and Rich 解题报告(Python)
[LeetCode]851. Loud and Rich 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http:// ...
- 【LeetCode】498. Diagonal Traverse 解题报告(Python)
[LeetCode]498. Diagonal Traverse 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: htt ...
- 【LeetCode】109. Convert Sorted List to Binary Search Tree 解题报告(Python)
[LeetCode]109. Convert Sorted List to Binary Search Tree 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id ...