本期的微软 MVP 实验室研究员-贠乾,将通过代码示例为大家分享如何使用 GitHub Actions 以自动化的方式部署 Terraform Code 到 Azure。

贠乾,微软最有价值专家,Microsoft Azure方向,目前从事.NET技术栈产品后端开发工作。热衷学习微软Azure相关技术,分享自己的学习经验。同时,正在提高自己Azure云基础设施解决方案的设计能力和Azure云技术方面的培训能力

思路浅析

使用 Terraform Code 部署 Azure 基础设施资源是特别受欢迎的,我曾经有写文章分享过利用 Azure DevOps 自动部署 Terraform Code 所描述的 Azure 基础设施资源。但是有些人对于Azure DevOps 可能比较陌生,再加上 Azure DevOps 的 Parallel jobs 付费作业。所以作为替代方案,今天给大家分享如何使用 GitHub Actions 部署 Terraform Code。

配置 Azure Service Principal 的凭据到 GitHub 机密库

Terraform Code 以及Azure CLI 会使用 Azure Service Principle 对 Azure 进行身份认证,关于 Azure Service Principle 的创建大家可以参考Blog。

  • Blog

    https://www.cnblogs.com/AllenMaster/p/13065643.html

接下来需要添加以下机密信息

  1)AZURE_AD_CLIENT_ID

  2)AZURE_AD_CLIENT_SECRET

  3)AZURE_AD_TENANT_ID

  4)AZURE_SUBSCRIPTION_ID

  5)AZURE_CREDENTIALS

其中 AZURE_CREDENTIALS 格式内容如下所示:

{"clientId": "XXXX","clientSecret": "XXXX","subscriptionId": "XXXX","tenantId": "XXXX"}

将上述信息存储到对应名称的 GitHub Secrets。

配置 workflows run 的 yaml

在 Terraform 项目根目录创建 terraform.yaml 并保存在以下目录

terraform.yaml 内容如下

name: " using GitHub Action for Terraform Auto CI/CD"
on:pull_request:branches:- remote_statspush:branches:- remote_stats
env:tf_version: "latest"tf_working_dir: "./src/model/"terraform_rg: "Web_Test_TF_RG"storage_account: "cnbatestorestatefile004"storage_account_container: "terraform-state"key: "cnbate.terraform.stats"
jobs:terraform_auto_deploy:name: "Azure CLI Action (secrect created)"env:ARM_CLIENT_ID: ${{ secrets.AZURE_AD_CLIENT_ID }}ARM_CLIENT_SECRET: ${{ secrets.AZURE_AD_CLIENT_SECRET }}ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}ARM_TENANT_ID: ${{ secrets.AZURE_AD_TENANT_ID }}runs-on: ubuntu-latestenvironment: production# Use the Bash shell regardless whether the GitHub Actions runner is ubuntu-latest, macos-latest, or windows-latestdefaults:run:shell: bashsteps:- name: "Checkout"uses: actions/checkout@master- name: Azure Loginuses: azure/login@v1with:creds: ${{ secrets.AZURE_CREDENTIALS }}enable-AzPSSession: falseenvironment: azurecloudallow-no-subscriptions: false- name: Azure CLI scriptuses: azure/CLI@v1with:creds: ${{ secrets.AZURE_CREDENTIALS }}enable-AzPSSession: falseenvironment: azurecloudallow-no-subscriptions: falseazcliversion: 2.30.0inlineScript: |# create azure resource groupaz group create --location eastasia --name ${{ env.terraform_rg }}# create azure storage accountaz storage account create --name ${{ env.storage_account }} --resource-group ${{ env.terraform_rg }} --location eastasia --sku Standard_LRS# create storage account container for tf stateaz storage container create --name ${{ env.storage_account_container }} --account-name ${{ env.storage_account }}# query storage key and set variableexport ARM_ACCESS_KEY=$(az storage account keys list --resource-group ${{env.terraform_rg}} --account-name ${{ env.storage_account }} --query "[?keyName == 'key1'][value]" --output tsv)echo $ARM_ACCESS_KEY- name: "Terraform init azurerm backend"uses: ahmedig/terraform-azurerm-backend@v1with:azure_credentials: ${{ secrets.AZURE_CREDENTIALS }}resource_group_name: ${{ env.terraform_rg }}container_name: ${{ env.storage_account_container }}storage_account_name: ${{ env.storage_account }}file_name: ${{ env.key }}subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}tf_working_directory: ${{ env.tf_working_dir }}- name: "Terraform Validate"uses: hashicorp/terraform-github-actions@masterwith:tf_actions_version: ${{ env.tf_version }}tf_actions_subcommand: 'validate'tf_actions_working_dir: ${{ env.tf_working_dir }}env:GITHUB_TOKEN: ${{ secrets.AZURE_CREDENTIALS }}- name: "Terraform Plan"uses: hashicorp/terraform-github-actions@masterwith:tf_actions_version: ${{ env.tf_version }}tf_actions_subcommand: 'plan'tf_actions_working_dir: ${{ env.tf_working_dir }}env:GITHUB_TOKEN: ${{ secrets.AZURE_CREDENTIALS }}- name: "Terraform Deploy"uses: hashicorp/terraform-github-actions@masterwith:tf_actions_version: ${{ env.tf_version }}tf_actions_subcommand: 'apply'tf_actions_working_dir: ${{ env.tf_working_dir }}env:GITHUB_TOKEN: ${{ secrets.AZURE_CREDENTIALS }}- name: "Terraform Destroy"uses: hashicorp/terraform-github-actions@masterwith:tf_actions_version: ${{ env.tf_version }}tf_actions_subcommand: 'destroy'tf_actions_working_dir: ${{ env.tf_working_dir }}env:GITHUB_TOKEN: ${{ secrets.AZURE_CREDENTIALS }}

运行 workflows run

由于我们在 "terraform.yaml" 中指定指定工作分支 “remote_stats”,当 “remote” 分支发生 “push” 或者 “pull_request” 操作就会触发 GitHub Actions 的 workflows 的运行。所以我们直接推送当前已编辑好的 "terraform.yaml" 文件到 “remote_stats” 分支,并在 GitHub 上查看 workflows 运行结果。

如果需要进一步了解每个步骤都执行了那些操作,可以选择当前 workflow runs

查看每个步骤并其输出内容

查看 Terraform 执行部署计划内容

如需参考详细输出信息,复制以下链接到浏览器查看https://github.com/yunqian44/Terraform_Cnbate_Traffic_Manager/runs/4740814994?check_suite_focus=true

总结

本期实验,我们学习如何使用 GitHub Actions 自动化的方式实现 Terraform Code 的语法校验、生成部署计划,执行部署计划,销毁部署计划。也为我们在选择自动化部署 Azure 基础设施即代码的解决方案上又增加了新的方案。

  • GitHub Action 工作流程中设置 Secrets:

    https://github.com/Azure/actions-workflow-samples/blob/master/assets/create-secrets-for-GitHub-workflows.md

  • Azure服务主体:

    https://www.cnblogs.com/AllenMaster/p/13065643.html

  • GitHub:

    https://github.com/yunqian44/Terraform_Cnbate_Traffic_Manager

掌握自动化部署,拿下DevOps半壁江山还远吗?相关推荐

  1. git自动部署代码到服务器windows,Jenkins-在windows上配置自动化部署(Jenkins+Gitlab+IIS)...

    Jenkins-在windows上配置自动化部署(Jenkins+Gitlab+IIS) web部署样例 windows服务部署样例 系统备份 在服务器上创建后缀名为.ps1的文件,例:BackUpD ...

  2. 持续集成在Hexo自动化部署上的实践

      曾经听到过这样一句话,"不要用战术上的勤奋掩盖战略上的懒惰",所以战术和战略更像是抽象类和具体类,而面向对象设计实际上是现实等级制度的一种映射.因此我们注意到,决策者通常关注的 ...

  3. DevOps平台中的自动化部署框架设计

    本文目录: 一.背景 二.我们的需求是什么? 三.概念澄清 四.概念模型 五.总体设计 六.关键点设计 七.总结 一.背景 说到自动化部署,大家肯定都会想到一些配置管理工具,像ansible,chef ...

  4. 把运维和开发放一起就是DevOps?还差得远!

    来自:DBAplus社群 作者介绍 刘华(Kenneth),就职于世界500强银行.负责基金外包业务软件开发与交付.敏捷.精益.DevOps领域专家.著有<猎豹行动--硝烟中的敏捷转型之旅> ...

  5. kubernetes+Azure DevOps实现.Net Core项目的自动化部署均衡负载

    1. 前言 前前后后学习kubernetes也有一个来月了,关于kubernetes的博客也写了有十多篇.但是技术如果无法落地到实际的应用场景终归是纸上谈兵,所以就有了这一出:通过结合kubernet ...

  6. AWS DevOps – 配合Jenkins和CodeDeploy实现代码自动化部署

    AWS DevOps – 配合Jenkins和CodeDeploy实现代码自动化部署 Amazon ElastiCache 连接至 Redis 节点 通过 AWS Command Line Inter ...

  7. gogs可以自动化部署吗_效率提升利器:你还害怕自动化部署吗?

    嗨,我是你稳定输出.干货多多的勾勾(。・∀・)ノ゙.今天要聊一聊"自动化部署". 比尔盖茨曾提到过自动化的重要性:"技术在业务中使用的第一原则是,将自动化应用在正确的操作 ...

  8. 还在手动部署 Kubernetes 集群吗,是时候使用 Kubespray 完成自动化部署了!

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 前言 部署 Kubernetes 除了手动方式外,还有诸如 Kubeadm.Kubespray.Breeze.Ra ...

  9. 都2023年了,还不用Jenkins自动化部署?

    背景 前段时间与室友在交流中聊到了互联网每个岗位的职责,然后就聊到了测试岗位! 一个同学不禁发问:"如果我们开发接到了特别庞大的项目,开发周期特别久,难道测试团队就一直干等着我们开发结束再进 ...

最新文章

  1. 360 自动打开word_EXCEL的数据和图表如何与ppt,Word关联,看完你就会了
  2. 【MPI高性能计算】蒙特卡洛方法计算pi值
  3. mysql 怎么登陆远程服务器_教你手机怎么远程连接云服务器
  4. android studio工程特点,Android Studio的重要特性
  5. java界面中显示图片_java中怎样在界面中显示图片?
  6. java-前端之js
  7. 数学图形(1.47)贝塞尔(Bézier)曲线
  8. C++_类和对象_C++运算符重载_递增运算符重载_重载++运算符_前置++_后置++重载---C++语言工作笔记057
  9. 互联网电商都是怎么用工厂模式的?
  10. Loadrunner教程
  11. EXCEL2007导入SQL生成新表并插入数据
  12. 南宁琅东的机器人餐厅_南宁埌东藏着一个秘密花园,每天一大波年轻男女进进出出…...
  13. 学习总结(抓沙理论、盲人摸象、高屋建瓴、囫囵吞枣)
  14. 《论语》全译——季氏篇第十六
  15. 动态多光源 Light-Pre-Pass Lighting 实现
  16. STM32 ADC多通道规则采样和注入采样
  17. 视频话题识别与跟踪 - demo 【问题总结1.1-视频处理】
  18. 使用javascript和jquery获取类方法
  19. 压缩文件的后缀html,rar是什么格式
  20. 课时19 函数:我的地盘听我的

热门文章

  1. 这是博客园的一个Bug吗?
  2. 五大浏览器及四大内核
  3. 有些型号的华为手机使用rem时,内容会超出屏幕宽度的问题
  4. 【2022-SPSSPRO杯数学建模】C题污水流行病学原理在新冠疫情防控方面的作用 论文及代码
  5. UML——组件图和部署图
  6. 设计之初体验—我谈产品设计
  7. 5G工业路由器领跑者:双模路由器(5G+4G)
  8. Nodejs建立microblog微博网站
  9. Codeforces Round #552 (Div. 3) A B C D E F G (暴力,dp,模拟)
  10. 我的HTML基础总结-2