Cara menggunakan Packer untuk membuat citra komputer virtual Linux di Azure

Berlaku untuk: ✔️ VM Linux ✔️ Set skala fleksibel

Setiap komputer virtual (VM) di Azure dibuat dari citra yang mendefinisikan distribusi Linux dan versi OS. Citra dapat mencakup konfigurasi dan aplikasi yang telah dipasang sebelumnya. Marketplace Azure menyediakan banyak citra pihak pertama dan ketiga untuk distribusi dan lingkungan aplikasi yang paling umum, atau Anda dapat membuat citra kustom Anda sendiri yang disesuaikan dengan kebutuhan. Artikel ini menjelaskan cara menggunakan Packer alat sumber terbuka untuk menentukan dan membangun citra kustom di Azure.

Catatan

Azure sekarang memiliki layanan, Azure Image Builder, untuk menentukan dan membuat citra kustom Anda sendiri. Azure Image Builder dibangun di Packer, sehingga Anda bahkan dapat menggunakan skrip provisioner shell Packer yang sudah ada dengannya. Untuk mulai menggunakan Azure Image Builder, lihat Membuat VM Linux dengan Azure Image Builder.

Membuat grup sumber daya Azure

Selama proses pembangunan, Packer membuat sumber daya Azure sementara saat membangun VM sumber. Untuk mengambil VM sumber tersebut untuk digunakan sebagai citra, Anda harus menentukan grup sumber daya. Output dari proses pembangunan Packer disimpan dalam grup sumber daya ini.

Membuat grup sumber daya dengan buat grup az. Contoh berikut ini menampilkan cara membuat grup sumber daya bernama myResourceGroup di lokasi eastus:

az group create -n myResourceGroup -l eastus

Membuat info masuk Azure

Packer mengautentikasi dengan Azure menggunakan perwakilan layanan. Perwakilan layanan Azure adalah identitas keamanan yang dapat Anda gunakan dengan aplikasi, layanan, dan alat automasi seperti Packer. Anda mengontrol dan menentukan izin tentang operasi apa yang dapat dilakukan perwakilan layanan di Azure.

Buat perwakilan layanan dengan az ad sp create-for-rbac dan hasilkan output info masuk yang dibutuhkan Packer:

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

Contoh output dari perintah sebelumnya adalah sebagai berikut:

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

Untuk mengautentikasi ke Azure, Anda juga perlu mendapatkan ID langganan Azure Anda dengan az account show:

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

Anda menggunakan output dari dua perintah ini di langkah berikutnya.

Menentukan templat Packer

Untuk membuat citra, Anda membuat templat sebagai file JSON. Dalam templat, Anda menentukan penyusun dan provisioner yang melakukan proses pembangunan yang sebenarnya. Packer memiliki provisioner untuk Azure yang memungkinkan Anda menentukan sumber daya Azure, seperti info masuk perwakilan layanan yang dibuat pada langkah sebelumnya.

Buat file bernama ubuntu.jsdan tempelkan konten berikut. Masukkan nilai Anda sendiri untuk parameter berikut:

Parameter Tempat mendapatkan
client_id Baris pertama output dari perintah buat az ad sp - appId
client_secret Baris kedua output dari perintah buat az ad sp - password
tenant_id Baris ketiga output dari perintah buat az ad sp - tenant
subscription_id Output dari perintah az account show
managed_image_resource_group_name Nama grup sumber daya yang Anda buat di langkah pertama
managed_image_name Nama untuk citra disk terkelola yang dibuat
{
  "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"
  }]
}

Catatan

image_publisherGanti , , image_offerimage_sku nilai dan inline perintah yang sesuai.

Anda juga dapat membuat file bernama ubuntu.pkr.hcl dan menempelkan konten berikut dengan nilai sendiri seperti yang digunakan untuk tabel parameter di atas.

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"
  }

}

Templat ini membangun gambar Ubuntu 22.04 LTS, menginstal NGINX, lalu mendeprovisi VM.

Catatan

Jika Anda memperluas templat ini untuk memprovisikan info masuk pengguna, sesuaikan perintah provisioner yang mendeprovisi agen Azure untuk membaca -deprovision alih-alih deprovision+user. Bendera +user akan menghapus semua akun pengguna dari VM sumber.

Membangun citra Packer

Jika Anda belum memasang Packer di komputer lokal Anda, ikuti instruksi penginstalan Packer.

Bangun citra dengan menentukan file templat Packer Anda sebagai berikut:

sudo ./packer build ubuntu.json

Anda juga dapat mem-build gambar dengan menentukan file ubuntu.pkr.hcl sebagai berikut:

sudo packer build ubuntu.pkr.hcl

Contoh output dari perintah sebelumnya adalah sebagai berikut:

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

Dibutuhkan beberapa menit bagi Packer untuk membangun VM, menjalankan provisioner, dan membersihkan penyebaran.

Membuat VM dari Citra Azure

Anda sekarang dapat membuat VM dari Citra Anda dengan az vm create. Tentukan Citra yang Anda buat dengan parameter --image. Contoh berikut membuat VM bernama myVM dari myPackerImage dan membuat kunci SSH jika belum ada:

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

Jika Anda ingin membuat VM di grup atau wilayah sumber daya yang berbeda dari citra Packer Anda, tentukan ID citra alih-alih nama citra. Anda dapat memperoleh ID citra dengan az image show.

Perlu waktu beberapa menit untuk membuat VM tersebut. Setelah VM dibuat, catat publicIpAddress yang ditampilkan oleh Azure CLI. Alamat ini digunakan untuk mengakses situs NGINX melalui browser web.

Untuk mengizinkan lalu lintas web mencapai VM Anda, buka port 80 dari Internet dengan az vm open-port:

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

Menguji VM dan NGINX

Sekarang Anda dapat membuka browser web dan memasukkan http://publicIpAddress di bilah alamat. Berikan alamat IP publik Anda sendiri dari proses pembuatan VM. Halaman NGINX default ditampilkan sebagaimana ditunjukkan dalam contoh berikut:

Situs default NGINX

Langkah berikutnya

Anda juga dapat menggunakan skrip provisioner Packer yang ada dengan Azure Image Builder.