使用 PowerShell 创建具有静态公共 IP 的 VM

可以在 Azure 中创建虚拟机 (VM),然后通过使用公共 IP 地址向公共 Internet 公开这些虚拟机。 默认情况下,公共 IP 是动态的,并且在删除 VM 时,关联到它们的地址可能会更改。 若要确保 VM 始终使用同一公共 IP 地址,需要创建一个静态公共 IP。

在 VM 中实现静态公共 IP 之前,有必要了解何时可以使用静态公共 IP,以及如何使用它们。 阅读 IP 寻址概述,了解有关 Azure 中 IP 寻址的详细信息。

Note

Azure 具有两种不同的部署模型,用于创建和处理资源:Resource Manager 模型和经典模型。本文介绍如何使用 Resource Manager 部署模型。Azure 建议对大多数新的部署使用该模型,而不是经典部署模型。

方案

本文档将指导完成使用分配给虚拟机 (VM) 的静态公共 IP 地址的部署。 在此方案中,你有一个具有自己的静态公共 IP 地址的 VM。 VM 属于名为 FrontEnd 的子网,并且在该子网中还具有一个静态专用 IP 地址 (192.168.1.101)。

需要 SSL 连接并且其中的 SSL 证书链接到 IP 地址的 Web 服务器可能需要静态 IP 地址。

图像说明

你可以按照以下步骤来部署上图中所示的环境。

先决条件:安装 Azure PowerShell 模块

若要执行本文中的步骤,需要 安装和配置 Azure PowerShell ,始终按照说明登录到 Azure 并选择订阅。

Note

如果你没有 Azure 帐户,需要获取一个。 可以在此处注册 1 元试用帐户

步骤 1 - 启动脚本

可在此处下载所用的完整 PowerShell 脚本。按照以下步骤更改脚本,以便用于具体环境。

根据需要用于部署的值更改以下变量的值。以下值映射到本文中使用的方案:

# Set variables resource group
$rgName                = "IaaSStory"
$location              = "China North"

# Set variables for VNet
$vnetName              = "WTestVNet"
$vnetPrefix            = "192.168.0.0/16"
$subnetName            = "FrontEnd"
$subnetPrefix          = "192.168.1.0/24"

# Set variables for storage
$stdStorageAccountName = "iaasstorystorage"

# Set variables for VM
$vmSize                = "Standard_A1"
$diskSize              = 127
$publisher             = "MicrosoftWindowsServer"
$offer                 = "WindowsServer"
$sku                   = "2012-R2-Datacenter"
$version               = "latest"
$vmName                = "WEB1"
$osDiskName            = "osdisk"
$nicName               = "NICWEB1"
$privateIPAddress      = "192.168.1.101"
$pipName               = "PIPWEB1"
$dnsName               = "iaasstoryws1"

步骤 2 - 为你的 VM 创建必要的资源

在创建 VM 之前,你需要可供 VM 使用的资源组、VNet、公共 IP 和 NIC。

  1. 创建新的资源组。

    New-AzureRmResourceGroup -Name $rgName -Location $location
    
  2. 创建 VNet 和子网。

    $vnet = New-AzureRmVirtualNetwork -ResourceGroupName $rgName -Name $vnetName `
        -AddressPrefix $vnetPrefix -Location $location
    
    Add-AzureRmVirtualNetworkSubnetConfig -Name $subnetName `
        -VirtualNetwork $vnet -AddressPrefix $subnetPrefix
    
    Set-AzureRmVirtualNetwork -VirtualNetwork $vnet
    
  3. 创建公共 IP 资源。

    $pip = New-AzureRmPublicIpAddress -Name $pipName -ResourceGroupName $rgName `
        -AllocationMethod Static -DomainNameLabel $dnsName -Location $location
    
  4. 使用公共 IP 为上面创建的子网中的 VM 创建网络接口 (NIC)。请注意第一个用于从 Azure 检索 VNet 的 cmdlet。该 cmdlet 是必需的,因为现有 VNet 是通过执行 Set-AzureRmVirtualNetwork 进行更改的。

    $vnet = Get-AzureRmVirtualNetwork -Name $vnetName -ResourceGroupName $rgName
    $subnet = Get-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $vnet -Name $subnetName
    $nic = New-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $rgName `
        -Subnet $subnet -Location $location -PrivateIpAddress $privateIPAddress `
        -PublicIpAddress $pip
    
  5. 创建存储帐户,以托管 VM OS 驱动器。

    $stdStorageAccount = New-AzureRmStorageAccount -Name $stdStorageAccountName `
    -ResourceGroupName $rgName -Type Standard_LRS -Location $location
    

步骤 3 - 创建 VM

现在,所有必需的资源均已就绪,你可以创建新的 VM 了。

  1. 创建 VM 配置对象。

    $vmConfig = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize
    
  2. 获取 VM 本地管理员帐户的凭据。

    $cred = Get-Credential -Message "Type the name and password for the local administrator account."
    
  3. 创建 VM 配置对象。

    $vmConfig = Set-AzureRmVMOperatingSystem -VM $vmConfig -Windows -ComputerName $vmName `
        -Credential $cred -ProvisionVMAgent -EnableAutoUpdate
    
  4. 设置 VM 的操作系统映像。

    $vmConfig = Set-AzureRmVMSourceImage -VM $vmConfig -PublisherName $publisher `
        -Offer $offer -Skus $sku -Version $version
    
  5. 配置 OS 磁盘。

    $osVhdUri = $stdStorageAccount.PrimaryEndpoints.Blob.ToString() + "vhds/" + $osDiskName + ".vhd"
    $vmConfig = Set-AzureRmVMOSDisk -VM $vmConfig -Name $osDiskName -VhdUri $osVhdUri -CreateOption fromImage
    
  6. 将 NIC 添加到 VM。

    $vmConfig = Add-AzureRmVMNetworkInterface -VM $vmConfig -Id $nic.Id -Primary
    
  7. 创建 VM。

    New-AzureRmVM -VM $vmConfig -ResourceGroupName $rgName -Location $location
    
  8. 保存脚本文件。

步骤 4 - 运行脚本

进行必要的更改并理解上面显示的脚本以后,可运行该脚本。

  1. 在 PowerShell 控制台或 PowerShell ISE 中,运行上述脚本。
  2. 几分钟后,应显示以下输出:

    ResourceGroupName : IaaSStory
    Location          : chinanorth
    ProvisioningState : Succeeded
    Tags              : 
    ResourceId        : /subscriptions/[Subscription ID]/resourceGroups/IaaSStory
    
    AddressSpace      : Microsoft.Azure.Commands.Network.Models.PSAddressSpace
    DhcpOptions       : Microsoft.Azure.Commands.Network.Models.PSDhcpOptions
    Subnets           : {FrontEnd}
    ProvisioningState : Succeeded
    AddressSpaceText  : {
                          "AddressPrefixes": [
                            "192.168.0.0/16"
                          ]
                        }
    DhcpOptionsText   : {}
    SubnetsText       : [
                          {
                            "Name": "FrontEnd",
                            "AddressPrefix": "192.168.1.0/24"
                          }
                        ]
    ResourceGroupName : IaaSStory
    Location          : chinanorth
    ResourceGuid      : [Id]
    Tag               : {}
    TagsTable         : 
    Name              : WTestVNet
    Etag              : W/"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
    Id                : /subscriptions/[Subscription ID]/resourceGroups/IaaSStory/providers/Microsoft.Network/virtualNetworks/WTestVNet
    
    AddressSpace      : Microsoft.Azure.Commands.Network.Models.PSAddressSpace
    DhcpOptions       : Microsoft.Azure.Commands.Network.Models.PSDhcpOptions
    Subnets           : {FrontEnd}
    ProvisioningState : Succeeded
    AddressSpaceText  : {
                          "AddressPrefixes": [
                            "192.168.0.0/16"
                          ]
                        }
    DhcpOptionsText   : {
                          "DnsServers": []
                        }
    SubnetsText       : [
                          {
                            "Name": "FrontEnd",
                            "Etag": [Id],
                            "Id": "/subscriptions/[Subscription ID]/resourceGroups/IaaSStory/providers/Microsoft.Network/virtualNetworks/WTestVNet/subnets/FrontEnd",
                            "AddressPrefix": "192.168.1.0/24",
                            "IpConfigurations": [],
                            "ProvisioningState": "Succeeded"
                          }
                        ]
    ResourceGroupName : IaaSStory
    Location          : chinanorth
    ResourceGuid      : [Id]
    Tag               : {}
    TagsTable         : 
    Name              : WTestVNet
    Etag              : [Id]
    Id                : /subscriptions/[Subscription Id]/resourceGroups/IaaSStory/providers/Microsoft.Network/virtualNetworks/WTestVNet
    
    TrackingOperationId : [Id]
    RequestId           : [Id]
    Status              : Succeeded
    StatusCode          : OK
    Output              : 
    StartTime           : [Subscription Id]
    EndTime             : [Subscription Id]
    Error               : 
    ErrorText           :