Azure 中的每个虚拟机 (VM) 都是基于定义 Windows 分发和操作系统版本的映像创建的。 映像可以包括预安装的应用程序和配置。 Azure 应用商店为最常见的操作系统和应用程序环境提供了许多第一和第三方映像,也可以根据需要创建自己的自定义映像。 本文详细介绍如何使用开源工具 Packer 在 Azure 中定义和生成自定义映像。

创建 Azure 资源组

生成过程中,Packer 将在生成源 VM 时创建临时 Azure 资源。 要捕获该源 VM 用作映像,必须定义资源组。 Packer 生成过程的输出存储在此资源组中。

使用 New-AzureRmResourceGroup 创建资源组。 以下示例在“chinaeast”位置创建名为“myResourceGroup”的资源组:

PowerShell复制
$rgName = "myResourceGroup"
$location = "China East"
New-AzureRmResourceGroup -Name $rgName -Location $location

创建 Azure 凭据

使用服务主体通过 Azure 对 Packer 进行身份验证。 Azure 服务主体是可与应用、服务和自动化工具(如 Packer)结合使用的安全性标识。 用户控制和定义服务主体可在 Azure 中执行的操作的权限。

使用 New-AzureRmADServicePrincipal 创建服务主体,并为服务主体分配权限,以便使用 New-AzureRmRoleAssignment 创建和管理资源:

PowerShell复制
$sp = New-AzureRmADServicePrincipal -DisplayName "Azure Packer IKF" -Password "P@ssw0rd!"
Sleep 20
New-AzureRmRoleAssignment -RoleDefinitionName Contributor -ServicePrincipalName $sp.ApplicationId

若要向 Azure 进行身份验证,还需使用 Get-AzureRmSubscription 获取 Azure 租户 ID 和订阅 ID:

PowerShell复制
$sub = Get-AzureRmSubscription
$sub.TenantId
$sub.SubscriptionId

在下一步中将使用这两个 ID。

定义 Packer 模板

若要生成映像,请创建一个模板作为 JSON 文件。 在模板中,定义执行实际生成过程的生成器和设置程序。 Packer 具有 Azure 设置程序,允许定义 Azure 资源,如在前一步骤中创建的服务主体凭据。

创建名为 windows.json 的文件并粘贴以下内容。 为以下内容输入自己的值:

参数 获取位置
client_id 通过 $sp.applicationId 查看服务主体 ID
client_secret 在 $securePassword 中指定的密码
tenant_id $sub.TenantId 命令的输出
subscription_id $sub.SubscriptionId 命令的输出
object_id 通过 $sp.Id 查看服务主体对象 ID
managed_image_resource_group_name 在第一步中创建的资源组的名称
managed_image_name 创建的托管磁盘映像的名称
JSON复制
{
"builders": [{
"type": "azure-arm", "client_id": "0831b578-8ab6-40b9-a581-9a880a94aab1",
"client_secret": "P@ssw0rd!",
"tenant_id": "72f988bf-86f1-41af-91ab-2d7cd011db47",
"subscription_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",
"object_id": "a7dfb070-0d5b-47ac-b9a5-cf214fff0ae2", "managed_image_resource_group_name": "myResourceGroup",
"managed_image_name": "myPackerImage", "os_type": "Windows",
"image_publisher": "MicrosoftWindowsServer",
"image_offer": "WindowsServer",
"image_sku": "2016-Datacenter", "communicator": "winrm",
"winrm_use_ssl": "true",
"winrm_insecure": "true",
"winrm_timeout": "3m",
"winrm_username": "packer", "azure_tags": {
"dept": "Engineering",
"task": "Image deployment"
}, "cloud_environment_name": "AzureChinaCloud",
"location": "China East",
"vm_size": "Standard_DS2_v2"
}],
"provisioners": [{
"type": "powershell",
"inline": [
"Add-WindowsFeature Web-Server",
"if( Test-Path $Env:SystemRoot\\windows\\system32\\Sysprep\\unattend.xml ){ rm $Env:SystemRoot\\windows\\system32\\Sysprep\\unattend.xml -Force}",
"& $Env:SystemRoot\\System32\\Sysprep\\Sysprep.exe /oobe /generalize /shutdown /quiet"
]
}]
}

此模板生成 Windows Server 2016 VM 并安装 IIS,然后使用 Sysprep 来通用化该 VM。

生成 Packer 映像

如果本地计算机上尚未安装 Packer,请按照 Packer 安装说明进行安装。

按如下所述指定 Packer 模板文件,生成映像:

bash复制
./packer build windows.json

前面命令的输出示例如下所示:

bash复制
azure-arm output will be in this color.

==> azure-arm: Running builder ...
azure-arm: Creating Azure Resource Manager (ARM) client ...
==> azure-arm: Creating resource group ...
==> azure-arm: -> ResourceGroupName : ‘packer-Resource-Group-pq0mthtbtt’
==> azure-arm: -> Location : 'China East'
==> azure-arm: -> Tags :
==> azure-arm: ->> task : Image deployment
==> azure-arm: ->> dept : Engineering
==> azure-arm: Validating deployment template ...
==> azure-arm: -> ResourceGroupName : ‘packer-Resource-Group-pq0mthtbtt’
==> azure-arm: -> DeploymentName : ‘pkrdppq0mthtbtt’
==> azure-arm: Deploying deployment template ...
==> azure-arm: -> ResourceGroupName : ‘packer-Resource-Group-pq0mthtbtt’
==> azure-arm: -> DeploymentName : ‘pkrdppq0mthtbtt’
==> azure-arm: Getting the certificate’s URL ...
==> azure-arm: -> Key Vault Name : ‘pkrkvpq0mthtbtt’
==> azure-arm: -> Key Vault Secret Name : ‘packerKeyVaultSecret’
==> azure-arm: -> Certificate URL : ‘https://pkrkvpq0mthtbtt.vault.azure.cn/secrets/packerKeyVaultSecret/8c7bd823e4fa44e1abb747636128adbb'
==> azure-arm: Setting the certificate’s URL ...
==> azure-arm: Validating deployment template ...
==> azure-arm: -> ResourceGroupName : ‘packer-Resource-Group-pq0mthtbtt’
==> azure-arm: -> DeploymentName : ‘pkrdppq0mthtbtt’
==> azure-arm: Deploying deployment template ...
==> azure-arm: -> ResourceGroupName : ‘packer-Resource-Group-pq0mthtbtt’
==> azure-arm: -> DeploymentName : ‘pkrdppq0mthtbtt’
==> azure-arm: Getting the VM’s IP address ...
==> azure-arm: -> ResourceGroupName : ‘packer-Resource-Group-pq0mthtbtt’
==> azure-arm: -> PublicIPAddressName : ‘packerPublicIP’
==> azure-arm: -> NicName : ‘packerNic’
==> azure-arm: -> Network Connection : ‘PublicEndpoint’
==> azure-arm: -> IP Address : ‘40.76.55.35’
==> azure-arm: Waiting for WinRM to become available...
==> azure-arm: Connected to WinRM!
==> azure-arm: Provisioning with Powershell...
==> azure-arm: Provisioning with shell script: /var/folders/h1/ymh5bdx15wgdn5hvgj1wc0zh0000gn/T/packer-powershell-provisioner902510110
azure-arm: #< CLIXML
azure-arm:
azure-arm: Success Restart Needed Exit Code Feature Result
azure-arm: ------- -------------- --------- --------------
azure-arm: True No Success {Common HTTP Features, Default Document, D...
azure-arm: <Objs Version=“1.1.0.1” xmlns=“http://schemas.microsoft.com/powershell/2004/04"><Obj S=“progress” RefId=“0"><TN RefId=“0”><T>System.Management.Automation.PSCustomObject</T><T>System.Object</T></TN><MS><I64 N=“SourceId”>1</I64><PR N=“Record”><AV>Preparing modules for first use.</AV><AI>0</AI><Nil /><PI>-1</PI><PC>-1</PC><T>Completed</T><SR>-1</SR><SD> </SD></PR></MS></Obj></Objs>
==> azure-arm: Querying the machine’s properties ...
==> azure-arm: -> ResourceGroupName : ‘packer-Resource-Group-pq0mthtbtt’
==> azure-arm: -> ComputeName : ‘pkrvmpq0mthtbtt’
==> azure-arm: -> Managed OS Disk : ‘/subscriptions/guid/resourceGroups/packer-Resource-Group-pq0mthtbtt/providers/Microsoft.Compute/disks/osdisk’
==> azure-arm: Powering off machine ...
==> azure-arm: -> ResourceGroupName : ‘packer-Resource-Group-pq0mthtbtt’
==> azure-arm: -> ComputeName : ‘pkrvmpq0mthtbtt’
==> azure-arm: Capturing image ...
==> azure-arm: -> Compute ResourceGroupName : ‘packer-Resource-Group-pq0mthtbtt’
==> azure-arm: -> Compute Name : ‘pkrvmpq0mthtbtt’
==> azure-arm: -> Compute Location : ‘China East’
==> azure-arm: -> Image ResourceGroupName : ‘myResourceGroup’
==> azure-arm: -> Image Name : ‘myPackerImage’
==> azure-arm: -> Image Location : ‘chinaeast’
==> azure-arm: Deleting resource group ...
==> azure-arm: -> ResourceGroupName : ‘packer-Resource-Group-pq0mthtbtt’
==> azure-arm: Deleting the temporary OS disk ...
==> azure-arm: -> OS Disk : skipping, managed disk was used...
Build ‘azure-arm’ finished. ==> Builds finished. The artifacts of successful builds are:
--> azure-arm: Azure.ResourceManagement.VMImage: ManagedImageResourceGroupName: myResourceGroup
ManagedImageName: myPackerImage
ManagedImageLocation: chinaeast

Packer 需要几分钟时间来生成 VM、运行设置程序并清理部署。

从 Azure 映像创建 VM

使用 Get-Credential 设置 VM 的管理员用户名和密码。

PowerShell复制
$cred = Get-Credential

现在可使用 New-AzureRmVM 从映像创建 VM。 以下示例从 myImage 创建一个名为 myVM 的 VM。

PowerShell复制
# Create a subnet configuration
$subnetConfig = New-AzureRmVirtualNetworkSubnetConfig `
-Name mySubnet `
-AddressPrefix 192.168.1.0/24 # Create a virtual network
$vnet = New-AzureRmVirtualNetwork `
-ResourceGroupName $rgName `
-Location $location `
-Name myVnet `
-AddressPrefix 192.168.0.0/16 `
-Subnet $subnetConfig # Create a public IP address and specify a DNS name
$publicIP = New-AzureRmPublicIpAddress `
-ResourceGroupName $rgName `
-Location $location `
-AllocationMethod "Static" `
-IdleTimeoutInMinutes 4 `
-Name "myPublicIP" # Create an inbound network security group rule for port 80
$nsgRuleWeb = New-AzureRmNetworkSecurityRuleConfig `
-Name myNetworkSecurityGroupRuleWWW `
-Protocol Tcp `
-Direction Inbound `
-Priority 1001 `
-SourceAddressPrefix * `
-SourcePortRange * `
-DestinationAddressPrefix * `
-DestinationPortRange 80 `
-Access Allow # Create a network security group
$nsg = New-AzureRmNetworkSecurityGroup `
-ResourceGroupName $rgName `
-Location $location `
-Name myNetworkSecurityGroup `
-SecurityRules $nsgRuleWeb # Create a virtual network card and associate with public IP address and NSG
$nic = New-AzureRmNetworkInterface `
-Name myNic `
-ResourceGroupName $rgName `
-Location $location `
-SubnetId $vnet.Subnets[0].Id `
-PublicIpAddressId $publicIP.Id `
-NetworkSecurityGroupId $nsg.Id # Define the image created by Packer
$image = Get-AzureRMImage -ImageName myPackerImage -ResourceGroupName $rgName # Create a virtual machine configuration
$vmConfig = New-AzureRmVMConfig -VMName myVM -VMSize Standard_DS2 | `
Set-AzureRmVMOperatingSystem -Windows -ComputerName myVM -Credential $cred | `
Set-AzureRmVMSourceImage -Id $image.Id | `
Add-AzureRmVMNetworkInterface -Id $nic.Id New-AzureRmVM -ResourceGroupName $rgName -Location $location -VM $vmConfig

创建 VM 需要几分钟时间。

测试 VM 和 IIS

使用 Get-AzureRmPublicIPAddress 获取 VM 的公共 IP 地址。 以下示例获取前面创建的“myPublicIP”的 IP 地址:

PowerShell复制
Get-AzureRmPublicIPAddress `
-ResourceGroupName $rgName `
-Name "myPublicIP" | select "IpAddress"

然后,可将公共 IP 地址输入 Web 浏览器中。

后续步骤

此示例中,在已安装 IIS 的情况下使用 Packer 创建 VM 映像。 可以将此 VM 映像与现有部署工作流配合使用,例如将应用部署到基于映像使用 Team Services、Ansible、Chef 或 Puppet 创建的 VM。

有关其他 Windows 发行版的其他示例 Packer 模板,请参阅此 GitHub 存储库

立即访问http://market.azure.cn

如何使用 Packer 在 Azure 中创建 Windows 虚拟机映像的更多相关文章

  1. Azure 中的 Windows 虚拟机概述

    Azure 虚拟机 (VM) 是 Azure 提供的多种可缩放按需分配计算资源之一. 通常情况下,如果需要以更大的力度(相对于其他控制选项)控制计算环境,则应选择 VM. 本文介绍创建 VM 之前的注 ...

  2. 如何在 Azure 中均衡 Windows 虚拟机负载以创建具有高可用性的应用程序

    负载均衡通过将传入请求分布到多个虚拟机来提供更高级别的可用性. 本教程介绍了 Azure 负载均衡器的不同组件,这些组件用于分发流量和提供高可用性. 你将学习如何执行以下操作: 创建 Azure 负载 ...

  3. 在 Azure 中管理 Windows 虚拟机的可用性

    了解如何设置和管理多个虚拟机,以确保 Azure 中 Windows 应用程序的高可用性. 也可以管理 Linux 虚拟机的可用性. Note Azure 具有用于创建和处理资源的两个不同的部署模型: ...

  4. 如何在 Azure 中标记 Windows 虚拟机

    本文介绍在 Azure 中通过 Azure 资源管理器标记 Windows 虚拟机的不同方式.标记是用户定义的键/值对,可直接放置在资源或资源组中.针对每个资源和资源组,Azure 当前支持最多 15 ...

  5. 如何在 Azure 中自定义 Windows 虚拟机

    若要以快速一致的方式配置虚拟机 (VM),通常需要某种形式的自动化. 自定义 Windows VM 的一种常用方法是使用适用于 Windows 的自定义脚本扩展. 本教程介绍如何执行下列操作: 使用自 ...

  6. 使用 Azure CLI 创建 Windows 虚拟机

    Azure CLI 用于从命令行或脚本创建和管理 Azure 资源. 本指南详细介绍如何使用 Azure CLI 部署运行 Windows Server 2016 的虚拟机. 部署完成后,我们连接到服 ...

  7. 使用 Azure 门户创建 Windows 虚拟机

    可以通过 Azure 门户创建 Azure 虚拟机. 此方法提供一个基于浏览器的用户界面,用于创建和配置虚拟机和所有相关的资源. 本快速入门介绍了如何创建虚拟机并在 VM 上安装 webserver. ...

  8. 在 Azure 中的 Windows 虚拟机上使用 SSL 证书保护 IIS Web 服务器

    若要保护 Web 服务器,可以使用安全套接字层 (SSL) 证书来加密 Web 流量. 这些 SSL 证书可存储在 Azure Key Vault 中,并可安全部署到 Azure 中的 Windows ...

  9. 排查在 Azure 中新建 Windows VM 时遇到的部署问题

    尝试创建新的 Azure 虚拟机 (VM) 时,遇到的常见错误是预配失败或分配失败. 当由于准备步骤不当,或者在从门户捕获映像期间选择了错误的设置而导致 OS 映像无法加载时,将发生预配失败. 当群集 ...

随机推荐

  1. list string 互转

    List转字符串,用逗号隔开 List<string> list = new List<string>();list.Add("a");list.Add(& ...

  2. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(五):模块化切分

    切分工程 考虑到后续我们的模块会越来越多,依赖的公共代码和配置需要集中管理,我们在这里先把公共模块和配置从后台管理业务中剥离出来. 新增两个工程,切分后结构如下: kitty-boot:启动器及全局配 ...

  3. How to check Logstash's pulse

    Have you ever wondered if Logstash was sending data to your outputs? There's a brand new way to chec ...

  4. PowerBuilder编程新思维3:适配(三层架构与GraphQL)

    PowerBuilder编程新思维3:适配(三层架构与GraphQL) PB在富客户端时代,是一线开发工具.随着网络发展,主流架构演进到三层架构的时代,PB拿不出有力的三层架构,已经明显力不从心,市场 ...

  5. [转]webpack4.0.1安装问题和webpack.config.js的配置变化

    本文转自:https://blog.csdn.net/jiang7701037/article/details/79403637 The CLI moved into a separate packa ...

  6. golang中的接口实现(二)

    指针类型 vs 值类型实现接口 package main import ( "fmt" ) // 定义接口 type Describer interface { Describe( ...

  7. CSS 样式属性

    大小 width   宽               body {   min-width:1200px; height  高                      }               ...

  8. [日常] Go语言圣经-基于select的多路复用习题

    练习 8.8: 使用select来改造8.3节中的echo服务器,为其增加超时,这样服务器可以在客户端10秒中没有任何喊话时自动断开连接. reverb3.go package main import ...

  9. Boring Sum(hdu4961)hash

    Boring Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total S ...

  10. Java开发中常用的设计模式(二)---单例模式

    一. 懒汉式单例 //懒汉式单例类.在第一次调用的时候实例化自己 public class Singleton { private Singleton() {} private static Sing ...