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 地址、虛擬網絡、網絡安全組、存儲等組件:

獲取虛機的公共 IP 地址
在 portal 上的 Cloud Shell 中執行下面的命令獲得新建虛機的 IP 地址:

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

或者是直接在 portal 上查看虛機的信息:

通過 SSH 登錄虛機

$ ssh nick@13.70.0.72

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

總結

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

參考:
在 Azure 中使用 Terraform 創建 Linux 虛機


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM