Linux rendszerű virtuálisgép-rendszerképek létrehozása a Packer használatával az Azure-ban

A következőkre vonatkozik: ✔️ Linux rendszerű virtuális gépek rugalmas méretezési ✔️ csoportjai

Az Azure-ban minden virtuális gép (VM) egy olyan rendszerképből jön létre, amely meghatározza a Linux-disztribúciót és az operációs rendszer verzióját. A képek tartalmazhatnak előre telepített alkalmazásokat és konfigurációkat. A Azure Marketplace számos belső és külső rendszerképet biztosít a leggyakoribb disztribúciókhoz és alkalmazáskörnyezetekhez, vagy létrehozhat saját, igényeinek megfelelő egyéni rendszerképeket. Ez a cikk ismerteti, hogyan definiálhat és hozhat létre egyéni rendszerképeket az Azure-ban a Packer nyílt forráskód eszközével.

Megjegyzés

Az Azure most már rendelkezik egy Azure Image Builder nevű szolgáltatással, amellyel saját egyéni rendszerképeket definiál és hozhat létre. Az Azure Image Builder a Packerre épül, így a meglévő Packer shell-kiépítési szkripteket is használhatja vele. Az Azure Image Builder használatának megkezdéséhez lásd: Linux 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 képként való rögzítéséhez meg kell adnia 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 az az group create paranccsal. Az alábbi példa létrehoz egy myResourceGroup nevű erőforráscsoportot az eastus helyen:

az group create -n myResourceGroup -l eastus

Azure-beli hitelesítő adatok létrehozása

A Packer szolgáltatásnévvel hitelesíti az Azure-t. Az Azure-szolgáltatásnév egy olyan biztonsági identitás, amelyet olyan alkalmazásokkal, szolgáltatásokkal és automatizálási eszközökkel használhat, mint a Packer. Ön határozza meg, hogy a szolgáltatásnév milyen műveleteket hajthat végre az Azure-ban.

Hozzon létre egy szolgáltatásnevet az az ad sp create-for-rbac paranccsal, és adja ki a Packer által igényelt hitelesítő adatokat:

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

Az előző parancsok kimenetére a következőképpen lehet példa:

{
    "client_id": "f5b6a5cf-fbdf-4a9f-b3b8-3c2cd00225a4",
    "client_secret": "0e760437-bf34-4aad-9f8d-870be799c55d",
    "tenant_id": "72f988bf-86f1-41af-91ab-2d7cd011db47"
}

Az Azure-ban való hitelesítéshez be kell szereznie az Azure-előfizetés azonosítóját az az account show paranccsal:

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

A következő lépésben a két parancs kimenetét fogja használni.

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-beli kiépítési eszközzel , amely lehetővé teszi Az Azure-erőforrások definiálását, például az előző lépésben létrehozott egyszerű szolgáltatás hitelesítő adatait.

Hozzon létre egy ubuntu.json nevű fájlt, és illessze be a következő tartalmat. Adja meg a saját értékeit a következő paraméterekhez:

Paraméter Hol szerezhető be?
client_id A create parancs kimenetének az ad sp első sora – appId
client_secret A create parancs kimenetének az ad sp második sora – jelszó
tenant_id A create parancs kimenetének az ad sp harmadik sora – bérlő
subscription_id Kimenet parancsból az account show
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": "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"
  }]
}

Megjegyzés

Cserélje le a image_publisher, image_offer, image_sku értékeket és inline parancsokat ennek megfelelően.

Létrehozhat egy ubuntu.pkr.hcl nevű iktatott 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"
  }
  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"
  }

}

Ez a sablon létrehoz egy Ubuntu 22.04 LTS-lemezképet, telepíti az NGINX-et, majd megszünteti a virtuális gépet.

Megjegyzés

Ha kiterjeszti ezt a sablont a felhasználói hitelesítő adatok kiépítéséhez, módosítsa a kiépítési parancsot, amely az Azure-ügynököt olvasásra állítja, nem pedig deprovision+userolvasásra-deprovision. A +user jelző eltávolítja az összes felhasználói fiókot a forrás virtuális gépről.

Packer-rendszerkép összeállítása

Ha még nincs telepítve a Packer a helyi gépen, kövesse a Packer telepítési utasításait.

Hozza létre a lemezképet a Packer-sablonfájl megadásával az alábbiak szerint:

sudo ./packer build ubuntu.json

A rendszerképet az ubuntu.pkr.hcl fájl megadásával is létrehozhatja az alábbiak szerint:

sudo packer build ubuntu.pkr.hcl

Az előző parancsok kimenetére a következőképpen lehet példa:

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

Néhány percig tart, amíg a Packer létrehozza a virtuális gépet, futtatja a kiépítéseket, és törli az üzembe helyezést.

Virtuális gép létrehozása az Azure Image-ből

Most már létrehozhat egy virtuális gépet a rendszerképből az az vm create paranccsal. Adja meg a paraméterrel --image létrehozott képet. Az alábbi példa létrehoz egy myVM nevű virtuális gépet a myPackerImage szolgáltatásból, és SSH-kulcsokat hoz létre, ha még nem léteznek:

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

Ha a Packer-rendszerképétől eltérő erőforráscsoportban vagy régióban szeretne virtuális gépeket létrehozni, adja meg a képazonosítót a kép neve helyett. A képazonosítót az az image show paranccsal szerezheti be.

A virtuális gép létrehozása néhány percet vesz igénybe. A virtuális gép létrehozása után jegyezze fel az publicIpAddress Azure CLI által megjelenített elemet. Ez a cím az NGINX-webhely webböngészőn keresztüli elérésére szolgál.

Ahhoz, hogy a webes adatforgalom elérje a virtuális gépét, nyissa meg az internetről a 80-as portot az az vm open-port paranccsal:

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

Virtuális gép és NGINX tesztelése

Most nyisson meg egy webböngészőt, és írja be a http://publicIpAddress címet a címsorba. Adja meg a saját nyilvános IP-címét, amelyet a virtuális gép létrehozásakor kapott. Az alapértelmezett NGINX-lap az alábbi példában látható módon jelenik meg:

Alapértelmezett NGINX-webhely

Következő lépések

A meglévő Packer-kiépítési szkripteket az Azure Image Builderrel is használhatja.