思路浅析

  在我们分析的 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 内的动态临时变量的使用的更多相关文章

  1. Azure Terraform(九)利用 Azure DevOps Pipeline 的审批来控制流程发布

    一,引言 Azure Pipeline 管道是一个自动化过程:但是往往我们由于某种原因,需要在多个阶段之前获得批准之后再继续下一步流程,所以我们可以向Azure Pipeline 管道添加审批!批准流 ...

  2. Azure Terraform(七)利用Azure DevOps 实现自动化部署基础资源(补充)

    一,引言 之前一篇文章有讲解到利用 利用Azure DevOps 实现自动化部署基础资源,当时 TF 代码没有针对 Azure 各个资源的封装,所有的资源代码全部写在一个 main.tf 文件中.然后 ...

  3. Azure Terraform(五)利用Azure DevOps 实现自动化部署基础资源

    一,引言 上一篇我们结合学习 Azure Traffic Manger 的内容,做了一个负载均衡的基础设施架构.通过 Terraform 部署执行计划,将整个 Azure Traffic Manage ...

  4. Azure Terraform(八)利用Azure DevOps 实现Infra资源和.NET CORE Web 应用程序的持续集成、持续部署

    一,引言 上一篇讲解到利用 Azure DevOps 将整个 Azure Web App,Azure Traffic Manager profile,Azure Storage Account,Azu ...

  5. Azure DevOps(二)利用Azure DevOps Pipeline 构建基础设施资源

    一,引言 上一篇文章记录了利用 Azure DevOps 跨云进行构建 Docker images,并且将构建好的 Docker Images 推送到 AWS 的 ECR 中.今天我们继续讲解 Azu ...

  6. Azure Terraform(十)利用 Azure DevOps 的条件语句选择发布环境

    一,引言 之前我讲过的所有的案例中,都是将整个Azure Resource 部署到同一个订阅下,没有做到灵活的在 Azure Pipeline 在运行前选择需要部署的环境.在实际的项目开发中,我们也会 ...

  7. 使用Azure DevOps Pipeline实现.Net Core程序的CI

    上次介绍了Azure Application Insights,实现了.net core程序的监控功能.这次让我们来看看Azure DevOps Pipeline功能.Azure DevOps Pip ...

  8. 使用Azure DevOps Pipeline实现.Net Core程序的CD

    上一次我们讲了使用Azure DevOps Pipeline实现.Net Core程序的CI.这次我们来演示下如何使用Azure DevOps实现.Net Core程序的CD. 实现本次目标我们除了A ...

  9. Azure App Service(一)利用Azure DevOps Pipeline 构建镜像,部署应用程序

    一,引言 起因是前两天项目上做测试,需要我把写好的基于.NET 5 的 Web 测试程序作成 Docker 镜像.当我在本地验证完功能后,准备利用 Docker 构建应用程序镜像的时候,发现系统不支持 ...

随机推荐

  1. HashMap?ConcurrentHashMap?

    Java团长在csdn 2019-02-06 19:58:00  104241  收藏 666     来源:crossoverJie(ID:crossoverJie) 前言 Map 这样的 Key ...

  2. Java中的软引用、弱引用、虚引用的适用场景以及释放机制

    Java的强引用,软引用,弱引用,虚引用及其使用场景   从 JDK1.2 版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引 ...

  3. Spring-MVC 里面的ModelAndView

    作用: 由于本身http是无状态的并不会保存什么请求信息.  但是目标页面可能又需要一些信息.这时候可以用ModelAndView存放一些业务数据之类等.然后返回给页面 用法: 比较重要的方法: 往对 ...

  4. Spring与Web项目整合的原理

    引言: 在刚开始我们接触IOC时,我们加载并启用SpringIOC是通过如下代码手动加载 applicationContext.xml 文件,new出context对象,完成Bean的创建和属性的注入 ...

  5. 时间工具类之“ JDK1.8中 LocalDate、LocalTime、LocalDateTime、LocalDateTimeUtil四个时间工具类”

    一.使用的原因 在JDK8发布的时候,推出了LocalDate.LocalTime.LocalDateTime这个三个时间处理类,以此来弥补之前的日期时间类的不足,简化日期时间的操作. 在Java8之 ...

  6. 集合流之“将List<Integer>转为String并用逗号分割”

    1.使用[流+Collectors]转换 import java.util.ArrayList; import java.util.List; import java.util.stream.Coll ...

  7. 记一次 Nuxt 3 在 Windows 下的打包问题

    0. 背景 之前用 Nuxt 3 写了公司的官网,包括了样式.字体图标.图片.视频等,其中样式和字体图标放在了 assets/styles 和 assets/fonts 目录下,而图片和视频则放在了 ...

  8. W3School 教程整理

    离线版大部分整理自 w3cschool ,少部分整理自 w3school ,由本人整理. 感谢 w3cschool 站长的无私奉献. 由于本人精力有限,此处的列表不一定能够及时更新,最新版本请到本人博 ...

  9. java中为什么接口中的属性和方法都默认为public?

    4)为什么接口中的属性和方法都默认为public?Sun公司当初为什么要把java的接口设计发明成这样? [新手可忽略不影响继续学习]答:如上所述,马克-to-win:既然接口强于抽象类能胜任作为和外 ...

  10. CentOS安装图形界面以及eclipse的安装

    图形界面的安装,以GNOME为例: 1.首先运行命令:yum grouplist 会显示可安装的包,可以自己选择安装. 2.运行  yum gruopinstall "GNOME" ...