Använda Packer för att skapa avbildningar av virtuella Linux-datorer i Azure
Gäller för: ✔️ Flexibla skalningsuppsättningar för virtuella Linux-datorer ✔️
Varje virtuell dator (VM) i Azure skapas från en avbildning som definierar Linux-distributions- och OS-versionen. Avbildningar kan innehålla förinstallerade program och konfigurationer. Azure Marketplace tillhandahåller många avbildningar från första och tredje part för de vanligaste distributionerna och programmiljöerna, eller så kan du skapa egna anpassade avbildningar som är skräddarsydda för dina behov. Den här artikeln beskriver hur du använder verktyget Packer med öppen källkod för att definiera och skapa anpassade avbildningar i Azure.
Kommentar
Azure har nu en tjänst, Azure Image Builder, för att definiera och skapa egna anpassade avbildningar. Azure Image Builder bygger på Packer, så du kan även använda dina befintliga Packer shell provisioner-skript med det. Information om hur du kommer igång med Azure Image Builder finns i Skapa en virtuell Linux-dator med Azure Image Builder.
Skapa En Azure-resursgrupp
Under byggprocessen skapar Packer tillfälliga Azure-resurser när den skapar den virtuella källdatorn. Om du vill avbilda den virtuella källdatorn för användning som en avbildning måste du definiera en resursgrupp. Utdata från Packer-byggprocessen lagras i den här resursgruppen.
Skapa en resursgrupp med az group create. I följande exempel skapas en resursgrupp med namnet myResourceGroup på platsen eastus:
az group create -n myResourceGroup -l eastus
Skapa Azure-autentiseringsuppgifter
Packer autentiserar med Azure med hjälp av tjänstens huvudnamn. Ett Huvudnamn för Azure-tjänsten är en säkerhetsidentitet som du kan använda med appar, tjänster och automatiseringsverktyg som Packer. Du styr och definierar behörigheterna för vilka åtgärder tjänstens huvudnamn kan utföra i Azure.
Skapa ett huvudnamn för tjänsten med az ad sp create-for-rbac och mata ut de autentiseringsuppgifter som Packer behöver:
az ad sp create-for-rbac --role Contributor --scopes /subscriptions/<subscription_id> --query "{ client_id: appId, client_secret: password, tenant_id: tenant }"
Ett exempel på utdata från föregående kommandon är följande:
{
"client_id": "f5b6a5cf-fbdf-4a9f-b3b8-3c2cd00225a4",
"client_secret": "0e760437-bf34-4aad-9f8d-870be799c55d",
"tenant_id": "72f988bf-86f1-41af-91ab-2d7cd011db47"
}
Om du vill autentisera till Azure måste du också hämta ditt Azure-prenumerations-ID med az account show:
az account show --query "{ subscription_id: id }"
Du använder utdata från dessa två kommandon i nästa steg.
Definiera Packer-mall
Skapa avbildningar genom att skapa en mall som en JSON-fil. I mallen definierar du byggare och etablerare som utför själva byggprocessen. Packer har en provisioner för Azure som gör att du kan definiera Azure-resurser, till exempel autentiseringsuppgifterna för tjänstens huvudnamn som skapades i föregående steg.
Skapa en fil med namnet ubuntu.json och klistra in följande innehåll. Ange dina egna värden för följande parametrar:
Parameter | Var du kan hämta |
---|---|
client_id | Första raden med utdata från az ad sp kommandot create – appId |
client_secret | Andra raden med utdata från az ad sp kommandot skapa – lösenord |
tenant_id | Tredje raden med utdata från az ad sp kommandot create – klientorganisation |
subscription_id | Utdata från az account show kommandot |
managed_image_resource_group_name | Namnet på resursgruppen som du skapade i det första steget |
managed_image_name | Namn på den hanterade diskbild som skapas |
{
"builders": [{
"type": "azure-arm",
"client_id": "f5b6a5cf-fbdf-4a9f-b3b8-3c2cd00225a4",
"client_secret": "0e760437-bf34-4aad-9f8d-870be799c55d",
"tenant_id": "72f988bf-86f1-41af-91ab-2d7cd011db47",
"subscription_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",
"managed_image_resource_group_name": "myResourceGroup",
"managed_image_name": "myPackerImage",
"os_type": "Linux",
"image_publisher": "canonical",
"image_offer": "0001-com-ubuntu-server-jammy",
"image_sku": "22_04-lts",
"azure_tags": {
"dept": "Engineering",
"task": "Image deployment"
},
"location": "East US",
"vm_size": "Standard_DS2_v2"
}],
"provisioners": [{
"execute_command": "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'",
"inline": [
"apt-get update",
"apt-get upgrade -y",
"apt-get -y install nginx",
"/usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync"
],
"inline_shebang": "/bin/sh -x",
"type": "shell"
}]
}
Kommentar
image_publisher
Ersätt värdena och kommandona , image_offer
image_sku
och inline
därefter .
Du kan också skapa en fil med namnet ubuntu.pkr.hcl och klistra in följande innehåll med dina egna värden som används för tabellen ovan.
source "azure-arm" "autogenerated_1" {
azure_tags = {
dept = "Engineering"
task = "Image deployment"
}
client_id = "f5b6a5cf-fbdf-4a9f-b3b8-3c2cd00225a4"
client_secret = "0e760437-bf34-4aad-9f8d-870be799c55d"
image_offer = "0001-com-ubuntu-server-jammy"
image_publisher = "canonical"
image_sku = "22_04-lts"
location = "East US"
managed_image_name = "myPackerImage"
managed_image_resource_group_name = "myResourceGroup"
os_type = "Linux"
subscription_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
tenant_id = "72f988bf-86f1-41af-91ab-2d7cd011db47"
vm_size = "Standard_DS2_v2"
}
build {
sources = ["source.azure-arm.autogenerated_1"]
provisioner "shell" {
execute_command = "chmod +x {{ .Path }}; {{ .Vars }} sudo -E sh '{{ .Path }}'"
inline = ["apt-get update", "apt-get upgrade -y", "apt-get -y install nginx", "/usr/sbin/waagent -force -deprovision+user && export HISTSIZE=0 && sync"]
inline_shebang = "/bin/sh -x"
}
}
Den här mallen skapar en Ubuntu 22.04 LTS-avbildning, installerar NGINX och avetablerar sedan den virtuella datorn.
Kommentar
Om du expanderar den här mallen för att etablera användarautentiseringsuppgifter justerar du kommandot provisioner som avetablerar Azure-agenten så att den läser -deprovision
i stället deprovision+user
för .
Flaggan +user
tar bort alla användarkonton från den virtuella källdatorn.
Build Packer-avbildning
Om du inte redan har Packer installerat på den lokala datorn följer du installationsanvisningarna för Packer.
Skapa avbildningen genom att ange Packer-mallfilen på följande sätt:
sudo ./packer build ubuntu.json
Du kan också skapa avbildningen genom att ange filen ubuntu.pkr.hcl enligt följande:
sudo packer build ubuntu.pkr.hcl
Ett exempel på utdata från föregående kommandon är följande:
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-swtxmqm7ly’
==> azure-arm: -> Location : ‘East US’
==> azure-arm: -> Tags :
==> azure-arm: ->> dept : Engineering
==> azure-arm: ->> task : Image deployment
==> azure-arm: Validating deployment template ...
==> azure-arm: -> ResourceGroupName : ‘packer-Resource-Group-swtxmqm7ly’
==> azure-arm: -> DeploymentName : ‘pkrdpswtxmqm7ly’
==> azure-arm: Deploying deployment template ...
==> azure-arm: -> ResourceGroupName : ‘packer-Resource-Group-swtxmqm7ly’
==> azure-arm: -> DeploymentName : ‘pkrdpswtxmqm7ly’
==> azure-arm: Getting the VM’s IP address ...
==> azure-arm: -> ResourceGroupName : ‘packer-Resource-Group-swtxmqm7ly’
==> azure-arm: -> PublicIPAddressName : ‘packerPublicIP’
==> azure-arm: -> NicName : ‘packerNic’
==> azure-arm: -> Network Connection : ‘PublicEndpoint’
==> azure-arm: -> IP Address : ‘40.76.218.147’
==> azure-arm: Waiting for SSH to become available...
==> azure-arm: Connected to SSH!
==> azure-arm: Provisioning with shell script: /var/folders/h1/ymh5bdx15wgdn5hvgj1wc0zh0000gn/T/packer-shell868574263
azure-arm: WARNING! The waagent service will be stopped.
azure-arm: WARNING! Cached DHCP leases will be deleted.
azure-arm: WARNING! root password will be disabled. You will not be able to login as root.
azure-arm: WARNING! /etc/resolvconf/resolv.conf.d/tail and /etc/resolvconf/resolv.conf.d/original will be deleted.
azure-arm: WARNING! packer account and entire home directory will be deleted.
==> azure-arm: Querying the machine’s properties ...
==> azure-arm: -> ResourceGroupName : ‘packer-Resource-Group-swtxmqm7ly’
==> azure-arm: -> ComputeName : ‘pkrvmswtxmqm7ly’
==> azure-arm: -> Managed OS Disk : ‘/subscriptions/guid/resourceGroups/packer-Resource-Group-swtxmqm7ly/providers/Microsoft.Compute/disks/osdisk’
==> azure-arm: Powering off machine ...
==> azure-arm: -> ResourceGroupName : ‘packer-Resource-Group-swtxmqm7ly’
==> azure-arm: -> ComputeName : ‘pkrvmswtxmqm7ly’
==> azure-arm: Capturing image ...
==> azure-arm: -> Compute ResourceGroupName : ‘packer-Resource-Group-swtxmqm7ly’
==> azure-arm: -> Compute Name : ‘pkrvmswtxmqm7ly’
==> 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-swtxmqm7ly’
==> 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
Det tar några minuter för Packer att skapa den virtuella datorn, köra etableringarna och rensa distributionen.
Skapa en virtuell dator från Azure Image
Nu kan du skapa en virtuell dator från avbildningen med az vm create. Ange den bild som du skapade med parametern --image
. I följande exempel skapas en virtuell dator med namnet myVM från myPackerImage och genererar SSH-nycklar om de inte redan finns:
az vm create \
--resource-group myResourceGroup \
--name myVM \
--image myPackerImage \
--admin-username azureuser \
--generate-ssh-keys
Om du vill skapa virtuella datorer i en annan resursgrupp eller region än din Packer-avbildning anger du avbildnings-ID:t i stället för bildnamnet. Du kan hämta bild-ID:t med az image show.
Det tar några minuter att skapa den virtuella datorn. När den virtuella datorn har skapats noterar du det som publicIpAddress
visas av Azure CLI. Den här adressen används för att komma åt NGINX-webbplatsen via en webbläsare.
För att låta webbtrafik nå din virtuella dator öppnar du port 80 från Internet med az vm open-port:
az vm open-port \
--resource-group myResourceGroup \
--name myVM \
--port 80
Testa virtuell dator och NGINX
Nu kan du öppna en webbläsare och ange http://publicIpAddress
i adressfältet. Ange din offentliga IP-adress från skapandeprocessen av den virtuella datorn. Standardsidan för NGINX visas som i följande exempel:
Nästa steg
Du kan också använda befintliga Packer-etableringsskript med Azure Image Builder.