当前位置 博文首页 > Grant_Allen:Azure Terraform(七)利用Azure DevOps 实现自动

    Grant_Allen:Azure Terraform(七)利用Azure DevOps 实现自动

    作者:Grant_Allen 时间:2021-01-30 15:45

    一,引言

      之前一篇文章有讲解到利用 利用Azure DevOps 实现自动化部署基础资源,当时 TF 代码没有针对 Azure 各个资源的封装,所有的资源代码全部写在一个 main.tf 文件中。然后还有讲到 Azure Resource Common Module 的 TF 代码的封装。之前还在Azure Terraform 第四节讲到利用 Azure Storage 远程状态文件存储。那么今天我们尝试将封装过 Common Module 的 TF 代码,结合 TF 状态文件远端存储,实现自动化部署基础资源

    --------------------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 实现自动化部署基础资源(补充)

    二,正文

    1,Azure DevOps 创建项目

    输入项目名称 “CnBateBlogWeb_Infrastructure_V2”,点击 “Create” 创建项目。

    2,配置Azure DevOps Release Pipeline 环境 

    2.1,添加 Release Pipeline

    选择 “ Pipelines=》Releases”,点击 “New pipeline” 创建新的 pipeline

    模板选择 “Empty job”,并且点击图中箭头所指的 “x” 关闭页面

    Stage 页面,输入新的 Stage name:“Deploy Infra”,并且关闭此页面

    2.2,添加 Artifacts

    接下来需要添加 “artifact”,点击图中的 “+ Add an artiface”

    选择 ”GitHub“ ,

    Service 添加新的 connection:"github_connection_xxxxx"

    Source(repository)选择:TF 代码库

    Default branch:“remote_stats”

    Default version:”Latest from the default branch“

    点击 "Add" 添加 artifact。

    2.3,添加 task

    接下来添加 ”Deploy Infra“ Stages 相关 task

    2.3.1,创建远程存储相关 job

    点击图中圈中的 ”+“,添加 new task,并且在右边的输入框中输入 ”Azure CLI“,选中图中的 ”Azure CLI“

    注意,之前在  一篇文章中讲到远端存储时,需要提前创建 Azure Storage AccuntAzure KeyVault。Azure Storage AccountContainer 中用来存储 TF 的状态文件,Azure KeyVault 存储 Azure Storage Accountaccess_key(访问密钥),之前是手动创建,主要是为了给大家演示。今天,我们通过 Azure CLI 创建快捷操作,并且 Azure CLI 这个 task  移至 Azure Releases Pipeline 中。

    输入相关参数:

    Display name:”Azure CLI :Create Storage Account,Key Vault And Set KeyVault Secret“

    Azure Resource Manager connection:选择自己的订阅 id

    Script Type(脚本类型)选择:”Shell“

    Script Location(脚本位置)选择:”Inline script“(内联脚本)

    Inline Script(脚本)在 Azure 中创建以下资源:
      1)Storage 存储帐户
      2)Blob存储容器(将存储状态文件)
      3)密钥库,将用于安全地存储Storage 的访问密钥

    Inline Script(内联脚本)如下所示:

    # 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

    大家有注意到没 ”Inline Script“ 中既有 Pipeline 设置的变量,又有自定义的系统变量

    如果是获取 pipeline 中设置变量:$(varivale_name)

    如果是获取自定义系统变量:$variable_name

    2.3.2,添加 pipeline variables

    接下来设置 pipeline 变量,选择 ”Variables“,点击 ”+Add“,添加相应的参数设置

    Name Value
    keyvault cnbate-terraform-kv6
    keyvault_sc terraform-stste-storage-key
    storage_account cnbateterraformstorage
    storage_account_container terraform-state
    terraform_rg Web_Test_TF_RG

     

    2.3.3,添加 Azure KeyVault 获取 Access Secret Job

    输入 ”Azure Key Vault“,点击 ”Add“  添加 Azure Key Vault Job

    输入相关参数:

    Display name:“Azure Key Vault:Get Storage Access Secret”

    Azure subscription 选择当前自己的订阅

    Key vault 选择:“cnbate-terraform-kv6”

    Secrets filter(机密过滤器):“terraform-stste-storage-key”,如果选择默认 “*”,则下载选定密钥库的所有机密

    2.3.4,添加 Terraform install Job

    搜索 “Terraform”,选择 “Terraform tool install”

    修改相应参数:

    Display name:"Install Terraform 0.14.3"

    Version(版本):”0.14.3“

    2.3.5,添加 Terraform 初始化 Job

    搜索 “Terraform”,点击 “Add”

    修改相应参数:

    Display name:“Terraform:Init”

    Configuration directory:选择到 ”~/src/model“ 这个目录下,也就是 terraform 代码的工作目录

    Command 选择:“init”

    Addition command arguments:”-backend-config="access_key=$(terraform-stste-storage-key)"“ (tf 代码中没有access_key 的配置信息,所以我们需要在 terraform init 过程中传递此参数)

    AzureRM backend configuration:

    Azure subscription:选择当前自己的订阅

    Resource group:”Web_Test_TF_RG“

    Storage account:”cnbateterraformstorage“

    Container:”terraform-state“

    Key:”cnbate.terraform.stats“  

    2.3.6,添加 Terraform 生成部署计划 Job

    搜索 ”Terraform“,点击 ”Add“

    修改相关参数:

    Display name:”Terraform:plan“

    Command 选择:”plan“

    Configuration directory: 选择 terraform 代码的工作目录

    Azure subscription 选择当前自己的Azure订阅

    2.3.7,添加 Terraform 执行部署计划 Job

    搜索 ”Terraform“,点击 ”Add“

    修改相应参数:

    Display name:”Terraform:auto-apply“

    Command:”validate and apply“

    Configuration directory:选择 terraform 代码的工作目录

    Additional command arguments:“-auto-approve”

    Azure subscription:选择当前自己订阅

    2.3.8,保存 Azure Pipeline 设置,并且设置 Pipeline 的触发条件

    修改当前 pipeline 名称,并且点击 “Save” 进行保存

    设置 pipeline 的触发条件

    开启持续部署触发,每次在所选存储库中发生Git推送时触发pipeline,接下来添加分支筛选条件

    Type:Include,Branch:“remote_stats”,也就是说每当 “remote_stats” 发生git 推送的时候,触发此 pipeline

    设置完毕后,点击 “Save” 进行保存

    3,测试Azure DevOps 自动化部署基础设施资源

     先登录 Azure Portal 确保 “Web_Test_TF_RG” 资源组中不存在任何资源

    手动触发 Azure Release Pipeline

    点击 “Create release” 进行手动触发

    稍等片刻,等待pipeline 执行完毕

    查看 “Web_Test_TF_RG” 中的所有资源

    Bingo,大功告成!!!!

    *★,°*:.☆( ̄▽ ̄)/$:*.°★* 。????????????

    三,结尾

      今天的实战操作比较多,全都是需要在Azure DevOps 上进行操作的,大家要多加练习,熟能生巧。本文所分享的内容也存在着很多我自己的一些理解,有理解不到位的,还希望多多包涵,并且指出不足之处。

    参考资料:Terraform 官方,azurerm 文档,Azure CLI 文档

    Terraform_Cnbate_Traffic_Manager github:https://github.com/yunqian44/Terraform_Cnbate_Traffic_Manager

    作者:Allen 

    版权:转载请在文章明显位置注明作者及出处。如发现错误,欢迎批评指正。