思路浅析

  使用 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 资源的自动化部署的更多相关文章

  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. OSGI 理论知识

    下面列出了主要的控制台命令: 表 1. Equinox OSGi 主要的控制台命令表 类别 命令 含义 控制框架 launch 启动框架 shutdown 停止框架 close 关闭.退出框架 exi ...

  2. Dubbo多注册中心

    一.创建提供者08-provider-registers (1) 创建工程 直接复制05-provider-group工程,并命名为08-provider-registers (2) 修改配置文件 二 ...

  3. 测试数据库并发压力的shell脚本

    本节内容:一例用于测试数据库并发压力的shell脚本代码. 例子: #!/bin/bash #********************************# #并发后台运行fun # #for w ...

  4. java 9+版本中,接口的内容总结

    java 9+版本中,接口的内容可以有: 1.成员变量其实是常量,格式: [public]  [static]  [final] 数据类型 常量名称=数据值: 注意: 常量必须进行赋值,而且一旦赋值不 ...

  5. 解决在进行socket通信时,一端输出流OutputStream不关闭,另一端输入流就接收不到数据

    输出的数据需要达到一定的量才会向另一端输出,所以在传输数据的末端添加 \r\n 可以保证不管数据量是多少,都立刻传输到另一端.

  6. MyEclipse配置Spring框架(基础篇)

    一.新建项目,添加spring的相关jar包等 二.创建相关类以及属性和方法 Student.java package com.yh; public class Student implements ...

  7. C# 温故知新 第二篇 C# 程序的通用结构

    C# 程序由一个或多个文件组成. 每个文件均包含零个或多个命名空间. 一个命名空间包含类.结构.接口.枚举.委托等类型或其他命名空间. 以下示例是包含所有这些元素的 C# 程序主干. 主要包括  1. ...

  8. Android 内存泄漏检测工具 LeakCanary(Kotlin版)的实现原理

    LeakCanary 是一个简单方便的内存泄漏检测框架,做 android 的同学基本都收到过 LeakCanary 检测出来的内存泄漏.目前 LeakCanary 最新版本为 2.7 版本,并且采用 ...

  9. CPU测试工具

    目录 一.简介 二.大量计算 三.大量IO 四.大量进程 一.简介 使用stress-ng是一个 Linux 系统压力测试工具,模拟进程平均负载升高的场景. 使用sysstat来检查监控和分析. mp ...

  10. 超!超!超简单,Linux安装Docker

    1.安装依赖yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 sudo yum install -y yum-utils device-ma ...