Share 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 op basis van een installatiekopieën die de Linux-distributie en versie van het besturingssysteem definieert. Installatiekopieën 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.

Notitie

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. Als u die bron-VM wilt vastleggen voor gebruik als installatiekopieën, moet u een resourcegroep definiëren. De uitvoer van het Packer-buildproces wordt opgeslagen in deze resourcegroep.

Maak een resourcegroep maken 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

Azure-referenties maken

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": "f5b6a5cf-fbdf-4a9f-b3b8-3c2cd00225a4",
    "client_secret": "0e760437-bf34-4aad-9f8d-870be799c55d",
    "tenant_id": "72f988bf-86f1-41af-91ab-2d7cd011db47"
}

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

Als u installatiekopieën wilt 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 inrichting voor Azure waarmee u Azure-resources kunt definiëren, zoals de referenties van de service-principal die u in de vorige stap hebt gemaakt.

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

Parameter Waar te verkrijgen
client_id Eerste regel uitvoer van az ad sp opdracht maken - appId
client_secret Tweede regel uitvoer van az ad sp opdracht maken - wachtwoord
tenant_id Derde regel uitvoer van az ad sp opdracht 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
managed_image_name Naam voor de installatiekopieën van de beheerde schijf die is gemaakt
{
  "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"
  }]
}

Notitie

Vervang de image_publisherwaarden image_offerimage_sku 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                         = "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"
  }

}

Met deze sjabloon wordt een Ubuntu 22.04 LTS-installatiekopie gebouwd, NGINX geïnstalleerd en vervolgens de inrichting van de VIRTUELE machine ongedaan gemaakt.

Notitie

Als u deze sjabloon uitvouwt om gebruikersreferenties in te richten, past u de inrichtingsopdracht aan die de Inrichting van de Azure-agent ongedaan maakt om te lezen -deprovision in plaats deprovision+uservan . Met +user de vlag worden alle gebruikersaccounts van de bron-VM verwijderd.

Build Packer-installatiekopieën

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

Bouw de installatiekopieën door het Packer-sjabloonbestand als volgt op te geven:

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 inrichtingen uitvoert en de implementatie opschoont.

Een VIRTUELE machine maken op azure-installatiekopieën

U kunt nu een virtuele machine maken op basis van uw installatiekopieën met az vm create. Geef de installatiekopieën 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 u VM's in een andere resourcegroep of regio wilt maken dan de Packer-installatiekopieën, geeft u de installatiekopieën-id op in plaats van de naam van de installatiekopieën. U kunt de installatiekopieën-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

Nu kunt u een webbrowser openen en http://publicIpAddress in de adresbalk invoeren. Geef uw eigen openbare IP-adres op uit het creatieproces van de virtuele machine proces. De standaard NGINX-pagina wordt weergegeven zoals in het volgende voorbeeld:

Standaardsite van NGINX

Volgende stappen

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