Azure Terraform(九)GitHub Actions 实现 Infra 资源的自动化部署
思路浅析
使用 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 格式内容如下所示:
- {
- "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_stats
- push:
- 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-latest
- environment: production
- # Use the Bash shell regardless whether the GitHub Actions runner is ubuntu-latest, macos-latest, or windows-latest
- defaults:
- run:
- shell: bash
- steps:
- - name: "Checkout"
- uses: actions/checkout@master
- - name: Azure Login
- uses: azure/login@v1
- with:
- creds: ${{ secrets.AZURE_CREDENTIALS }}
- enable-AzPSSession: false
- environment: azurecloud
- allow-no-subscriptions: false
- - name: Azure CLI script
- uses: azure/CLI@v1
- with:
- creds: ${{ secrets.AZURE_CREDENTIALS }}
- enable-AzPSSession: false
- environment: azurecloud
- allow-no-subscriptions: false
- azcliversion: 2.30.0
- inlineScript: |
- # create azure resource group
- az group create --location eastasia --name ${{ env.terraform_rg }}
- # create azure storage account
- az storage account create --name ${{ env.storage_account }} --resource-group ${{ env.terraform_rg }} --location eastasia --sku Standard_LRS
- # create storage account container for tf state
- az storage container create --name ${{ env.storage_account_container }} --account-name ${{ env.storage_account }}
- # query storage key and set variable
- 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)
- echo $ARM_ACCESS_KEY
- - name: "Terraform init azurerm backend"
- uses: ahmedig/terraform-azurerm-backend@v1
- with:
- 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@master
- with:
- 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@master
- with:
- 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@master
- with:
- 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@master
- with:
- tf_actions_version: ${{ env.tf_version }}
- tf_actions_subcommand: 'destroy'
- tf_actions_working_dir: ${{ env.tf_working_dir }}
- env:
- 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 资源的自动化部署的更多相关文章
- 使用 GitHub Actions 实现 Hexo 博客自动部署
一.Hexo 相关知识点 静态博客简单,但是发布博文时稍显麻烦,一般需要下面两步: hexo clean hexo g -d // 相当于 hexo g + hexo d 如果考虑到同步源文件,还需要 ...
- vuepress-theme-reco + Github Actions 构建静态博客,部署到第三方服务器
最新博客链接 Github链接 查看此文档前应先了解,vuepress基本操作 参考官方文档进行配置: vuepress-theme-reco VuePress SamKirkland / FTP-D ...
- 使用 GitHub / GitLab 的 Webhooks 进行网站自动化部署
老早就想写这个话题了,今天正好有机会研究了一下 git 的自动化部署.最终做到的效果就是,每当有新的 commit push 到 master 分支的时候,就自动在测试/生产服务器上进行 git pu ...
- Azure Terraform(三)部署 Web 应用程序
一,引言 上一节关于 Terraform 的文章讲到 Terraform 使用到的一些语法,以及通过演示使用 Terraform 在Azure 上部署资源组,极大的方便了基础设施实施人员,也提高了基础 ...
- 使用 Azure PowerShell 将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager
以下步骤演示了如何使用 Azure PowerShell 命令将基础结构即服务 (IaaS) 资源从经典部署模型迁移到 Azure Resource Manager 部署模型. 也可根据需要通过 Az ...
- 规划将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager
尽管 Azure 资源管理器提供了许多精彩功能,但请务必计划迁移,以确保一切顺利进行. 花时间进行规划可确保执行迁移活动时不会遇到问题. Note 以下指导的主要参与者为 Azure 客户顾问团队,以 ...
- 使用 Azure CLI 将 IaaS 资源从经典部署模型迁移到 Azure Resource Manager 部署模型
以下步骤演示如何使用 Azure 命令行接口 (CLI) 命令将基础结构即服务 (IaaS) 资源从经典部署模型迁移到 Azure Resource Manager 部署模型. 本文中的操作需要 Az ...
- 使用 Github Actions 自动部署 Angular 应用到 Github Pages
前言 最近在学习 Angular,一些基础的语法也学习的差不多了,就在 github 上新建了一个代码仓库,准备用 ng-zorro 搭个后台应用的模板,方便自己以后写些小东西时可以直接使用.前端项目 ...
- 使用GitHub Actions自动编译部署hexo博客
前言 使用hexo博客也挺久的,最开始是本地hexo clean && hexo g,最后hexo d推送到服务器.后来是本地hexo clean && hexo g, ...
随机推荐
- CSS3新增特性\HTML标签类型
RGBA:透明度 作用: 设置透明度(R G B A) opacity:不透明度 文字也会被设置不透明度 圆角 border-radius:圆角{左上角,右上角.. ...
- linux网络相关命令之脚本和centos启动流程
nice 功用:设置优先权,可以改变程序执行的优先权等级.等级的范围从-19(最高优先级)到20(最低优先级).优先级为操作系统决定cpu分配的参数,优先级越高,所可能获得的 cpu时间越长. 语法: ...
- 使用buffered流结合byte数组,读入文件中的内容,包括中文字符
package com.itcast.demo05.Buffered;import java.io.BufferedInputStream;import java.io.FileInputStream ...
- java的父类声明,子类实例化(强制类型转换导致异常ClassCastException)
一.使用原因 父类声明,子类实例化,既可以使用子类强大的功能,又可以抽取父类的共性. 二.使用要点 1.父类类型的引用可以调用父类中定义的所有属性和方法: 2.父类中方法只有在是父类中定义而在子类中没 ...
- C# 使用管理员权限运行程序
最近在开发OPCServer组件过程中,在注册opcServer是总是返回false,后来查找原因得知在本地主机注册opcServer时,需要使用管理员权限. OPCServer在一台机器上部署时只需 ...
- 启动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
- 转:KVC 与 KVO 理解
KVC 与 KVO 理解 On 2012 年 6 月 7 日, in iPhone, by donly KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲 ...
- python简单爬虫的实现
python强大之处在于各种功能完善的模块.合理的运用可以省略很多细节的纠缠,提高开发效率. 用python实现一个功能较为完整的爬虫,不过区区几十行代码,但想想如果用底层C实现该是何等的复杂,光一个 ...
- 7.2 Tornado异步
7.2 Tornado异步 因为epoll主要是用来解决网络IO的并发问题,所以Tornado的异步编程也主要体现在网络IO的异步上,即异步Web请求. 1. tornado.httpclient.A ...
- Solon 1.6.10 重要发布,现在有官网喽!
关于官网 千呼万唤始出来: https://solon.noear.org .整了一个月多了,总体样子有了...还得不断接着整! 关于 Solon Solon 是一个轻量级应用开发框架.支持 Web. ...