筆者在前文中介紹了如何使用 PowerShell 腳本在 Azure 上創建虛擬主機。正如你所看到的,整個創建過程還是有點繁瑣的,因為我們需要使用 PowerShell 腳本創建並關聯所有相關的組件。其實 Azure 為運維人員提供了效率更高的操作方式:模板。我們可以通過聲明式的語法來創建模板,然后通過模板來簡化部署操作。
Azure 提供了強大的模板功能,不僅支持用戶創建模板,還可以從當前的配置中導出模板。本文暫不關注創建模板的細節,只是把前文腳本創建的資源中導出為模板,並通過導出的模板創建新的資源。
從現有的資源導出模板
MS 建議我們盡量把同一個項目中的資源放置在同一個 resource manager 中管理,所以前文中我們在常見虛擬主機的同時創建了一個新的名為 vmpool 的 resource manager:
所有創建的資源都屬於這個 resource manager。接下來我們就把這個 resource manager 中的所有資源都導出到模板中。如下圖所示,先選擇 "Automation script",然后點 "Download" 就可以了:
打開下載到的壓縮包,里面的文件如下:
Azure 默認支持通過 PowerShell, shell, ruby 和 C# 部署模板,並提供了相應的腳本文件。也就是說我們只需要執行下載到的 PowerShell 腳本就可以部署一個和 vmpool 一模一樣的 resource group 了!
接下來我們使用 powershell 腳本進行演示,簡單起見我們只保留 deploy.ps1 和 template.json, 其它文件都刪除掉。
修改模板中默認的名稱
如果我們使用同一個訂閱號進行部署,需要修改一下模板文件中 stroage account 的名稱,不然的話會和已經存在的資源名稱發生沖突。這里我們在 template.json 文件中默認的 stroage account 名稱前面添加 "check" 字樣:
依賴問題
筆者在測試的過程中碰到了一個很奇怪的依賴錯誤:
提示出現了循環引用,按照提示找到 template.json 文件中對應的行。查看之后感覺模板文件應該是正確的,按理說不應該有這樣的錯誤提示。但是嘗試了好幾次都是相同的錯誤,索性刪除提示出錯的行:
把紅框中的行刪除,不要忘記刪除前面的一個逗號。然后重試,錯誤消失。按理說新建的 networkinterfaces 和虛機有依賴關系是沒有問題的,但是卻出問題了,估計是個 bug。
執行命令進行部署
在執行 PowerShell 腳本進行部署前,我們還需要確定幾個參數。首先是你的訂閱號的 ID,這個參數決定你的資源被部署在哪個訂閱號的下面。還有就是新的 resource group 的名稱和位置。最后需要給本次的部署起個名字:
-subscriptionId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -resourceGroupName "checkRG" -resourceGroupLocation "Korea Central" -deploymentName "testdeployment"
如果不在命令行中指定這些參數就需要在執行過程中和用戶交互。我們希望做到自動化的部署過程,所以應該事先准備好這些參數,從而避免執行過程中的交互操作。因此最后我們要執行的部署命令為:
./deploy.ps1 -subscriptionId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" `
-resourceGroupName "checkRG" `
-resourceGroupLocation "Korea Central" `
-deploymentName "testdeployment"
執行上面的命令,我們會得到一個名為 checkRG 的 resource group,其內容和母版 vmpool 幾乎是一樣的(storage account 的名稱不一樣):
訪問權限問題
在 azure 上執行操作需要用戶先進行登錄,那么在 PowerShell 腳本中該如何做呢(需要避免執行腳本的過程中與用戶交互)?
筆者在《Azure 基礎:用 PowerShell 自動登錄》一文中有詳細的介紹,有興趣的朋友可以參考。
總結
本文通過一個簡單的 demo 演示了如何通過 PowerShell 和模板在 azure 上部署資源。與單純的使用 PowerShell 腳本來創建所有的資源相比,使用模板可以簡化整個部署的過程。並且模板使用的是 json 格式,與具體的編程語言無關。你可以使用任何 Azure 支持的語言來部署模板中聲明的資源。