大家好,我是本期的微软 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/…
扫码关注公众号,获到更多技术知识点