Terraform:建立 Azure 虛機
筆者在前文《Terraform 簡介》中簡單介紹了 Terraform 相關的概念,本文讓我們使用 Terraform 在 Azure 上建立一個虛機,以此來直觀體驗一下 Terraform 強大威力。說明:本文的演示環境為 ubuntu 16.04。
provider 與 resource
在 Terraform 的配置檔案中,比較常見的配置型別有 provider 和 resource。
provider在 Terraform 中負責管理資源的生命週期:建立、讀取、更新、刪除。比如訪問 AWS 中的資源需要使用 AWS 的 provider,訪問 Azure 中的資源需要使用 Azure 的 provider。
resource是基礎設施的一個元件。它可能是一些低階元件,例如物理伺服器、虛擬機器或容器。也可以是更高級別的元件,如電子郵件提供程式、DNS記錄或資料庫提供程式。
指定 provider
provider "azurerm" { }
訪問 Azure 中的資源需要使用 Azure 的 provider,即這裡的 "azurerm"。這裡沒有把訪問 azure 的認證資訊寫進來,還是以前文《Terraform 簡介》中設定環境變數的方式來提供認證資訊。
建立 Resource Group
下面的配置檔案在 eastasia 的資料中心建立名稱為 NickResourceGroup 的 Resource Group:
resource "azurerm_resource_group" "nicktfrg" { name = "NickResourceGroup" location = "eastasia" tags { environment = "My Terraform Demo" } }
在配置檔案的其他部分中,可以使用 ${azurerm_resource_group.nicktfrg.name} 引用該 Resource Group。
建立虛擬網路
下面的配置在 Resource Group NickResourceGroup 中建立名為 NickVnet 的虛擬網路,其網路空間為 10.0.0.0/16:
resource "azurerm_virtual_network" "nicktfnetwork" { name= "NickVnet" address_space= ["10.0.0.0/16"] location= "eastasia" resource_group_name = "${azurerm_resource_group.nicktfrg.name}" tags { environment = "My Terraform Demo" } }
然後在 NickVnet 虛擬網路中建立名稱為 NickSubnet 的子網:
resource "azurerm_subnet" "nicktfsubnet" { name= "NickSubnet" resource_group_name= "${azurerm_resource_group.nicktfrg.name}" virtual_network_name = "${azurerm_virtual_network.nicktfnetwork.name}" address_prefix= "10.0.2.0/24" }
建立公共 IP 地址
如果要通過網路訪問 Azure 雲端的虛機,需要建立公共的 IP 地址並分配給虛機。下面的配置建立名為 nickPublicIP 的公共 IP 地址:
resource "azurerm_public_ip" "nicktfpublicip" { name= "NickPublicIP" location= "eastasia" resource_group_name= "${azurerm_resource_group.nicktfrg.name}" public_ip_address_allocation = "dynamic" tags { environment = "My Terraform Demo" } }
建立網路安全組
網路安全組控制出入虛機的網路流量。 下面的配置建立名為 NickNetworkSecurityGroup 的網路安全組並定義規則放行 TCP 埠 22 上的 SSH 資料包:
resource "azurerm_network_security_group" "nicktfnsg" { name= "NickNetworkSecurityGroup" location= "eastasia" resource_group_name = "${azurerm_resource_group.nicktfrg.name}" security_rule { name= "SSH" priority= 1001 direction= "Inbound" access= "Allow" protocol= "Tcp" source_port_range= "*" destination_port_range= "22" source_address_prefix= "*" destination_address_prefix = "*" } tags { environment = "My Terraform Demo" } }
建立虛擬網絡卡
虛擬網絡卡(NIC)將虛機連線到指定的虛擬網路、公共 IP 地址和網路安全組。下面的 Terraform 配置資訊建立名為 NickNIC 的虛擬 NIC,並連線到已建立的虛擬網路資源:
resource "azurerm_network_interface" "nicktfnic" { name= "NickNIC" location= "eastasia" resource_group_name = "${azurerm_resource_group.nicktfrg.name}" network_security_group_id = "${azurerm_network_security_group.nicktfnsg.id}" ip_configuration { name= "NickNicConfiguration" subnet_id= "${azurerm_subnet.nicktfsubnet.id}" private_ip_address_allocation = "dynamic" public_ip_address_id= "${azurerm_public_ip.nicktfpublicip.id}" } tags { environment = "My Terraform Demo" } }
建立儲存賬戶
若要為新建的虛機儲存啟動診斷日誌,需要一個儲存帳戶。這些啟動診斷日誌有助於排查故障和監視虛機狀態。這裡建立的儲存帳戶僅用於儲存啟動診斷資料。由於每個儲存帳戶必須具有唯一名稱,下面的配置會先生成一些隨機文字:
resource "random_id" "randomId" { keepers = { # Generate a new ID only when a new resource group is defined resource_group = "${azurerm_resource_group.nicktfrg.name}" } byte_length = 8 }
接下來就可以建立儲存帳戶了。 下面的配置會建立一個儲存帳戶,其名稱基於上一步中生成的隨機文字:
resource "azurerm_storage_account" "nicktfstorageaccount" { name= "nicksa${random_id.randomId.hex}" resource_group_name = "${azurerm_resource_group.nicktfrg.name}" location= "eastasia" account_replication_type = "LRS" account_tier = "Standard" tags { environment = "My Terraform Demo" } }
建立虛機
準備好上面的資源後就可以開始建立虛機了,下面的配置建立名為 NickVM 的虛機,並新增虛擬網絡卡 NickNIC。 新的虛機基於 Ubuntu 16.04 LTS 映像並禁止通過密碼登入,同時會建立一個可以通過祕鑰登入的名稱為 nick 的使用者。注意,ssh_keys 部分提供了 SSH 金鑰資料,key_data 欄位需要提供使用者的有效 SSH 公鑰:
resource "azurerm_virtual_machine" "nicktfvm" { name= "NickVM" location= "eastasia" resource_group_name= "${azurerm_resource_group.nicktfrg.name}" network_interface_ids = ["${azurerm_network_interface.nicktfnic.id}"] vm_size= "Standard_DS1_v2" storage_os_disk { name= "NickOsDisk" caching= "ReadWrite" create_option= "FromImage" managed_disk_type = "Premium_LRS" } storage_image_reference { publisher = "Canonical" offer= "UbuntuServer" sku= "16.04.0-LTS" version= "latest" } os_profile { computer_name= "phoenix" admin_username = "nick" } os_profile_linux_config { disable_password_authentication = true ssh_keys { path= "/home/nick/.ssh/authorized_keys" key_data = "xxxxxxxxxxxxxxxxxx" } } boot_diagnostics { enabled= "true" storage_uri = "${azurerm_storage_account.nicktfstorageaccount.primary_blob_endpoint}" } tags { environment = "My Terraform Demo" } }
到這裡配置檔案就完成了,完整的配置檔案內容請參考 ofollow,noindex">這裡 。
執行部署
建立 Terraform 配置檔案(也被稱為模板)後,第一步是初始化 Terraform。這一步會安裝 配置檔案中用到的所有 Terraform 外掛:
$ terraform init
然後執行 plan 驗證配置檔案的正確性(關於登入 Azure 的認證資訊,請參考前文《Terraform 簡介》):
$ . azureEnv.sh $ terraform plan
檢查 plan 的輸出,如果符合預期,就可以通過 apply 執行實際的部署了:
$ terraform apply -auto-approve
檢查結果
從 portal 上登入 Azure 檢視我們建立的 Resouce Group NickResourceGroup,其中的資源包括虛擬機器 NickVM 及其相關的網絡卡、Public IP 地址、虛擬網路、網路安全組、儲存等元件:
獲取虛機的公共 IP 地址
在 portal 上的 Cloud Shell 中執行下面的命令獲得新建虛機的 IP 地址:
$ az vm show --resource-group NickResourceGroup --name NickVM -d --query [publicIps] --o tsv
或者是直接在 portal 上檢視虛機的資訊:
Line"/>
通過 SSH 登入虛機
$ ssh [email protected]
這就可以開始工作了(當然對於一個系統管理員來說,所謂的工作就常常是指以自動化的方式在虛機上部署各種應用)!
總結
如果你看過筆者的《 Azure 基礎:使用 powershell 建立虛擬機器 》一文,你會發現本文的結構與其高度相似。其實不管是通過 PowerShell 還是 Azure CLI,或者是本文介紹的 Terraform(當然,Terraform 強大的功能讓它具有非常大的優勢),我們操作的資源物件都是一樣的。當你手中有多個工具時,你就可以根據具體的場景選擇最佳的方式完成任務。