Azure Terraform(十一)Azure DevOps Pipeline 内的动态临时变量的使用
思路浅析
在我们分析的 Azure Terraform 系列文中有介绍到关于 Terraform 的状态文件远程存储的问题,我们在 Azure DevOps Pipeline 的 Task Job 加 azure_cli_script 执行内联脚本(该脚本帮我们创建好 Terraform 状态文件存储所在的 Azure Resource Group、 Azure Storage Account、Azure KeyVault 等资源),需要注意的是,内联脚本中有使用动态变量,该变量临时存储 Azure Storage Account 的 Account Key,如下图所示:
本篇文章,我继续带领大家,分析如何在 Azure DevOps Pipeline 运行中创建使用动态临时变量,使用动态临时变量替换 Azure Pipeline 管道变量。
项目整体架构图
Pipeline 变量定义、输出
在此阶段,我们需要利用 azure_cli_script 任务,创建动态临时变量,输出参数,其中最主要的是将动态临时变量输出,Task yaml 如下所示
输出的变量用于同一个 stage,不同 job
- stage: script
jobs:
- job: azure_cli_script
steps:
- task: AzureCLI@2
displayName: 'Azure CLI :Create Storage Account,Key Vault And Set KeyVault Secret'
name: 'output_variable'
inputs:
azureSubscription: 'Microsoft Azure Subscription(xxxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)'
scriptType: 'bash'
addSpnToEnvironment: true
scriptLocation: 'inlineScript'
inlineScript: |
# create azure resource group
az group create --location eastasia --name $(terraform_rg) # create azure storage account
az storage account create --name $(storage_account) --resource-group $(terraform_rg) --location eastasia --sku Standard_LRS # create storage account container for tf state
az storage container create --name $(storage_account_container) --account-name $(storage_account) # query storage key and set variable
ACCOUNT_KEY=$(az storage account keys list --resource-group $(terraform_rg) --account-name $(storage_account) --query "[?keyName == 'key1'][value]" --output tsv) # create azure keyvault
az keyvault create --name $(keyvault) --resource-group $(terraform_rg) --location eastasia --enable-soft-delete false # set keyvault secret,secret value is ACCOUNT_KEY
az keyvault secret set --name $(keyvault_sc) --vault-name $(keyvault) --value $ACCOUNT_KEY # set secret varivale and add to environment
echo "##vso[task.setvariable variable=ACCOUNT_KEY;isOutput=true]$ACCOUNT_KEY"
#echo "##vso[task.setvariable variable=ACCOUNT_KEY;issecret=true;isOutput=true]$ACCOUNT_KEY" - job: same_stage_echo
dependsOn: azure_cli_script
variables:
ACCOUNT_KEY: $[dependencies.azure_cli_script.outputs['output_variable.ACCOUNT_KEY']]
steps:
- task: Bash@3
displayName: 'Bash :output temporary variables in different jobs on the same stage'
inputs:
targetType: 'inline'
script: |
# echo ACCOUNT_KEY
echo "ACCOUNT_KEY is $ACCOUNT_KEY"
输出变量用于不同 stage
- stage: echo_varibale
dependsOn: script
jobs:
- job: different_stage_echo
variables:
ACCOUNT_KEY: $[stageDependencies.script.azure_cli_script.outputs['output_variable.ACCOUNT_KEY']]
steps:
- task: Bash@3
displayName: 'Bash :output temporary variables in same jobs on the same stage'
inputs:
targetType: 'inline'
script: |
# echo ACCOUNT_KEY
echo "ACCOUNT_KEY is $ACCOUNT_KEY"
以下为完整的 azure-pipelines-1.yaml
# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml trigger:
- remote_stats pool:
vmImage: ubuntu-latest stages:
- stage: script
jobs:
- job: azure_cli_script
steps:
- task: AzureCLI@2
displayName: 'Azure CLI :Create Storage Account,Key Vault And Set KeyVault Secret'
name: 'output_variable'
inputs:
azureSubscription: 'Microsoft Azure Subscription(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx)'
scriptType: 'bash'
addSpnToEnvironment: true
scriptLocation: 'inlineScript'
inlineScript: |
# create azure resource group
az group create --location eastasia --name $(terraform_rg) # create azure storage account
az storage account create --name $(storage_account) --resource-group $(terraform_rg) --location eastasia --sku Standard_LRS # create storage account container for tf state
az storage container create --name $(storage_account_container) --account-name $(storage_account) # query storage key and set variable
ACCOUNT_KEY=$(az storage account keys list --resource-group $(terraform_rg) --account-name $(storage_account) --query "[?keyName == 'key1'][value]" --output tsv) # create azure keyvault
az keyvault create --name $(keyvault) --resource-group $(terraform_rg) --location eastasia --enable-soft-delete false # set keyvault secret,secret value is ACCOUNT_KEY
az keyvault secret set --name $(keyvault_sc) --vault-name $(keyvault) --value $ACCOUNT_KEY # set secret varivale and add to environment
echo "##vso[task.setvariable variable=ACCOUNT_KEY;isOutput=true]$ACCOUNT_KEY"
#echo "##vso[task.setvariable variable=ACCOUNT_KEY;issecret=true;isOutput=true]$ACCOUNT_KEY" - job: same_stage_echo
dependsOn: azure_cli_script
variables:
ACCOUNT_KEY: $[dependencies.azure_cli_script.outputs['output_variable.ACCOUNT_KEY']]
steps:
- task: Bash@3
displayName: 'Bash :output temporary variables in different jobs on the same stage'
inputs:
targetType: 'inline'
script: |
# echo ACCOUNT_KEY
echo "ACCOUNT_KEY is $ACCOUNT_KEY" - stage: echo_varibale
dependsOn: script
jobs:
- job: different_stage_echo
variables:
ACCOUNT_KEY: $[stageDependencies.script.azure_cli_script.outputs['output_variable.ACCOUNT_KEY']]
steps:
- task: Bash@3
displayName: 'Bash :output temporary variables in same jobs on the same stage'
inputs:
targetType: 'inline'
script: |
# echo ACCOUNT_KEY
echo "ACCOUNT_KEY is $ACCOUNT_KEY"
*****重点*****:管道内变量与动态临时变量使用区别
Pipeline 管道内使用方式:$(变量名称)
动态临时变量使用方式:$变量名称
配置 Pipeline 管道变量
使用 Azure CLI 创建 Azure Storage Account、Azure Key Vault 的内联脚本中使用管理内变量控制参数
变量名 | 变量值 |
terraform_rg | Web_Test_TF_RG |
storage_account | cnbatetfstorage |
storage_account_container | tf-state |
keyvault | cnbate-terraform-kv |
keyvault_sc | terraform-stste-storage-key |
container_key | cnbate.tf.stats |
运行 Pipeline,查看配置输出
由于我们已经在 azure-pipelines-1.yaml 文件中指定了工作分支 “remote_stats”,当我们只要触发 “remote_stats” 分支的 “push” 或者 “pull_request” 动作都会触发 Azure DevOps Pipeline 的运行。
相同 stage 内的 job 输出
不同 stage 的 job 输出
总结
本期实验,我们学习了如何在 Azure DevOps Pipeline 运行期间创建的动态临时变量以及变量的输出,使得我们更加灵活的在任意 job 中声明自定义的动态临时变量,并将动态临时变量应用到任意的 job 中,这种方式有区别与Pipeline 管道内变量,尤其是在定义阶段和使用语法上,详细内容参考官方文档。
在脚本中设置变量:https://docs.microsoft.com/en-us/azure/devops/pipelines/process/set-variables-scripts
github 代码地址:https://github.com/yunqian44/Terraform_Cnbate_Traffic_Manager
Terraform 在 Azure DevOps 中的使用系列:https://www.cnblogs.com/AllenMaster/category/1876925.html
Azure Terraform(十一)Azure DevOps Pipeline 内的动态临时变量的使用的更多相关文章
- Azure Terraform(九)利用 Azure DevOps Pipeline 的审批来控制流程发布
一,引言 Azure Pipeline 管道是一个自动化过程:但是往往我们由于某种原因,需要在多个阶段之前获得批准之后再继续下一步流程,所以我们可以向Azure Pipeline 管道添加审批!批准流 ...
- Azure Terraform(七)利用Azure DevOps 实现自动化部署基础资源(补充)
一,引言 之前一篇文章有讲解到利用 利用Azure DevOps 实现自动化部署基础资源,当时 TF 代码没有针对 Azure 各个资源的封装,所有的资源代码全部写在一个 main.tf 文件中.然后 ...
- Azure Terraform(五)利用Azure DevOps 实现自动化部署基础资源
一,引言 上一篇我们结合学习 Azure Traffic Manger 的内容,做了一个负载均衡的基础设施架构.通过 Terraform 部署执行计划,将整个 Azure Traffic Manage ...
- 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 的条件语句选择发布环境
一,引言 之前我讲过的所有的案例中,都是将整个Azure Resource 部署到同一个订阅下,没有做到灵活的在 Azure Pipeline 在运行前选择需要部署的环境.在实际的项目开发中,我们也会 ...
- 使用Azure DevOps Pipeline实现.Net Core程序的CI
上次介绍了Azure Application Insights,实现了.net core程序的监控功能.这次让我们来看看Azure DevOps Pipeline功能.Azure DevOps Pip ...
- 使用Azure DevOps Pipeline实现.Net Core程序的CD
上一次我们讲了使用Azure DevOps Pipeline实现.Net Core程序的CI.这次我们来演示下如何使用Azure DevOps实现.Net Core程序的CD. 实现本次目标我们除了A ...
- Azure App Service(一)利用Azure DevOps Pipeline 构建镜像,部署应用程序
一,引言 起因是前两天项目上做测试,需要我把写好的基于.NET 5 的 Web 测试程序作成 Docker 镜像.当我在本地验证完功能后,准备利用 Docker 构建应用程序镜像的时候,发现系统不支持 ...
随机推荐
- MVCC多版本并发控制
MVCC多版本并发控制 爱情小傻蛋关注 82019.09.28 23:23:37字数 4,740阅读 91,421 前提概要 什么是MVCC 什么是当前读和快照读? 当前读,快照读和MVCC的关系 M ...
- spring学习二:jdbc相关回顾以及spring下dao
目录: Part一:回顾java web部分的jdbc.事务.连接池和dbutils工具等 : Part二:spring的JdbcTemplate使用: Part三:spring的事务处理: Part ...
- 使用 rabbitmq 的场景?
(1)服务间异步通信 (2)顺序消费 (3)定时任务 (4)请求削峰
- LIKE 声明中的%和_是什么意思?
%对应于 0 个或更多字符,_只是 LIKE 语句中的一个字符. 如何在 Unix 和 MySQL 时间戳之间进行转换? UNIX_TIMESTAMP 是从 MySQL 时间戳转换为 Unix 时间戳 ...
- C++ | 程序编译连接原理
文章目录 预编译(生成*.i文件) 编译(生成*.s文件) 汇编(生成*.o文件,也叫目标文件) 链接(生成*.exe文件,也叫可执行文件) 汇编--目标文件 查看文件头 查看符号表 查看 .o 文件 ...
- formSelects
formSelects-v4.js 链接:https://pan.baidu.com/s/1Qp-ez7CuA1cVdWhP37EA7Q 提取码:17iq只需要下文中的css文件和js文件引入到页面 ...
- 解决使用 swiper 常见的问题
使用 swiper 的过程中个人总结 1. swiper插件使用方法, 直接查看文档 swiper基础演示 swiper API文档 2.swiper近视初始化时, 其父级元素处于隐藏状态(displ ...
- python-查找鞍点
[题目描述]对于给定5X5的整数矩阵,设计算法查找出所有的鞍点的信息(包括鞍点的值和行.列坐标,坐标从1开始). 提示:鞍点的特点:列上最小,行上最大. [练习要求]请给出源代码程序和运行测试结果 ...
- iframe引入微信公众号文章
微信在文章页面设置了响应头""frame-ancestors 'self'"阻止了外部页面将其嵌套的行为,文章的图片也设置了防盗链的功能,这就导致了直接在iframe中引 ...
- ABP源码分析 - 服务配置(1)
比较随意,记录下过程,以便忘了以后重拾. 三个关注点 Program.cs internal static IHostBuilder CreateHostBuilder(string[] args) ...