博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何使用 Packer 在 Azure 中创建 Windows 虚拟机映像
阅读量:7062 次
发布时间:2019-06-28

本文共 9263 字,大约阅读时间需要 30 分钟。

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

创建 Azure 资源组

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

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

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

创建 Azure 凭据

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

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

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

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

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

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

定义 Packer 模板

若要生成映像,请创建一个模板作为 JSON 文件。 在模板中,定义执行实际生成过程的生成器和设置程序。 Packer 具有 ,允许定义 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 模板文件,生成映像:

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: 
System.Management.Automation.PSCustomObject
System.Object
1
Preparing modules for first use.
0
-1
-1
Completed
-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: myResourceGroupManagedImageName: myPackerImageManagedImageLocation: chinaeast

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

从 Azure 映像创建 VM

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

PowerShell复制
$cred = Get-Credential

现在可使用  从映像创建 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

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

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

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

IIS 默认站点

后续步骤

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

有关其他 Windows 发行版的其他示例 Packer 模板,请参阅。

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

转载地址:http://epnll.baihongyu.com/

你可能感兴趣的文章
人工智能与勒索病毒较量,你猜最后谁能赢了?
查看>>
前端面试每日3+1(周汇总2019.05.05)
查看>>
SQL Join 图示
查看>>
RPA:制造业的下一个改变者
查看>>
VSCode Python开发环境配置
查看>>
208道 java 高频面试题和答案
查看>>
nginx反向代理配置
查看>>
MySQL学习笔记 初学基础篇
查看>>
一步步教你用 CSS 为 SVG 添加过滤器
查看>>
TeeChart Pro VCL/FMX教程(一):入门——构建图表
查看>>
微服务架构 SpringCloud(二)Eureka(服务注册和服务发现基础篇)
查看>>
oracle RAC的客户端HA配置
查看>>
VsCode编辑器
查看>>
spring cloud开发、部署注意事项
查看>>
又一款基于BCH开发出来的社交软件BlockPress
查看>>
ttlsa教程系列之mongodb——(五)mongodb架构-复制原理&复制集
查看>>
虚拟主机通过修改.htaccess将入口重定向到public文件夹
查看>>
nginx快速安装
查看>>
Kinect for windows的脸部识别
查看>>
MySQL 运维笔记(一)—— 终止高负载SQL
查看>>