如何使用 Packer 在 Azure 中创建 Windows 虚拟机映像

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!"Sleep20New-AzureRmRoleAssignment-RoleDefinitionNameContributor-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 beinthis 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: System.Management.Automation.PSCustomObjectSystem.Object1Preparing modules for first use.0-1-1Completed-1

==> 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`-NamemySubnet `-AddressPrefix192.168.1.0/24# Create a virtual network$vnet=New-AzureRmVirtualNetwork`-ResourceGroupName$rgName`-Location$location`-NamemyVnet `-AddressPrefix192.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"`-IdleTimeoutInMinutes4`-Name"myPublicIP"# Create an inbound network security group rule for port 80$nsgRuleWeb=New-AzureRmNetworkSecurityRuleConfig`-NamemyNetworkSecurityGroupRuleWWW  `-ProtocolTcp `-DirectionInbound `-Priority1001`-SourceAddressPrefix* `-SourcePortRange* `-DestinationAddressPrefix* `-DestinationPortRange80`-AccessAllow# Create a network security group$nsg=New-AzureRmNetworkSecurityGroup`-ResourceGroupName$rgName`-Location$location`-NamemyNetworkSecurityGroup `-SecurityRules$nsgRuleWeb# Create a virtual network card and associate with public IP address and NSG$nic=New-AzureRmNetworkInterface`-NamemyNic `-ResourceGroupName$rgName`-Location$location`-SubnetId$vnet.Subnets[0].Id `-PublicIpAddressId$publicIP.Id `-NetworkSecurityGroupId$nsg.Id# Define the image created by Packer$image=Get-AzureRMImage-ImageNamemyPackerImage-ResourceGroupName$rgName# Create a virtual machine configuration$vmConfig=New-AzureRmVMConfig-VMNamemyVM-VMSizeStandard_DS2 | `Set-AzureRmVMOperatingSystem-Windows-ComputerNamemyVM-Credential$cred| `Set-AzureRmVMSourceImage-Id$image.Id | `Add-AzureRmVMNetworkInterface-Id$nic.IdNew-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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容