天天看點

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"         }     }      

到這裡配置檔案就完成了,完整的配置檔案内容請參考這裡。

執行部署

建立 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 位址、虛拟網絡、網絡安全組、存儲等元件:

Terraform:建立 Azure 虛機

擷取虛機的公共 IP 位址

在 portal 上的 Cloud Shell 中執行下面的指令獲得建立虛機的 IP 位址:

$ az vm show --resource-group NickResourceGroup --name NickVM -d --query [publicIps] --o tsv      

或者是直接在 portal 上檢視虛機的資訊:

Terraform:建立 Azure 虛機

通過 SSH 登入虛機

$ ssh [email protected]      
Terraform:建立 Azure 虛機

這就可以開始工作了(當然對于一個系統管理者來說,所謂的工作就常常是指以自動化的方式在虛機上部署各種應用)!

總結

如果你看過筆者的《Azure 基礎:使用 powershell 建立虛拟機》一文,你會發現本文的結構與其高度相似。其實不管是通過 PowerShell 還是 Azure CLI,或者是本文介紹的 Terraform(當然,Terraform 強大的功能讓它具有非常大的優勢),我們操作的資源對象都是一樣的。當你手中有多個工具時,你就可以根據具體的場景選擇最佳的方式完成任務。

參考:

在 Azure 中使用 Terraform 建立 Linux 虛機

作者:sparkdev

出處:http://www.cnblogs.com/sparkdev/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

繼續閱讀