Packer adalah alat open source ringan yang digunakan untuk membuat image. Packer berjalan di sistem operasi utama seperti Windows, Linux, dan macOS, serta mampu membuat image mesin virtual untuk berbagai platform secara paralel dan efisien. Topik ini menjelaskan cara menginstal Packer pada instance Elastic Compute Service (ECS), mendefinisikan templat Packer, dan menggunakan Packer untuk membuat custom image.
Prasyarat
Anda memiliki pasangan AccessKey, yang terdiri dari ID AccessKey dan Rahasia AccessKey. Untuk informasi selengkapnya, lihat Dapatkan pasangan AccessKey.
Untuk mencegah kebocoran pasangan AccessKey akun Alibaba Cloud Anda, kami menyarankan agar Anda membuat pengguna Resource Access Management (RAM) dan menggunakan kredensial pengguna RAM tersebut untuk membuat pasangan AccessKey. Untuk informasi tentang cara membuat pengguna RAM, lihat Buat pengguna RAM.
Rahasia AccessKey untuk pengguna RAM hanya ditampilkan saat Anda membuat pasangan AccessKey tersebut. Anda tidak dapat mengambil kembali Rahasia AccessKey setelah pasangan tersebut dibuat. Catat dan simpan kerahasiaan Rahasia AccessKey Anda.
Informasi latar belakang
Packer terdiri dari berbagai komponen, seperti Builders, Provisioners, dan Post-Processors. Packer menggunakan templat dalam format Hashicorp Configuration Language (HCL) atau JSON untuk menyederhanakan pembuatan custom image. Packer mengubah proses pembuatan image manual dan ad-hoc menjadi konfigurasi sebagai kode yang mudah dikelola, sehingga menurunkan hambatan migrasi aplikasi ke cloud. Untuk informasi lebih lanjut tentang Packer, lihat dokumentasi resmi Packer.
Prosedur
Langkah 1: Instal Packer
Hubungkan ke instance Linux.
Untuk informasi selengkapnya, lihat Hubungkan ke instance Linux menggunakan username dan password.
Beralih ke direktori
/usr/local/bin:cd /usr/local/binCatatanDirektori
/usr/local/binberada dalamPATHsistem. Anda dapat menginstal Packer di direktori ini atau di direktori lain yang sudah termasuk dalamPATH.Unduh paket instalasi Packer.
Atau, kunjungi halaman Instal Packer untuk mengunduh paket sesuai OS dan arsitektur instance Anda. Contoh ini menggunakan packer_1.8.5_linux_amd64.zip.
wget https://releases.hashicorp.com/packer/1.8.5/packer_1.8.5_linux_amd64.zipEkstrak paket instalasi Packer:
unzip packer_1.8.5_linux_amd64.zipPeriksa versi Packer untuk memverifikasi instalasi.
packer -vJika perintah mengembalikan nomor versi Packer, berarti Packer telah terinstal.
Jika perintah mengembalikan pesan
command not found, berarti Packer belum terinstal dengan benar. Pastikan direktori tempat Packer berada termasuk dalamPATHsistem Anda.
Langkah 2: Definisikan templat Packer
Untuk membuat custom image dengan Packer, buat file templat dalam format HCL atau JSON. Dalam templat ini, Anda harus menentukan Builders dan Provisioners untuk membuat custom image tersebut. Packer menyediakan berbagai jenis provisioner untuk mengonfigurasi konten image. Topik ini menggunakan provisioner Shell sebagai contoh untuk mendefinisikan templat Packer.
Impor ID AccessKey Anda.
export ALICLOUD_ACCESS_KEY=<AccessKey ID>Ganti
<AccessKey ID>dengan ID AccessKey aktual Anda. Untuk menemukan ID AccessKey pengguna RAM, lihat Lihat informasi pasangan AccessKey pengguna RAM.Impor Rahasia AccessKey Anda.
export ALICLOUD_SECRET_KEY=<AccessKey Secret>Ganti
<AccessKey Secret>dengan Rahasia AccessKey aktual Anda. Rahasia AccessKey pengguna RAM hanya ditampilkan saat dibuat dan tidak dapat diambil kembali nanti. Untuk informasi selengkapnya, lihat Dapatkan pasangan AccessKey.Buat file bernama
alicloud.CatatanAnda dapat menggunakan salah satu format file berikut untuk membuat file
alicloud. Jika Anda membuat file HCL, pastikan Anda menggunakan contoh dan perintah HCL pada langkah-langkah selanjutnya.File HCL
vi alicloud.pkr.hclFile JSON
vi alicloud.jsonTekan tombol
Iuntuk masuk ke mode Insert. Salin salah satu templat berikut ke dalam filealiclouddan sesuaikan parameter sesuai kebutuhan.File HCL
variable "access_key" { type = string default = "${env("ALICLOUD_ACCESS_KEY")}" } variable "secret_key" { type = string default = "${env("ALICLOUD_SECRET_KEY")}" } source "alicloud-ecs" "autogenerated_1" { associate_public_ip_address = true image_name = "packer_basic" instance_type = "ecs.g6.large" internet_charge_type = "PayByTraffic" io_optimized = true region = "cn-qingdao" skip_image_validation = true source_image = "aliyun_3_x64_20G_alibase_20220907.vhd" ssh_username = "root" } build { sources = ["source.alicloud-ecs.autogenerated_1"] provisioner "shell" { inline = ["sleep 30", "yum install redis.x86_64 -y"] } }File JSON
{ "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [{ "type":"alicloud-ecs", "region":"cn-qingdao", "image_name":"packer_basic", "source_image":"aliyun_3_x64_20G_alibase_20220907.vhd", "associate_public_ip_address":true, "ssh_username":"root", "instance_type":"ecs.g6.large", "internet_charge_type":"PayByTraffic", "io_optimized":true, "skip_image_validation":true }], "provisioners": [{ "type": "shell", "inline": [ "sleep 30", "yum install redis.x86_64 -y" ] }] }Tabel berikut menjelaskan parameter yang didukung dalam templat Packer. Untuk informasi selengkapnya, lihat dokumentasi resmi Packer.
Parameter
Tipe
Wajib
Deskripsi
regionstring
Ya
Wilayah tempat instance ECS sementara yang digunakan untuk membuat custom image berada. Contoh:
cn-qingdao.image_namestring
Ya
Nama custom image. Contoh:
packer_basic.instance_typestring
Ya
Tipe instance dari instance ECS sementara yang digunakan untuk membuat custom image. Contoh:
ecs.g6.large. Setelah custom image dibuat, instance ECS sementara akan dilepas secara otomatis.CatatanSaat Anda menggunakan Packer untuk membuat custom image, operasi CreateInstance dipanggil untuk membuat instance ECS sementara. Instance ini berisi sistem operasi dan perangkat lunak yang diperlukan untuk pembuatan image. Instance berbayar sesuai penggunaan ini dikenai biaya.
ssh_usernamestring
Ya
Username yang digunakan untuk menghubungkan ke instance ECS sementara melalui SSH.
internet_charge_typestring
Tidak
Metode penagihan penggunaan jaringan untuk instance ECS sementara yang digunakan untuk membuat custom image. Nilai yang valid:
PayByBandwidth: bayar-per-bandwidth.
PayByTraffic: bayar-per-lalu-lintas.
source_imagestring
Anda harus menentukan salah satu parameter.
ID image dasar yang digunakan untuk membuat instance ECS sementara. Anda dapat memperoleh ID image dasar dari daftar image publik di Konsol ECS atau dengan memanggil operasi DescribeImages.
PentingSaat mengonfigurasi parameter ini, pastikan tipe image yang dipilih kompatibel dengan tipe instance yang ditentukan. Misalnya, image Arm (yang ID imagenya mengandung
_arm64_) harus digunakan dengan tipe instance berbasis Arm. Jika tidak, pembuatan image akan gagal.image_familystring
Nama family image. Packer menggunakan image terbaru yang tersedia dari family ini untuk membuat instance.
CatatanNama harus terdiri dari 2 hingga 128 karakter. Nama tidak boleh dimulai dengan angka, karakter khusus, http://, atau https://. Nama dapat berisi huruf, angka, titik (.), garis bawah (_), tanda hubung (-), dan titik dua (:).
target_image_familystring
Tidak
Family image dari custom image yang akan dibuat.
CatatanNama harus terdiri dari 2 hingga 128 karakter. Nama tidak boleh dimulai dengan angka, karakter khusus, http://, atau https://. Nama dapat berisi huruf, angka, titik (.), garis bawah (_), tanda hubung (-), dan titik dua (:).
ssh_private_ipboolean
Anda harus menentukan salah satu parameter.
Menentukan apakah akan menghubungkan ke instance melalui koneksi SSH pribadi. Nilai default: false. Nilai yang valid:
false: Alamat IP ditetapkan untuk koneksi melalui internet.
true: Alamat IP elastis (EIP) atau alamat IP publik tidak ditetapkan. Instance dihubungkan melalui alamat IP pribadinya.
CatatanUntuk menggunakan koneksi pribadi, mesin tempat Packer dijalankan dan mesin yang dibuat oleh Packer harus berada dalam lingkungan jaringan yang sama, artinya keduanya harus berada dalam vSwitch yang sama.
associate_public_ip_addressboolean
Menentukan apakah akan menetapkan alamat IP publik ke instance ECS sementara.
eip_idstring
ID EIP yang dikaitkan dengan instance ECS sementara.
skip_image_validationboolean
Tidak
Menentukan apakah akan melewati pemeriksaan image. Nilai default: false.
system_disk_mappingobject
Tidak
Konfigurasi disk sistem. Contoh:
"system_disk_mapping": { "disk_name": "sysdisk", "disk_category": "cloud_essd", "disk_size": 40 }Untuk informasi selengkapnya, lihat bagian Konfigurasi disk cloud dalam topik ini.
image_disk_mappingslist
Tidak
Konfigurasi disk data dalam custom image. Contoh:
"image_disk_mappings": { "disk_name": "datadisk", "disk_snapshot_id": "s-bp1xxxxxx", "disk_device": "dev/xvdb" }Untuk informasi selengkapnya, lihat bagian Konfigurasi disk cloud dalam topik ini.
image_ignore_data_disksboolean
Tidak
Menentukan apakah image yang dibuat mencakup snapshot disk data. Nilai default: false. Nilai yang valid:
false: Image yang dibuat mencakup disk data.
true: Image yang dibuat hanya berdasarkan disk sistem dan tidak mencakup disk data.
profilestring
Tidak
File konfigurasi untuk menjalankan Packer. Jika parameter ini ditentukan, konfigurasi akan diambil terlebih dahulu dari file ini.
ram_role_namestring
Tidak
Nama peran RAM. Digunakan untuk mendapatkan AccessKey sementara bagi peran RAM lokal guna menjalankan templat Packer.
CatatanParameter ini hanya berlaku ketika Packer dijalankan pada instance ECS yang telah dilengkapi peran RAM.
ram_role_arnstring
Tidak
Nama Sumber Daya Alibaba Cloud (ARN) dari peran RAM. Digunakan bersama
ram_session_nameuntuk memungkinkan Akun A mengasumsikan peran Akun B guna membuat image.ram_session_namestring
Tidak
Nama sesi peran RAM. Digunakan bersama
ram_role_arnuntuk memungkinkan Akun A mengasumsikan peran Akun B guna membuat image.ecs_ram_role_namestring
Tidak
Nama peran RAM instans yang dilampirkan ke instance ECS sementara. Anda dapat memanggil operasi ListRoles yang disediakan oleh RAM untuk mengkueri daftar peran RAM instans yang tersedia.
ssh_keypair_namestring
Tidak
Nama pasangan kunci SSH yang digunakan untuk menghubungkan ke instance ECS sementara.
ssh_private_key_filestring
Tidak
Jalur file kunci privat dari pasangan kunci SSH yang digunakan untuk menghubungkan ke instance ECS sementara.
custom_endpoint_ecsstring
Tidak
Titik akhir kustom dari instance ECS sementara.
security_group_idstring
Tidak
ID grup keamanan tempat instance ECS sementara ditempatkan.
security_group_namestring
Tidak
Nama grup keamanan tempat instance ECS sementara ditempatkan. Jika Anda tidak menentukan ID grup keamanan, Packer akan membuat grup keamanan dengan nama yang ditentukan.
vpc_idstring
Tidak
ID virtual private cloud (VPC) tempat instance ECS sementara dibuat.
vpc_namestring
Tidak
Nama VPC tempat instance ECS sementara dibuat. Jika Anda tidak menentukan parameter
vpc_id, Packer akan membuat VPC dengan nama yang ditentukan.vswitch_idstring
Tidak
ID vSwitch tempat instance ECS sementara dihubungkan.
vswitch_namestring
Tidak
Nama vSwitch tempat instance ECS sementara dihubungkan. Jika Anda tidak menentukan parameter
vswitch_id, Packer akan membuat vSwitch dengan nama yang ditentukan.user_datastring
Tidak
Data pengguna instance. Data harus dienkode Base64, dan data mentah tidak boleh melebihi ukuran 32 KB. Untuk informasi selengkapnya tentang batasan, format, dan frekuensi eksekusi user data, lihat Kustomisasi konfigurasi inisialisasi untuk instance.
CatatanUntuk melindungi data sensitif seperti password dan kunci privat selama transmisi, enkripsi data tersebut sebelum melakukan enkode Base64, lalu dekripsi data di dalam instance.
user_data_filestring
Tidak
File data pengguna instance ECS sementara.
boot_modestring
Tidak
Mode boot custom image. Nilai yang valid: BIOS, UEFI, dan UEFI-Preferred.
wait_snapshot_ready_timeoutInteger
Tidak
Periode timeout snapshot. Nilai default: 3600. Satuan: detik.
instance_namestring
Tidak
Nama instance ECS sementara. Nilai default adalah nilai
InstanceIdinstance tersebut.CatatanNama harus terdiri dari 2 hingga 128 karakter dan dapat berisi huruf, angka, titik dua (:), garis bawah (_), titik (.), dan tanda hubung (-).
image_force_deleteboolean
Tidak
Menentukan apakah akan menghapus image yang sudah ada dengan nama yang sama seperti custom image yang ingin Anda buat. Nilai default: false. Nilai yang valid:
true: menghapus image yang sudah ada dengan nama yang sama seperti custom image yang ingin Anda buat, lalu membuat custom image tersebut.
false: tidak menghapus image yang sudah ada dengan nama yang sama seperti custom image yang ingin Anda buat. Dalam kasus ini, pembuatan image gagal.
image_force_delete_snapshotsboolean
Tidak
Menentukan apakah akan menghapus snapshot yang terkait dengan image yang sudah ada dengan nama yang sama seperti custom image yang ingin Anda buat. Nilai default: false. Nilai yang valid:
true: menghapus image yang sudah ada dengan nama yang sama seperti custom image yang ingin Anda buat beserta snapshot yang terkait dengannya, lalu membuat custom image tersebut.
false: tidak menghapus image yang sudah ada dengan nama yang sama seperti custom image yang ingin Anda buat atau snapshot yang terkait dengannya. Dalam kasus ini, pembuatan image gagal.
image_versionstring
Tidak
Versi custom image.
resource_group_idstring
Tidak
ID kelompok sumber daya tempat custom image ditempatkan.
force_stop_instanceboolean
Tidak
Menentukan apakah akan memaksa menghentikan instance ECS sementara. Nilai default: false.
disable_stop_instanceboolean
Tidak
Secara default, setelah Packer menjalankan provisioner, Packer akan menghentikan instance ECS sementara lalu membuat custom image dari instance tersebut. Namun, instance harus dalam status Berjalan dalam skenario tertentu, seperti saat Anda menjalankan Sysprep pada instance Windows. Nilai default: false.
run_tagsobject
Tidak
Tag custom image. Contoh:
{"key":"value"}.image_descriptionstring
Tidak
Deskripsi custom image.
image_share_account[]string
Tidak
Pengguna yang akan menerima sharing custom image. Contoh:
["123456"].image_copy_regions[]string
Tidak
Wilayah tempat Anda ingin menyalin custom image. Contoh:
["cn-beijing"].provisionersstring
Tidak
Jenis provisioner yang digunakan untuk membuat custom image. Nilai yang valid:
File
PowerShell
Shell
Local Shell
Windows Shell
Untuk informasi selengkapnya, lihat Provisioners.
Konfigurasi disk cloud
Parameter
Tipe
Wajib
Deskripsi
disk_namestring
Tidak
Nama disk cloud.
CatatanNama harus terdiri dari 2 hingga 128 karakter dan dapat berisi huruf, angka, titik dua (:), garis bawah (_), titik (.), dan tanda hubung (-).
disk_categorystring
Tidak
Kategori disk cloud. Nilai yang valid:
cloud_efficiency: disk ultra
cloud_ssd: SSD standar
cloud_essd: SSD Perusahaan (ESSD)
cloud: disk dasar
disk_sizeint
Tidak
Ukuran disk cloud. Satuan: GiB. Nilai parameter ini minimal 20 dan harus lebih besar atau sama dengan ukuran image. Nilai default: 40 atau ukuran image, mana yang lebih besar.
disk_descriptionstring
Tidak
Deskripsi disk cloud. Parameter ini kosong secara default.
CatatanDeskripsi harus terdiri dari 2 hingga 256 karakter dan tidak boleh dimulai dengan
http://atauhttps://.disk_snapshot_idstring
Tidak
ID snapshot yang ingin Anda gunakan untuk membuat disk data.
disk_delete_with_instanceboolean
Tidak
Menentukan apakah disk data akan dilepas saat instans terkait dilepas. Nilai yang valid:
true
false
Nilai default: true.
disk_devicestring
Tidak
Titik pemasangan disk data.
disk_encryptedboolean
Tidak
Menentukan apakah disk data dienkripsi. Nilai yang valid:
true
false
Nilai default: false.
Tekan
Esc, ketik:wq, lalu tekanEnteruntuk menyimpan file dan keluar.
Langkah 3: Gunakan Packer untuk membuat custom image
Ikuti langkah-langkah berikut untuk membuat custom image dari file templat Packer.
Buat custom image.
File HCL
packer build alicloud.pkr.hclOutput berikut menunjukkan bahwa image dengan ID
m-m5e3f0gu2dxs4z0s****telah dibuat di wilayah China (Qingdao).alicloud-ecs.autogenerated_1: output will be in this color. ==> alicloud-ecs.autogenerated_1: Prevalidating source region and copied regions... ==> alicloud-ecs.autogenerated_1: Prevalidating image name... alicloud-ecs.autogenerated_1: Found image ID: aliyun_3_x64_20G_alibase_20220907.vhd ==> alicloud-ecs.autogenerated_1: Creating temporary keypair: packer_64bf3d40-2fe7-8251-276d-df59a0bb**** --------------------------- ==> alicloud-ecs.autogenerated_1: Provisioning with shell script: /tmp/packer-shell3356722207 alicloud-ecs.autogenerated_1: Last metadata expiration check: 0:00:11 ago on Tue 25 Jul 2023 11:12:18 AM CST. --------------------------- alicloud-ecs.autogenerated_1: Complete! ==> alicloud-ecs.autogenerated_1: Stopping instance: i-m5e87pt498pr8zv0**** ==> alicloud-ecs.autogenerated_1: Waiting instance stopped: i-m5e87pt498pr8zv0**** ==> alicloud-ecs.autogenerated_1: Creating image: packer_basic alicloud-ecs.autogenerated_1: Detach keypair packer_64bf3d40-2fe7-8251-276d-df59a0bb**** from instance: i-m5e87pt498pr8zv0**** ==> alicloud-ecs.autogenerated_1: Cleaning up 'EIP' ==> alicloud-ecs.autogenerated_1: Cleaning up 'instance' ==> alicloud-ecs.autogenerated_1: Cleaning up 'security group' ==> alicloud-ecs.autogenerated_1: Cleaning up 'vSwitch' ==> alicloud-ecs.autogenerated_1: Cleaning up 'VPC' ==> alicloud-ecs.autogenerated_1: Deleting temporary keypair... Build 'alicloud-ecs.autogenerated_1' finished after 4 minutes 32 seconds. ==> Wait completed after 4 minutes 32 seconds ==> Builds finished. The artifacts of successful builds are: --> alicloud-ecs.autogenerated_1: Alicloud images were created: cn-qingdao: m-m5e3f0gu2dxs4z0s****File JSON
packer build alicloud.jsonOutput berikut menunjukkan bahwa image dengan ID
m-m5e3f0gu2dxs4z0s****telah dibuat di wilayah China (Qingdao).alicloud-ecs output will be in this color. ==> alicloud-ecs: Prevalidating image name... alicloud-ecs: Found image ID: aliyun_3_x64_20G_alibase_20220907.vhd ==> alicloud-ecs: Creating temporary keypair: packer_6345090e-ec1f-8ea0-348c-f85ba047**** ==> alicloud-ecs: Creating vpc --------------------------- ==> alicloud-ecs: Provisioning with shell script: /tmp/packer-shell090019677 alicloud-ecs: Last metadata expiration check: 0:00:15 ago on Tue 11 Oct 2022 02:12:51 PM CST. --------------------------- alicloud-ecs: Complete! ==> alicloud-ecs: Deleting image snapshots. ==> alicloud-ecs: Creating image: packer_basic alicloud-ecs: Detach keypair packer_6345090e-ec1f-8ea0-348c-f85ba047**** from instance: i-m5e7it5p4dpwetfr**** ==> alicloud-ecs: Cleaning up 'EIP' ==> alicloud-ecs: Cleaning up 'instance' ==> alicloud-ecs: Cleaning up 'security group' ==> alicloud-ecs: Cleaning up 'vSwitch' ==> alicloud-ecs: Cleaning up 'VPC' ==> alicloud-ecs: Deleting temporary keypair... Build 'alicloud-ecs' finished. ==> Builds finished. The artifacts of successful builds are: --> alicloud-ecs: Alicloud images were created: cn-qingdao: m-m5e3f0gu2dxs4z0s****Verifikasi custom image yang telah dibuat.
-
Masuk ke Konsol ECS.
-
Di panel navigasi sebelah kiri, pilih .
Di bilah navigasi atas, pilih wilayah yang ditentukan dalam file templat Anda, misalnya China (Qingdao).
Di tab Custom Images, cari image bernama packer_basic.
-