Azure Terraform(九)利用 Azure DevOps Pipeline 的审批来控制流程发布
Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475
一,引言
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\_applycontinueOnError: falseenvironment: 'Approve\_Production'timeoutInMinutes: 120strategy:runOnce:deploy:steps:
注意:我将在 terraform_apply 阶段之前添加一个申请请求
红色标记是需要改成自己Azure的订阅,
橙色标记是需要添加的变量:
**1,管道变量:**tf_version
**2,秘密变量:****terraform_rg,**storage_account,storage_account_container,container_key,keyvault,keyvault_sc
1 # Starter pipeline2 # 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/yaml5 6 trigger:7 - remote\_stats8 9 pool:10 vmImage: ubuntu-latest11 12 **variables**:13 - name: **tf\_version** 14 value: '**latest**'15 16 stages:17 - stage: script18 jobs:19 - job: azure\_cli\_script20 steps: 21 - task: AzureCLI@222 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 group29 az group create --location eastasia --name **$(terraform\_rg)** 30 31 # create azure storage account32 az storage account create --name **$(storage\_account)** --resource-group **$(terraform\_rg)** --location eastasia --sku Standard\_LRS33 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 variable38 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 keyvault41 az keyvault create --name **$(keyvault)** --resource-group **$(terraform\_rg)** --location eastasia --enable-soft-delete false42 43 # set keyvault secret,secret value is ACCOUNT\_KEY44 az keyvault secret set --name **$(keyvault\_sc)** --vault-name **$(keyvault)** --value $ACCOUNT\_KEY45 46 - task: AzureKeyVault@247 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: false53 54 - stage: terraform\_validate55 jobs:56 - job: terraform\_validate57 steps:58 - task: TerraformInstaller@059 inputs:60 terraformVersion: ${{variables.tf\_version}}61 - task: TerraformTaskV2@262 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@274 inputs:75 provider: 'azurerm'76 command: 'validate'77 workingDirectory: '$(System.DefaultWorkingDirectory)/src/model/'78 79 - stage: terraform\_plan80 dependsOn: [terraform\_validate]81 condition: succeeded('terraform\_validate')82 jobs:83 - job: terraform\_plan84 steps:85 - task: TerraformInstaller@086 inputs:87 terraformVersion: ${{ variables.tf\_version }}88 - task: TerraformTaskV2@289 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,成功!!!部署完成。是✨
Azure Terraform(九)利用 Azure DevOps Pipeline 的审批来控制流程发布相关推荐
- Windows Azure Platform (九) Windows Azure Storage Service存储服务
Windows Azure本质上来说就是将你本地的应用程序打包,然后上传到Windows Azure VM进行托管运行. 注意:任何保存在Windows Azure VM盘符的内容都是临时的.非持久化 ...
- 动态临时变量为 Azure DevOps Pipeline 变量自定义锦上添花
大家好,我是本期的微软MVP实验室研究员贠乾.Azure Pipeline 本身已经提供了内置变量.不同于上述方式,今天我将带来如何在 Azure DevOps Pipeline 运行时创建.使用动态 ...
- 利用Azure DevOps建设ExcelBDD的持续集成
在ExcelBDD开源敏捷项目启动了!暨介绍微软Agile+DevOps免费平台-dev.azure.com 一文当中介绍了利用Agile DevOps管理需求. 本文来介绍其中的持续集成建设. 直接 ...
- 使用Azure DevOps Pipeline实现.Net Core程序的CD
上一次我们讲了使用Azure DevOps Pipeline实现.Net Core程序的CI.这次我们来演示下如何使用Azure DevOps实现.Net Core程序的CD. 实现本次目标我们除了A ...
- 使用Azure DevOps Pipeline实现.Net Core程序的CI
上次介绍了Azure Application Insights,实现了.net core程序的监控功能.这次让我们来看看Azure DevOps Pipeline功能.Azure DevOps Pip ...
- 利用Azure Functions和k8s构建Serverless计算平台
题记:昨晚在一个技术社区直播分享了"利用Azure Functions和k8s构建Serverless计算平台"这一话题.整个分享分为4个部分:Serverless概念的介绍.Az ...
- 利用 Azure Functions 实现无服务器体系结构
从工具到机器再到计算机,我们一直在寻找能够自动执行重复工作并让我们所处理的上下文规范化的方法,以便我们可以将重心放在做出高价值的专业化贡献上,从而完成任务并解决问题. 与此同时,很显然,随着 IT 产 ...
- 【Microsoft Azure 的1024种玩法】四十九.在Azure中使用Azure VirtualMachines 搭建Microsoft SharePoint 2016
[简介] SharePoint Server 2016 的设计.开发和测试以 Microsoft 软件即服务 (SaaS) 战略为核心.SharePoint Server 2016 广泛借鉴了该经验, ...
- 【Microsoft Azure 的1024种玩法】五十九.基于Azure云平台快速搭建GitLab应用实现代码托管
[简介] GitLab是由GitLab Inc.开发,一款基于Git的完全整合的软体开发平台,以 Git 作为代码管理工具并实现自托管的 Git 项目仓库,本篇文章主要介绍如何在Azure Virtu ...
最新文章
- java js关键字_js中的instanceof关键字
- 漫画:什么是二分查找
- linux ping IP地址与telnet 测试IP端口
- python 矩阵点乘_python相乘矩阵
- 如何判断数组所有数都不等于一个数_【每日算法Day 91】求解数组中出现次数超过1/3的那个数
- 两轮平衡机器人送披萨,旋转跳跃!
- Spark Core(四)用LogQuery的例子来说明Executor是如何运算RDD的算子(转载)
- mongodb 插入一个数组 java_mongodb:推送到数组元素的子数组或添加到数组(如果不存在)...
- 一维条码之code93码的生成和打印
- Flash extractor功能介绍
- Tetris(初学Java第六篇)
- Fortran编程(VScode配置)——笔记2
- oracle重复数据取只一条,oracle 一个表多条重复记录只取一条的解决方法
- Python3.x 标准模块库目录(下篇)
- 用 shader effect 实现雨滴落水效果!Cocos Creator 3D !
- 机器视觉工程师应该具备哪些技能?
- ERD Online 4.1.0对接ChatGPT,实现AI建模、SQL自由
- 自动驾驶|马斯克推特宣布特斯拉全自动驾驶选项下月再涨1000美元
- 汕头大学计算机考研难度,汕头大学考研难吗?一般要什么水平才可以进入?
- 燕国胜国际会议英文介绍翻译
热门文章
- c# 清除 html,C#方法清除HTML标记
- 服务器信息为什么会被窃取,还在用Websockets的JavaScript开发人员们,你们可能会被窃听!...
- Möller-Trumbore算法-射线三角形相交算法
- 有趣的python项目_Python几个有趣和特别的小故事
- C++STL剖析(七)—— map和multimap的概念和使用
- 名仕在线袖扣商城!玛诗杜MSKOO_袖扣专家_高档袖扣_袖扣礼品_珐琅袖扣_水晶袖扣_不锈钢袖扣_施华洛世奇袖扣 - Powered by ECShop...
- vs2022,python,找不到 .NETFramework,Version=v4.0 的引用程序集。
- Zigbee-cc2530 笔记---Packet Sniffer 安装与使用
- 拓嘉启远:拼多多物流揽收及时率有效提高怎么做
- 大天使黎明服务器维护,37暗黑大天使7月30日部分区服维护公告-暗黑大天使手机版官网...