zoukankan      html  css  js  c++  java
  • 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 虚机

  • 相关阅读:
    .NET 2.0 WinForm Control DataGridView 编程36计(一)
    Sql Server 日期格式化函数
    FastReport 金额大小写转换自定义函数
    vue.js 三种方式安装(vuecli)
    Android style
    android ui 布局性能优化
    android 手机分辨率
    TCP,IP,HTTP,SOCKET区别和联系
    android2.2 特性
    常见开放api平台OpenAPI
  • 原文地址:https://www.cnblogs.com/sparkdev/p/10070379.html
Copyright © 2011-2022 走看看