思路浅析

  使用 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 的创建大家可以参考:

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 格式内容如下所示:

  1. {
  2. "clientId": "XXXX",
  3. "clientSecret": "XXXX",
  4. "subscriptionId": "XXXX",
  5. "tenantId": "XXXX"
  6. }

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

配置 workflows run 的 yaml

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

terraform.yaml 内容如下

  1. name: " using GitHub Action for Terraform Auto CI/CD"
  2. on:
  3. pull_request:
  4. branches:
  5. - remote_stats
  6. push:
  7. branches:
  8. - remote_stats
  9. env:
  10. tf_version: "latest"
  11. tf_working_dir: "./src/model/"
  12. terraform_rg: "Web_Test_TF_RG"
  13. storage_account: "cnbatestorestatefile004"
  14. storage_account_container: "terraform-state"
  15. key: "cnbate.terraform.stats"
  16. jobs:
  17. terraform_auto_deploy:
  18. name: "Azure CLI Action (secrect created)"
  19. env:
  20. ARM_CLIENT_ID: ${{ secrets.AZURE_AD_CLIENT_ID }}
  21. ARM_CLIENT_SECRET: ${{ secrets.AZURE_AD_CLIENT_SECRET }}
  22. ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
  23. ARM_TENANT_ID: ${{ secrets.AZURE_AD_TENANT_ID }}
  24. runs-on: ubuntu-latest
  25. environment: production
  26.  
  27. # Use the Bash shell regardless whether the GitHub Actions runner is ubuntu-latest, macos-latest, or windows-latest
  28. defaults:
  29. run:
  30. shell: bash
  31. steps:
  32. - name: "Checkout"
  33. uses: actions/checkout@master
  34. - name: Azure Login
  35. uses: azure/login@v1
  36. with:
  37. creds: ${{ secrets.AZURE_CREDENTIALS }}
  38. enable-AzPSSession: false
  39. environment: azurecloud
  40. allow-no-subscriptions: false
  41. - name: Azure CLI script
  42. uses: azure/CLI@v1
  43. with:
  44. creds: ${{ secrets.AZURE_CREDENTIALS }}
  45. enable-AzPSSession: false
  46. environment: azurecloud
  47. allow-no-subscriptions: false
  48. azcliversion: 2.30.0
  49. inlineScript: |
  50.  
  51. # create azure resource group
  52. az group create --location eastasia --name ${{ env.terraform_rg }}
  53.  
  54. # create azure storage account
  55. az storage account create --name ${{ env.storage_account }} --resource-group ${{ env.terraform_rg }} --location eastasia --sku Standard_LRS
  56.  
  57. # create storage account container for tf state
  58. az storage container create --name ${{ env.storage_account_container }} --account-name ${{ env.storage_account }}
  59.  
  60. # query storage key and set variable
  61. export ARM_ACCESS_KEY=$(az storage account keys list --resource-group ${{env.terraform_rg}} --account-name ${{ env.storage_account }} --query "[?keyName == 'key1'][value]" --output tsv)
  62.  
  63. echo $ARM_ACCESS_KEY
  64.  
  65. - name: "Terraform init azurerm backend"
  66. uses: ahmedig/terraform-azurerm-backend@v1
  67. with:
  68. azure_credentials: ${{ secrets.AZURE_CREDENTIALS }}
  69. resource_group_name: ${{ env.terraform_rg }}
  70. container_name: ${{ env.storage_account_container }}
  71. storage_account_name: ${{ env.storage_account }}
  72. file_name: ${{ env.key }}
  73. subscription_id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
  74. tf_working_directory: ${{ env.tf_working_dir }}
  75.  
  76. - name: "Terraform Validate"
  77. uses: hashicorp/terraform-github-actions@master
  78. with:
  79. tf_actions_version: ${{ env.tf_version }}
  80. tf_actions_subcommand: 'validate'
  81. tf_actions_working_dir: ${{ env.tf_working_dir }}
  82. env:
  83. GITHUB_TOKEN: ${{ secrets.AZURE_CREDENTIALS }}
  84.  
  85. - name: "Terraform Plan"
  86. uses: hashicorp/terraform-github-actions@master
  87. with:
  88. tf_actions_version: ${{ env.tf_version }}
  89. tf_actions_subcommand: 'plan'
  90. tf_actions_working_dir: ${{ env.tf_working_dir }}
  91. env:
  92. GITHUB_TOKEN: ${{ secrets.AZURE_CREDENTIALS }}
  93.  
  94. - name: "Terraform Deploy"
  95. uses: hashicorp/terraform-github-actions@master
  96. with:
  97. tf_actions_version: ${{ env.tf_version }}
  98. tf_actions_subcommand: 'apply'
  99. tf_actions_working_dir: ${{ env.tf_working_dir }}
  100. env:
  101. GITHUB_TOKEN: ${{ secrets.AZURE_CREDENTIALS }}
  102.  
  103. - name: "Terraform Destroy"
  104. uses: hashicorp/terraform-github-actions@master
  105. with:
  106. tf_actions_version: ${{ env.tf_version }}
  107. tf_actions_subcommand: 'destroy'
  108. tf_actions_working_dir: ${{ env.tf_working_dir }}
  109. env:
  110. GITHUB_TOKEN: ${{ secrets.AZURE_CREDENTIALS }}

3,运行 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

Azure Terraform(九)GitHub Actions 实现 Infra 资源的自动化部署的更多相关文章

  1. 使用 GitHub Actions 实现 Hexo 博客自动部署

    一.Hexo 相关知识点 静态博客简单,但是发布博文时稍显麻烦,一般需要下面两步: hexo clean hexo g -d // 相当于 hexo g + hexo d 如果考虑到同步源文件,还需要 ...

  2. vuepress-theme-reco + Github Actions 构建静态博客,部署到第三方服务器

    最新博客链接 Github链接 查看此文档前应先了解,vuepress基本操作 参考官方文档进行配置: vuepress-theme-reco VuePress SamKirkland / FTP-D ...

  3. 使用 GitHub / GitLab 的 Webhooks 进行网站自动化部署

    老早就想写这个话题了,今天正好有机会研究了一下 git 的自动化部署.最终做到的效果就是,每当有新的 commit push 到 master 分支的时候,就自动在测试/生产服务器上进行 git pu ...

  4. Azure Terraform(三)部署 Web 应用程序

    一,引言 上一节关于 Terraform 的文章讲到 Terraform 使用到的一些语法,以及通过演示使用 Terraform 在Azure 上部署资源组,极大的方便了基础设施实施人员,也提高了基础 ...

  5. 使用 Azure PowerShell 将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager

    以下步骤演示了如何使用 Azure PowerShell 命令将基础结构即服务 (IaaS) 资源从经典部署模型迁移到 Azure Resource Manager 部署模型. 也可根据需要通过 Az ...

  6. 规划将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager

    尽管 Azure 资源管理器提供了许多精彩功能,但请务必计划迁移,以确保一切顺利进行. 花时间进行规划可确保执行迁移活动时不会遇到问题. Note 以下指导的主要参与者为 Azure 客户顾问团队,以 ...

  7. 使用 Azure CLI 将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager 部署模型

    以下步骤演示如何使用 Azure 命令行接口 (CLI) 命令将基础结构即服务 (IaaS) 资源从经典部署模型迁移到 Azure Resource Manager 部署模型. 本文中的操作需要 Az ...

  8. 使用 Github Actions 自动部署 Angular 应用到 Github Pages

    前言 最近在学习 Angular,一些基础的语法也学习的差不多了,就在 github 上新建了一个代码仓库,准备用 ng-zorro 搭个后台应用的模板,方便自己以后写些小东西时可以直接使用.前端项目 ...

  9. 使用GitHub Actions自动编译部署hexo博客

    前言 使用hexo博客也挺久的,最开始是本地hexo clean && hexo g,最后hexo d推送到服务器.后来是本地hexo clean && hexo g, ...

随机推荐

  1. CSS3新增特性\HTML标签类型

    RGBA:透明度      作用: 设置透明度(R G B A)   opacity:不透明度     文字也会被设置不透明度   圆角      border-radius:圆角{左上角,右上角.. ...

  2. linux网络相关命令之脚本和centos启动流程

    nice 功用:设置优先权,可以改变程序执行的优先权等级.等级的范围从-19(最高优先级)到20(最低优先级).优先级为操作系统决定cpu分配的参数,优先级越高,所可能获得的 cpu时间越长. 语法: ...

  3. 使用buffered流结合byte数组,读入文件中的内容,包括中文字符

    package com.itcast.demo05.Buffered;import java.io.BufferedInputStream;import java.io.FileInputStream ...

  4. java的父类声明,子类实例化(强制类型转换导致异常ClassCastException)

    一.使用原因 父类声明,子类实例化,既可以使用子类强大的功能,又可以抽取父类的共性. 二.使用要点 1.父类类型的引用可以调用父类中定义的所有属性和方法: 2.父类中方法只有在是父类中定义而在子类中没 ...

  5. C# 使用管理员权限运行程序

    最近在开发OPCServer组件过程中,在注册opcServer是总是返回false,后来查找原因得知在本地主机注册opcServer时,需要使用管理员权限. OPCServer在一台机器上部署时只需 ...

  6. 启动Springboot 报错 Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Sat Jan 12 15:50:25 CST 2019 There was an unexpected error (type=Not

    解决方案:http://www.cnblogs.com/michaelShao/p/6675186.html

  7. 转:KVC 与 KVO 理解

    KVC 与 KVO 理解 On 2012 年 6 月 7 日, in iPhone, by donly KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲 ...

  8. python简单爬虫的实现

    python强大之处在于各种功能完善的模块.合理的运用可以省略很多细节的纠缠,提高开发效率. 用python实现一个功能较为完整的爬虫,不过区区几十行代码,但想想如果用底层C实现该是何等的复杂,光一个 ...

  9. 7.2 Tornado异步

    7.2 Tornado异步 因为epoll主要是用来解决网络IO的并发问题,所以Tornado的异步编程也主要体现在网络IO的异步上,即异步Web请求. 1. tornado.httpclient.A ...

  10. Solon 1.6.10 重要发布,现在有官网喽!

    关于官网 千呼万唤始出来: https://solon.noear.org .整了一个月多了,总体样子有了...还得不断接着整! 关于 Solon Solon 是一个轻量级应用开发框架.支持 Web. ...