Delen via


Packer gebruiken om installatiekopieën van virtuele Linux-machines te maken in Azure

Van toepassing op: ✔️ Flexibele schaalsets voor Linux-VM's ✔️

Elke virtuele machine (VM) in Azure wordt gemaakt uit een installatiekopie die de Linux-distributie en versie van het besturingssysteem definieert. Afbeeldingen kunnen vooraf geïnstalleerde toepassingen en configuraties bevatten. Azure Marketplace biedt veel eerste en externe installatiekopieën voor de meest voorkomende distributies en toepassingsomgevingen, of u kunt uw eigen aangepaste installatiekopieën maken die zijn afgestemd op uw behoeften. In dit artikel wordt beschreven hoe u het opensource-hulpprogramma Packer gebruikt om aangepaste installatiekopieën te definiëren en te bouwen in Azure.

Opmerking

Azure heeft nu een service, Azure Image Builder, voor het definiëren en maken van uw eigen aangepaste installatiekopieën. Azure Image Builder is gebaseerd op Packer, dus u kunt er zelfs uw bestaande Packer Shell-inrichtingsscripts mee gebruiken. Zie Een Virtuele Linux-machine maken met Azure Image Builder om aan de slag te gaan met Azure Image Builder.

Azure-resourcegroep maken

Tijdens het buildproces maakt Packer tijdelijke Azure-resources tijdens het bouwen van de bron-VM. Om een image van de bron-VM te maken voor gebruik, moet u een resourcegroep definiëren. De uitvoer van het Packer-buildproces wordt opgeslagen in deze resourcegroep.

Maak een resourcegroep aan met az group create. In het volgende voorbeeld wordt een resourcegroep met de naam myResourceGroup gemaakt op de locatie eastus:

az group create -n myResourceGroup -l eastus

Maak Azure-referenties aan

Packer verifieert zich met Azure met behulp van een service-principal. Een Azure-service-principal is een beveiligingsidentiteit die u kunt gebruiken met apps, services en automatiseringsprogramma's zoals Packer. U beheert en definieert de machtigingen voor de bewerkingen die de service-principal in Azure kan uitvoeren.

Maak een service-principal met az ad sp create-for-rbac en voer de referenties uit die Packer nodig heeft:

az ad sp create-for-rbac --role Contributor --scopes /subscriptions/<subscription_id> --query "{ client_id: appId, client_secret: password, tenant_id: tenant }"

Een voorbeeld van de uitvoer van de voorgaande opdrachten is als volgt:

{
    "client_id": "00001111-aaaa-2222-bbbb-3333cccc4444",
    "client_secret": "0e760437-bf34-4aad-9f8d-870be799c55d",
    "tenant_id": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}

Als u zich wilt verifiëren bij Azure, moet u ook uw Azure-abonnements-id verkrijgen met az account show:

az account show --query "{ subscription_id: id }"

In de volgende stap gebruikt u de uitvoer van deze twee opdrachten.

Packer-sjabloon definiëren

Om afbeeldingen te maken, maakt u een sjabloon als een JSON-bestand. In de sjabloon definieert u opbouwfuncties en inrichtingsfuncties die het daadwerkelijke buildproces uitvoeren. Packer heeft een provisioner voor Azure waarmee u Azure-resources kunt definiëren, zoals de referenties van de serviceprincipal die u in de vorige stap hebt gemaakt.

Maak een bestand met de naamubuntu.json en plak de volgende inhoud. Voer uw eigen waarden in voor de volgende parameters:

Maatstaf Waar te verkrijgen
client_id Eerste regel uitvoer van az ad sp maakopdracht - appId
client_secret Tweede regel uitvoer van az ad sp opdracht maken - wachtwoord
tenant_id Derde regel van uitvoer van az ad sp commando maken - tenant
subscription_id Uitvoer van az account show opdracht
managed_image_resource_group_name Naam van resourcegroep die u in de eerste stap hebt gemaakt
beheerde_afbeelding_naam Naam voor de gemaakte beheerde schijf-image
{
  "builders": [{
    "type": "azure-arm",

    "client_id": "00001111-aaaa-2222-bbbb-3333cccc4444",
    "client_secret": "0e760437-bf34-4aad-9f8d-870be799c55d",
    "tenant_id": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
    "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"
  }]
}

Opmerking

Vervang de image_publisher, image_offer, image_sku waarden en inline opdrachten dienovereenkomstig.

U kunt ook een opgeslagen bestand met de naam ubuntu.pkr.hcl maken en de volgende inhoud plakken met uw eigen waarden, zoals wordt gebruikt voor de bovenstaande parameterstabel.

source "azure-arm" "autogenerated_1" {
  azure_tags = {
    dept = "Engineering"
    task = "Image deployment"
  }
  client_id                         = "00001111-aaaa-2222-bbbb-3333cccc4444"
  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                         = "aaaabbbb-0000-cccc-1111-dddd2222eeee"
  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"
  }

}

Met deze sjabloon wordt een Ubuntu 22.04 LTS image gebouwd, NGINX geïnstalleerd en vervolgens de VM gedeprovisioneerd.

Opmerking

Als u deze sjabloon uitbreidt om gebruikersgegevens te configureren, past u de inrichtingsopdracht aan die de Azure-agent deprovisioneert om te lezen -deprovision in plaats van deprovision+user. Met +user de vlag worden alle gebruikersaccounts van de bron-VM verwijderd.

Packer-image bouwen

Als u Packer nog niet op uw lokale computer hebt geïnstalleerd, volgt u de installatie-instructies van Packer.

Maak de afbeeldingen door het Packer-sjabloonbestand als volgt te specificeren.

sudo ./packer build ubuntu.json

U kunt de installatiekopie ook bouwen door het ubuntu.pkr.hcl-bestand als volgt op te geven:

sudo packer build ubuntu.pkr.hcl

Een voorbeeld van de uitvoer van de voorgaande opdrachten is als volgt:

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

Het duurt enkele minuten voordat Packer de virtuele machine heeft gebouwd, de provisioners uitvoert en de implementatie opruimt.

Een virtuele machine maken vanuit een Azure-afbeelding

U kunt nu een virtuele machine maken op basis van uw image met az vm create. Geef de image op die u hebt gemaakt met de --image parameter. In het volgende voorbeeld wordt een virtuele machine met de naam myVM gemaakt op basis van myPackerImage en worden SSH-sleutels gegenereerd als deze nog niet bestaan:

az vm create \
    --resource-group myResourceGroup \
    --name myVM \
    --image myPackerImage \
    --admin-username azureuser \
    --generate-ssh-keys

Als je VM's in een andere resourcegroep of regio wilt maken dan je Packer-image, geef dan het image-ID op in plaats van de naam van het image. U kunt de image-ID verkrijgen met az image show.

Het duurt een paar minuten om de virtuele machine te maken. Zodra de VIRTUELE machine is gemaakt, noteert u de publicIpAddress weergave door de Azure CLI. Dit adres wordt gebruikt voor toegang tot de NGINX-site via een webbrowser.

Open poort 80 via internet met az vm open-port zodat beveiligd webverkeer uw virtuele machine kan bereiken:

az vm open-port \
    --resource-group myResourceGroup \
    --name myVM \
    --port 80

VM en NGINX testen

U kunt nu een webbrowser openen en de adresbalk invoeren http://publicIpAddress . Geef uw eigen openbare IP-adres op bij het maken van een virtuele machine. De standaard NGINX-pagina wordt weergegeven zoals in het volgende voorbeeld:

NGINX-standaardsite

Volgende stappen

U kunt ook bestaande Packer-inrichtingsscripts gebruiken met Azure Image Builder.