乐趣区

关于devops:掌握自动化部署拿下DevOps半壁江山还远吗

大家好,我是本期的微软 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_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}}

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


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

退出移动版