思路淺析

使用 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/[email protected]
- name: Azure Login
uses: azure/[email protected]
with:
creds: ${{ secrets.AZURE_CREDENTIALS }}
enable-AzPSSession: false
environment: azurecloud
allow-no-subscriptions: false
- name: Azure CLI script
uses: azure/[email protected]
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/[email protected]
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/[email protected]
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/[email protected]
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/[email protected]
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/[email protected]
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, ...

  10. Github Actions 實踐

    Github Actions 實踐 Github Actions 是 Github 的持續集成服務,通過在 repo 發生特定的行為時執行指定的命令實現自動測試.自動部署等功能. 基本術語 workf ...

隨機推薦

  1. Linux5.5安裝10g rac

    以前安裝總結的,現把它貼出來,雖然10g現在慢慢越少了,但也有不少生產庫跑10g的. 1.vi /etc/hosts 10.168.39.243    orcldb1   10.168.39.245  ...

  2. sql 判斷一個錶的數據不在另一個錶中

    SELECT a.* FROM a LEFT JOIN b ON a.key = b.key WHERE (b.key IS NULL) end as flag from a select id fr ...

  3. Linux Shell編程(1)——shell編程簡介

    Shell是一個命令解釋器.它不僅是操作系統內核與用戶之間的絕緣層,同時也是一種功能相當强大的編程語言.一個Shell程序,通常稱為脚本,它是一個由系統調用,命令工具,軟件包和已編譯的二進制包&quo ...

  4. 【百度地圖API】如何獲取行政區域的邊界?

    原文:[百度地圖API]如何獲取行政區域的邊界? 摘要:以前教過大家如何自行獲取行政區域,或者自定義獲取一個區域的邊界值.今天來教大家直接調用百度地圖API1.3(目前最新版本)來獲取行政區域的邊界值 ...

  5. step_by_step_xUnit_Net_ABP

    這段日子的開發一直使用Asp.net Boilerplate ,稱之為項目模板自然就有開發中常用的功能,測試框架也在其中,土牛的ABP源代碼都有通過測試,很遺憾的是我之前沒有寫過測試,不會就要去找資料 ...

  6. Tools.Eclipse.HowToImportAnAndroidLibraryProjectIntoWorkspace

    1. File->New->Other Picture-1 2. Select "Android Project from Existing Code", and cl ...

  7. Django Forms實例

    # Django的Form主要具有一下幾大功能: # # 生成HTML標簽 # 驗證用戶數據(顯示錯誤信息) # HTML Form提交保留上次提交數據 # 初始化頁面顯示內容 # forms組件生成 ...

  8. JQuery中Table標簽頁和無縫滾動

    HTML代碼: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...

  9. aws rds

    1.還原快照,注意設置安全組的問題:不然會導致還原後連接不上:

  10. 團體程序設計天梯賽L1-022 奇偶分家 2017-03-22 17:48 81人閱讀 評論(0) 收藏

    L1-022. 奇偶分家 時間限制 400 ms 內存限制 65536 kB 代碼長度限制 8000 B 判題程序 Standard 作者 陳越 給定N個正整數,請統計奇數和偶數各有多少個? 輸入格式 ...