PowerShell: Virtuálisgép-rendszerképek létrehozása az Azure-ban a Packer használatával
A következőkre vonatkozik: ✔️ Windows rendszerű virtuális gépek
Az Azure-ban minden virtuális gép (VM) egy olyan rendszerképből jön létre, amely meghatározza a Windows-disztribúciót és az operációs rendszer verzióját. A rendszerképek előre telepített alkalmazásokat és konfigurációkat tartalmazhatnak. A Azure Marketplace számos belső és külső rendszerképet biztosít a leggyakoribb operációs rendszer- és alkalmazáskörnyezetekhez, vagy létrehozhatja az igényeinek megfelelő egyéni rendszerképeket. Ez a cikk bemutatja, hogyan definiálhat és hozhat létre egyéni rendszerképeket az Azure-ban a Packer nyílt forráskódú eszközével.
Ezt a cikket legutóbb 2020. 08. 05-én teszteltük a Packer 1.8.1-es verziójával.
Megjegyzés
Az Azure most már rendelkezik egy Azure Image Builder nevű szolgáltatással, amellyel saját egyéni rendszerképeket definiálhatja és hozhat létre. Az Azure Image Builder a Packerre épül, így akár a meglévő Packer rendszerhéj-kiépítési szkripteket is használhatja vele. Az Azure Image Builder használatának első lépéseiért lásd: Windows rendszerű virtuális gép létrehozása az Azure Image Builderrel.
Azure-erőforráscsoport létrehozása
A buildelési folyamat során a Packer ideiglenes Azure-erőforrásokat hoz létre a forrás virtuális gép létrehozásakor. A forrás virtuális gép lemezképként való rögzítéséhez definiálnia kell egy erőforráscsoportot. A Packer buildelési folyamat kimenetét ebben az erőforráscsoportban tárolja a rendszer.
Hozzon létre egy erőforráscsoportot a New-AzResourceGroup paranccsal. Az alábbi példa létrehoz egy myPackerGroup nevű erőforráscsoportot az eastus helyen:
$rgName = "myPackerGroup"
$location = "East US"
New-AzResourceGroup -Name $rgName -Location $location
Azure-beli hitelesítő adatok létrehozása
A Packer szolgáltatásnévvel hitelesíti magát az Azure-ban. Az Azure-szolgáltatásnév olyan biztonsági identitás, amelyet olyan alkalmazásokkal, szolgáltatásokkal és automatizálási eszközökkel használhat, mint a Packer. Szabályozhatja és meghatározhatja az engedélyeket, hogy a szolgáltatásnév milyen műveleteket hajthat végre az Azure-ban.
Hozzon létre egy egyszerű szolgáltatást a New-AzADServicePrincipal paranccsal. A értékének -DisplayName
egyedinek kell lennie; szükség szerint cserélje le a értékét a saját értékére.
$sp = New-AzADServicePrincipal -DisplayName "PackerPrincipal" -role Contributor -scope /subscriptions/yyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyy
$plainPassword = (New-AzADSpCredential -ObjectId $sp.Id).SecretText
Ezután adja ki a jelszót és az alkalmazásazonosítót.
$plainPassword
$sp.AppId
Az Azure-beli hitelesítéshez be kell szereznie az Azure-bérlői és -előfizetési azonosítókat a Get-AzSubscription használatával:
$subName = "mySubscriptionName"
$sub = Get-AzSubscription -SubscriptionName $subName
Packer-sablon definiálása
Képek létrehozásához JSON-fájlként kell létrehoznia egy sablont. A sablonban olyan szerkesztőket és kiépítési gépeket definiálhat, amelyek a tényleges buildelési folyamatot hajtják végre. A Packer rendelkezik egy Azure-hoz készült szerkesztővel , amely lehetővé teszi Azure-erőforrások, például az előző lépésben létrehozott szolgáltatásnév hitelesítő adatainak meghatározását.
Hozzon létre egy windows.json nevű fájlt, és illessze be a következő tartalmat. Adja meg a saját értékeit a következőkhöz:
Paraméter | Hol szerezhető be? |
---|---|
client_id | Szolgáltatásnév-azonosító megtekintése a használatával $sp.AppId |
client_secret | Az automatikusan létrehozott jelszó megtekintése a következővel: $plainPassword |
tenant_id | Kimenet parancsból $sub.TenantId |
subscription_id | Kimenet parancsból $sub.SubscriptionId |
managed_image_resource_group_name | Az első lépésben létrehozott erőforráscsoport neve |
managed_image_name | A létrehozott felügyelt lemezkép neve |
{
"builders": [{
"type": "azure-arm",
"client_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",
"client_secret": "ppppppp-pppp-pppp-pppp-ppppppppppp",
"tenant_id": "zzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz",
"subscription_id": "yyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyy",
"managed_image_resource_group_name": "myPackerGroup",
"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": "5m",
"winrm_username": "packer",
"azure_tags": {
"dept": "Engineering",
"task": "Image deployment"
},
"build_resource_group_name": "myPackerGroup",
"vm_size": "Standard_D2_v2"
}],
"provisioners": [{
"type": "powershell",
"inline": [
"Add-WindowsFeature Web-Server",
"while ((Get-Service RdAgent).Status -ne 'Running') { Start-Sleep -s 5 }",
"while ((Get-Service WindowsAzureGuestAgent).Status -ne 'Running') { Start-Sleep -s 5 }",
"& $env:SystemRoot\\System32\\Sysprep\\Sysprep.exe /oobe /generalize /quiet /quit",
"while($true) { $imageState = Get-ItemProperty HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\State | Select ImageState; if($imageState.ImageState -ne 'IMAGE_STATE_GENERALIZE_RESEAL_TO_OOBE') { Write-Output $imageState.ImageState; Start-Sleep -s 10 } else { break } }"
]
}]
}
Létrehozhat egy windows.pkr.hcl nevű fájlt is, és beillesztheti a következő tartalmat a fenti paramétertáblához használt saját értékekkel.
source "azure-arm" "autogenerated_1" {
azure_tags = {
dept = "Engineering"
task = "Image deployment"
}
build_resource_group_name = "myPackerGroup"
client_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
client_secret = "ppppppp-pppp-pppp-pppp-ppppppppppp"
communicator = "winrm"
image_offer = "WindowsServer"
image_publisher = "MicrosoftWindowsServer"
image_sku = "2016-Datacenter"
managed_image_name = "myPackerImage"
managed_image_resource_group_name = "myPackerGroup"
os_type = "Windows"
subscription_id = "yyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyy"
tenant_id = "zzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz"
vm_size = "Standard_D2_v2"
winrm_insecure = true
winrm_timeout = "5m"
winrm_use_ssl = true
winrm_username = "packer"
}
build {
sources = ["source.azure-arm.autogenerated_1"]
provisioner "powershell" {
inline = ["Add-WindowsFeature Web-Server", "while ((Get-Service RdAgent).Status -ne 'Running') { Start-Sleep -s 5 }", "while ((Get-Service WindowsAzureGuestAgent).Status -ne 'Running') { Start-Sleep -s 5 }", "& $env:SystemRoot\\System32\\Sysprep\\Sysprep.exe /oobe /generalize /quiet /quit", "while($true) { $imageState = Get-ItemProperty HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\State | Select ImageState; if($imageState.ImageState -ne 'IMAGE_STATE_GENERALIZE_RESEAL_TO_OOBE') { Write-Output $imageState.ImageState; Start-Sleep -s 10 } else { break } }"]
}
}
Ez a sablon létrehoz egy Windows Server 2016 virtuális gépet, telepíti az IIS-t, majd általánosítja a virtuális gépet a Sysprep használatával. Az IIS telepítése bemutatja, hogyan futtathat további parancsokat a PowerShell-kiépítési eszköz használatával. A végső Packer-rendszerkép ezután tartalmazza a szükséges szoftvertelepítést és -konfigurációt.
A Windows-vendégügynök részt vesz a Sysprep folyamatában. Az ügynököt teljesen telepíteni kell ahhoz, hogy a virtuális gép sysprep'ed legyen. Annak érdekében, hogy ez igaz legyen, az összes ügynökszolgáltatásnak futnia kell a sysprep.exe végrehajtása előtt. Az előző JSON-kódrészlet ezt egy módon mutatja be a PowerShell-kiépítésben. Ez a kódrészlet csak akkor szükséges, ha a virtuális gép az ügynök telepítésére van konfigurálva, ami az alapértelmezett.
Build Packer rendszerképe
Ha még nincs telepítve a Packer a helyi gépen, kövesse a Packer telepítési utasításait.
A rendszerkép létrehozásához nyissa meg a cmd parancssort, és adja meg a Packer-sablonfájlt az alábbiak szerint:
packer build windows.json
A rendszerképet úgy is létrehozhatja, hogy megadja a windows.pkr.hcl fájlt az alábbiak szerint:
packer build windows.pkr.hcl
Az előző parancsok kimenetére példa a következő:
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 : ‘East US’
==> 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.net/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 : ‘East US’
==> azure-arm: -> Image ResourceGroupName : ‘myResourceGroup’
==> azure-arm: -> Image Name : ‘myPackerImage’
==> azure-arm: -> Image Location : ‘eastus’
==> 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: eastus
Eltarthat néhány percig, amíg a Packer létrehozza a virtuális gépet, futtatja a kiépítési modulokat, és törli az üzembe helyezést.
Virtuális gép létrehozása a Packer-rendszerképből
Most már létrehozhat egy virtuális gépet a Rendszerképből a New-AzVM használatával. A támogató hálózati erőforrások akkor jönnek létre, ha még nem léteznek. Amikor a rendszer kéri, adjon meg egy rendszergazdai felhasználónevet és jelszót, amelyet létre szeretne hozni a virtuális gépen. Az alábbi példa egy myVM nevű virtuális gépet hoz létre a myPackerImage fájlból:
New-AzVm `
-ResourceGroupName $rgName `
-Name "myVM" `
-Location $location `
-VirtualNetworkName "myVnet" `
-SubnetName "mySubnet" `
-SecurityGroupName "myNetworkSecurityGroup" `
-PublicIpAddressName "myPublicIpAddress" `
-OpenPorts 80 `
-Image "myPackerImage"
Ha a Packer-rendszerképétől eltérő erőforráscsoportban vagy régióban szeretne virtuális gépeket létrehozni, a rendszerkép neve helyett adja meg a rendszerkép azonosítóját. A képazonosítót a Get-AzImage paranccsal szerezheti be.
A virtuális gép Packer-rendszerképből való létrehozása néhány percet vesz igénybe.
Virtuális gép és webkiszolgáló tesztelése
Szerezze be a virtuális gép nyilvános IP-címét a Get-AzPublicIPAddress paranccsal. A következő példa a korábban létrehozott myPublicIP IP-címét kéri le:
Get-AzPublicIPAddress `
-ResourceGroupName $rgName `
-Name "myPublicIPAddress" | select "IpAddress"
A Packer-kiépítésI IIS-telepítést tartalmazó virtuális gép megtekintéséhez működés közben adja meg a nyilvános IP-címet egy webböngészőben.
Következő lépések
Meglévő Packer-kiépítési szkripteket is használhat az Azure Image Builderrel.