Azure 全新推出的部署模式:Azure Resource Manager(ARM,Azure 資源管理器)。有了它,Azure 部署從此變得輕而易舉。 ...
如果老闆讓你在雲平臺上部署一套系統,你準備怎麼做?
嗯,估計得根據具體需求開通或創建一大堆東西:虛擬機、存儲、資料庫、虛擬網路……別急還沒完,接著還要對這些東西的規模、配置等各方面調整和優化。一系列環節折騰下來,時間精力都消耗殆盡……不是說上雲可以更省事,更快捷麽?
童鞋,這是因為你的操作姿勢不對!
你想啊,就跟 Office 軟體一樣,無論你要寫文檔還是做 PPT,如果能事先挑選一個模板,那麼必要的設計和排版都有了,只要把自己的內容填進去,美觀專業的文檔就這麼輕鬆搞定。
那麼雲部署呢?如果也有類似的模板,按需選擇,調整必要參數,原本可能需要兩三天才能搞定的系統,就這麼分分鐘搞定 so easy~
小編在這裡向你隆重介紹 Azure 全新推出的部署模式:Azure Resource Manager(ARM,Azure 資源管理器)。有了它,Azure 部署從此變得輕而易舉。
康威資深工程師,SDN 和大規模數據中心網路專家
負責基於 Azure 的雲計算方案架構咨詢與設計
通過本文內容介紹 ARM 的概念、模板的建立和使用方法
最近 Azure 發佈了 ARM 模式(Azure Resource Manager),其中包含了對於 Resource Manager Template 的支持。什麼是 Resource Template?我們先來看一下 Azure 在 ARM 模式下的邏輯架構:
對於首次接觸公有雲的小伙伴,通常會習慣通過 Azure Portal 門戶來完成相關服務及資源的配置交付(如創建虛擬雲主機,虛擬網路,MySQL 資料庫服務等),我們可以把以上創建的服務及資源抽象為一套配置模板,用於描述所創建的服務及資源。由上圖可見,ASM 模式下用戶與 Azure 雲平臺交互界面的介面包括 Portal,CLI,Visual Studio 等,通過以上介面用戶給出的服務及資源的描述,Azure 平臺通過資源描述中間件(Resource Provider Contract)將客戶的描述轉譯為平臺資源描述並執行服務及資源創建。Azure Portal 通過互動式的 GUI 方式可以友好方便的幫助用戶上手,但是在批量及複雜服務及資源創建時就有些捉襟見肘。
那麼在批量及複雜服務及資源創建時有沒有好的解決辦法呢?Infrastructure As Code 基礎架構即代碼),腳本部署是可行的方案之一,類似所有自動化事務的執行,我們可以將複雜的服務及資源逐一創建並通過腳本實現自動化執行。但是本文在這裡不推薦大家使用上述方法,原因有二:
-
服務及資源的抽象不夠,我們在定義服務及資源的時候希望通過更高級的抽象給出簡單的介面,以便更便捷的定義複雜的服務及資源;
-
傳統的腳本語言的執行以串列順序方式執行,對於複雜的服務及資源定義如果希望實現並行及依賴關係定義是比較複雜的。
這裡給大家介紹的 Azure Resource Template 可以很好的解決上述問題,幫助大家簡單快捷的實現複雜的服務及資源交付,它通過 JSON 語言高級抽象描述資源定義大大降低了用戶的複雜度,同時將並行任務的拆解交給 Azure 平臺資源描述中間件來實現高效,實現 Infrastructure as Code。為方便大家理解,本文後面的內容按照如下順序:
-
工具方法介紹
-
舉例快速開始
-
總結及課題延展
工具方法介紹
工欲善其事必先利其器,得力順手的工具可以讓我們事半功倍。Infrastructure as Code,和其他編程語言一樣,一個好的 IDE 可以為我們保駕護航。微軟為 Azure Resource Template 提供了 Visual Studio + Azure SDK 的工具組合,使用戶可以在 VS 環境下實現開發。主要功能如下:
1、格式檢查。幫助用戶檢查 JSON 格式;
2、基礎模板。微軟已經將 Azure 服務及資源的標準模板定義好,方便客戶調用。另外 GitHub 上還有海量的模板示例作為參考示例,VS 已經跟 Github 做了打通,在創建新項目的時候可以直接引用 Github 的模板,並且模板可以直接通過 VS 調用 Powershell 進行執行;
3、自動補全及函數庫查詢。在 VS 中可以幫助用戶做索引、函數的補全。
VS 的安裝與設置這裡不做贅述,大家可以參閱這篇文章配置安裝。
中國區 Azure 的連接需要修改 VS 的配置文件,可以參考此鏈接。
舉例快速開始
開始之前我們先來設定一個目標場景,在 Azure Portal 上目前我們無法創建多網卡的虛擬機,我們的目標就是通過 Template 部署來實現多網卡虛擬機的交付,同時為了實現模板的復用,希望用戶可以自定義操作系統類型,VM 的規格,以及網卡的數量。
首先我們進行基本模板框架搭建
到此我們已經將一個虛擬機創建的基本模板框架搭建完畢,後面我們都基於這個框架來進行修改來達成我們之前預設的目標,通過 Template 部署來實現多網卡虛擬機的交付,同時為了實現模板的復用,希望用戶可以自定義操作系統類型,VM 的規格,以及網卡的數量。下麵我們先給出最終的實現模板,然後展開介紹,後面的介紹主要側重一些特殊語法的說明,以便大家可以自行編排自己的模板。
對於操作系統類型的定義可通過定義參數完成,通過 allowed Values 的定義可在最終使用模板時實現在交互頁面進行參數選擇以避免手工輸入帶來的錯誤。同理操作系統版本,VM 規格以及網卡數量均可採用類似方法定義。
“LinuxPublisher”: {
“type”: “string”,
“allowedValues”:[ “Ubuntu”, “CentOS” ]
},
變數套用式引用,在 Resource 模板定義中會通過調用參數或變數的方式來實現模板的通用。在此用例中目標創建的虛擬機的操作系統由於有客戶變數來進行選定,所以在虛擬機資源描述部分裡面設計的操作系統的相關描述都需要隨之而變。因為 Ubuntu 和 CentOS 兩個選項對應選項背後,相應的操作系統發行商,操作系統版本等參數都要隨之改變,為了實現資源描述部分的通用性,避免反覆寫兩次資源描述來覆蓋不同操作系統場景,我們採用變數套用式引用。通過定義 linuxUbuntu 和 linuxCentOS 變數來分別描述不同操作系統下相關變數參數,同時定義 linuxtype 變數,其中 linuxtype 的值等於 linux+ 用戶輸入的 LinuxPublisher 參數選項,客戶選定 LinuPublisher 選項後 linuxtype 的最終值將等於 linuxUbuntu 或 linuxCentOS,在後面的虛擬機資源描述的操作系統部分只需要調用 linuxtype 變數對象及可實現對客戶選定操作系統的變數值抽取,以“publisher”: “[variables(‘linuxtype’).imagePublisher]”為例,通過對 linuxtype.imagePublisher 的抽取實現相應操作系統發佈商信息的提取,而且整個資源描述只需要編寫一次。
迴圈描述 copy 可以實現多資源創建,在此例子中客戶可以自定義創建網卡的數量並且每個網卡關聯不同的子網,所以無法預先通過靜態反覆定義的方式將虛擬網路子網資源描述寫死,通過 copy 描述配以客戶輸入的網卡數量 NicNumber 變數作為迴圈次數 count,實現動態創建多個資源的目標。
使用條件語句實現 if or not 邏輯,在上述例子中虛擬機在多網卡場景下只有主網卡綁定公網 IP,在網卡資源描述中,需要公網地址的描述和不需要公網地址的描述是不同的,所以這裡的做法是先靜態描述一塊帶公網地址的網卡資源(因為客戶至少創建 1 塊網卡),在將剩餘的網卡資源描述引入條件語句從而實現當客戶輸入大於 1 塊網卡時(“condition”: “[greater(variables(‘linuxtype’).NicNumber,1)]”),剩餘網卡都按照無公網地址方式進行創建。
動態依賴關係的定義,通常在資源描述中通過 dependsOn 來表示依賴關係,如虛擬機資源需要依賴存儲賬戶及網卡資源。但本例中網卡的數量是變數無法預知,所以在描述依賴關係的時候無法靜態將所依賴的資源 ID 全部放上。這裡採用調用 reference 函數實現隱性依賴關係的描述,在虛擬機資源的 dependsOn 描述中移除網卡的依賴描述,在虛擬機描述中的 networkProfile 部分中定義 id 時,通過 reference 函數抓取 ID,reference 函數會在模板執行過程中抓取 runtime 的 id 值進行返回,只有當相應資源創建完畢時 reference 才會有返回值,從而實現資源依賴關係的隱性描述。
“networkProfile”: {
“copy”: [
{
“name”: “networkInterfaces”,
“count”: “[variables(‘linuxtype’).NicNumber]”,
“input”: {
“id”: “[replace(reference(concat(variables(‘nicName’),copyIndex(‘networkInterfaces’))).ipConfigurations[0].id,’/ipConfigurations/ipconfig1′,”)]”,
“properties”: {
“primary”: “[less(copyIndex(‘networkInterfaces’),1)]”
至此通過本例中幾個基本目標給大家介紹了在模板中常用的一些高級功能,這些功能有助於大家描述定義複雜的服務和資源,實現 Infrastructure as Code 的目標。最後模板一切就緒可以來部署了,Azure 支持通過在 Portal,PowerShell,CLI 中部署模板,其中 Powershell 可以直接在 VS 環境中調用,各種部署方法大家可以參閱這裡。
本文將介紹通過 Portal 的方式進行部署,以便幫助大家理解在模板中定義的參數 Parameter 部分。
總結及課題延展
通過上述例子大家對 Azure Resource Template 應該已經有了一定瞭解。大家可以著手開始自己的 Infrastructure as Code 的旅程,下麵這些資源應該會幫到大家。
最後我們再來談一談延伸的話題,不少用戶也許用過其他雲平臺的類似的模板工具,那麼在多雲場景下豈不是需要維護兩套語言邏輯,這裡簡單提一下 Terraform,它是一個跨平臺的模板語言工具,它可以適配如 AWS,Azure,Alicloud 等雲廠商提供的 template 介面,不僅如此,它還可以適配操作系統配置,應用配置等終端對象,其通過標準的模板描述語言抽象從而實現雲平臺無關以及更複雜的 Infrastructure as Code,有興趣的話可以自行科學上網查詢更多相關資料。
現在準備好手頭的工具開始自己的 Infrastructure as Code 之旅吧。
=
在這種方式的幫助下,我們可以利用他人創建的模板快速搭建所需環境,當然也可以根據自己的具體需求創建模板,在自己公司範圍內使用。當然,還可以將自己的模板分享出來,幫助更多人受益。
你要不要試試看吶!
推薦閱讀
天王蓋地虎寶塔鎮河妖,再給三篇 ARM 的相關文章要不要?要!
對了,瞧小編這記性,差點就忘了一件大事被老闆扣工資了,下麵是大事。
大事:【Azure文檔】菜單上線咯!
小伙伴們可以通過雲科技公眾號主頁底部菜單【瞭解雲】中的【Azure文檔】菜單,一鍵獲取你想得到想不到的 Azure 技術文檔與示例等等無限量資源。
好了,就說這麼多,更多的驚喜等你來發現!