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

微软MVP实验室研究员


贠乾
微软最有价值专家,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/Allen...

接下来须要增加以下机密信息
  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_statsenv:  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 }}

运行 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/...

总结

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

GitHub Action 工作流程中设置 Secrets:
https://github.com/Azure/acti...

Azure服务主体:
https://www.cnblogs.com/Allen...

GitHub:
https://github.com/yunqian44/...


扫码关注公众号,获到更多技术知识点