Infrastructure-as-code直譯就是將基礎(chǔ)架構(gòu)作為代碼,是自動化部署重要的一環(huán)驾凶,具有易遷移牙甫,易伸縮,相對風(fēng)險低等優(yōu)勢调违。隨著生產(chǎn)和交付周期數(shù)量和頻率增加窟哺,IaC作為DevOps的最佳實踐之一,使構(gòu)建和配置基礎(chǔ)架構(gòu)更加高效技肩。
這一篇我們將介紹Azure Resource Manager且轨,并且以GitHub為例,如何在DevOps管道中使用ARM虚婿。
Azure Resource Manager
我們先來看一下Azure提供的IaC工具旋奢。Azure資源管理器(ARM)是為部署和管理Azure資源提供的服務(wù),是Azure特定的IaC工具然痊,允許對資源進行部署至朗,維護和追蹤。
ARM通過聲明性模板而非腳本來管理基礎(chǔ)結(jié)構(gòu)剧浸。Azure Resource Manager templates (ARM templates)是定義項目基礎(chǔ)結(jié)構(gòu)和配置的JSON文件锹引,包含六個頂級元素schema
矗钟、contentVersion
、parameters
吨艇、variables
、resources
、output
祸挪。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "",
"apiProfile": "",
"parameters": { },
"variables": { },
"functions": [ ],
"resources": [ ],
"outputs": { }
}
我們可以使用 Visual Studio Code和模板工具擴展來創(chuàng)作模板增热;如果不熟悉 Azure 部署和 JSON 格式公黑,也可以通過在Azure門戶中導(dǎo)出來獲取現(xiàn)有資源組的模板。
有了模板以后涩金,我們可以通過Azure門戶/Azure CLI/Powershell進行模板的部署副渴。以下使用Azure CLI部署本地模板azuredeploy.json
為例。若要部署外部模板,將template-file
改為template-uri
參數(shù)即可一喘。此外根據(jù)部署范圍不同使用不同的命令,以下group
為部署到資源組。還有更多參數(shù)以滿足不同部署需要,例如mode參數(shù),可以指定部署為增量更新還是完整更新评雌。
az deployment group create \
--name ExampleDeployment \
--resource-group ExampleGroup \
--template-file azuredeploy.json \
--parameters storageAccountType=Standard_GRS
聲明性模板的好處在于你不必了解后面到底是怎么調(diào)用完成資源的配置耐薯,ARM對請求進行身份驗證和授權(quán)后,將模板轉(zhuǎn)換為 REST API 操作,會發(fā)送到相關(guān)資源提供程序,配置資源。
使用ARM在GitHub中進行持續(xù)部署
基本了解ARM之后吓懈,我們來看一下如何在DevOps過程中加入ARM的使用耍攘,作為IaC的方式式曲,提升軟件開發(fā)的效率吝羞。以下以GitHub為例
-
首先將部署存儲賬號的ARM模板上傳到Repository符衔。
我們需要通過Service Principal 來連接Azure與GitHub判族。這里的范圍為某一資源組。
az ad sp create-for-rbac --name {myApp} --role contributor --scopes /subscriptions/{subscription-id}/resourceGroups/{MyResourceGroup} --sdk-auth
-
創(chuàng)建成功后项戴,記錄
clientId
,clientSecret
,subscriptionId
和tenantId
形帮,并在GitHub里新建Secret。
-
以同樣的方式新建
AZURE_RG
和AZURE_SUBSCRIPTION
,分別放入Service Principal的范圍中辩撑,Azure資源組的名字和Azure的訂閱ID界斜,我們會在部署ARM模板時用到這些。
- 在GitHub的Action選項下合冀,新建workflow锄蹂。在右側(cè)的marketplace,可以搜索相關(guān)模塊水慨。首先我們需要添加Azure Login,使用我們剛剛在Secret中添加的
AZURE_CREDENTIALS
進行認(rèn)證敬扛。
- 搜索并復(fù)制Deploy Azure Resource Manager (ARM) Template的內(nèi)容到.yml文件中晰洒,填入相關(guān)的變量值后commit。注意根據(jù)模板的schema啥箭,這里scope選擇resourcegroup谍珊。
- yaml文件如下。
name: CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Azure Login
uses: Azure/login@v1
with:
# Paste output of `az ad sp create-for-rbac` as value of secret variable: AZURE_CREDENTIALS
creds: '${{ secrets.AZURE_CREDENTIALS }}'
# Set?this?value?to?true?to?enable?Azure?PowerShell?Login?in?addition?to?Az?CLI?login
- name: Deploy Azure Resource Manager (ARM) Template
uses: Azure/arm-deploy@v1
with:
# Provide the scope of the deployment. Valid values are: 'resourcegroup', 'managementgroup', 'subscription'
scope: 'resourcegroup'
# Provide the Id of the subscription which should be used, only required for resource Group or Subscription deployments.
subscriptionId: ${{ secrets.AZURE_SUBSCRIPTION }}
# Provide the name of a resource group, only required for resource Group deployments.
resourceGroupName: ${{ secrets.AZURE_RG }}
# Specify the path or URL to the Azure Resource Manager template.
template: ./azuredeploy.json
# Incremental (only add resources to resource group) or Complete (remove extra resources from resource group) or Validate (only validates the template).
deploymentMode: Incremental
# Supply deployment parameter values.
parameters: storageAccountType=Standard_LRS
-
回到action中查看情況急侥,可以看到我們的Jobs已運行成功砌滞。
-
到Azure門戶中,確認(rèn)已部署成功
相關(guān)閱讀
ARM 模板文檔 | Microsoft Docs
使用 GitHub Actions 部署資源管理器模板 | Azure Docs
下篇預(yù)告 - Terraform
ARM是針對Azure的IaC工具坏怪,Terraform作為最主流的IaC工具之一贝润,可以管理眾多云服務(wù)提供商(如Azure,Google Cloud铝宵,AWS)的資源打掘,以及定制的內(nèi)部解決方案。
我們可以通過配置文件定義需要的組件鹏秋,Terraform會生成執(zhí)行計劃尊蚁,列出達(dá)到預(yù)期狀態(tài)所需執(zhí)行的操作,然后執(zhí)行該計劃以構(gòu)建所需的基礎(chǔ)結(jié)構(gòu)侣夷。如果需要對配置進行更改横朋,Terraform能夠確定更改的內(nèi)容并創(chuàng)建可以應(yīng)用的增量執(zhí)行計劃。