استفاده از Packer و Proxmox برای ساخت قالب

Summarize this content to 400 words in Persian Lang
خودکارسازی استقرار ماشینهای مجازی (VMs) بخشی ضروری از زیرساختهای مدرن فناوری اطلاعات است. Packer و Proxmox دو ابزار قدرتمند هستند که در صورت ترکیب، راه حل موثری برای ایجاد خودکار تصویر VM ارائه می دهند. این مقاله به بررسی این موضوع میپردازد که چرا استفاده از Packer با Proxmox مفید است، و همچنین اجرای عملی این ترکیب را بررسی میکند.
چرا از Packer برای Proxmox استفاده کنیم؟
تکرارپذیری و سازگاری: Packer به شما امکان می دهد تمام تنظیمات یک تصویر VM را در یک فایل با فرمت HCL یا JSON تعریف کنید. با استفاده از Packer، تکرارپذیری در فرآیند ایجاد تصویر را تضمین میکنید و از ثبات در استقرار خود اطمینان میدهید.
پشتیبانی از پلتفرم های مختلف: Packer از چندین فروشنده پشتیبانی می کند و Proxmox تنها یکی از آنهاست. این انعطافپذیری به شما امکان میدهد تصاویری ایجاد کنید که میتوانند بر روی انواع مختلف پلتفرم، چه در محل و چه در فضای ابری، مستقر شوند.
بهینه سازی منابع: می توانید ایجاد تصاویر سبک وزن، بهینه سازی شده، حذف اجزای غیر ضروری و اعمال تنظیمات خاص محیط خود را خودکار کنید.
صرفه جویی در زمان: خودکارسازی فرآیند ایجاد تصویر زمان مورد نیاز برای آماده سازی ماشین های مجازی را به میزان قابل توجهی کاهش می دهد. شما می توانید کارهایی مانند نصب نرم افزار، پیکربندی شبکه و بسیاری دیگر را خودکار کنید و چرخه استقرار را تسریع کنید.
چگونه از Packer در Proxmox استفاده کنیم؟
Packer را روی دستگاه توسعه خود نصب کنید و آن را برای استفاده از ارائه دهنده Proxmox با مشخص کردن جزئیات اتصال (آدرس IP سروری که تصویر در آن ایجاد می شود، نام کاربری، رمز عبور) پیکربندی کنید. برای نصب، فقط می توانم پیشنهاد کنم که به وب سایت رسمی مراجعه کنید.
سپس 3 مرحله در فرآیند ایجاد تصویر Packer وجود دارد:
ایجاد تعریف مدل Packer و فایل های پیکربندی خودکار سیستم عامل
یک فایل پیکربندی Packer با فرمت HCL یا JSON ایجاد کنید که مراحل مورد نیاز برای ایجاد تصویر Proxmox خود را شرح دهد.
پارامترهایی مانند نوع سیستم عامل، اسکریپت های تامین و پارامترهای خاص Proxmox را مشخص کنید.
سیستم عامل ها را می توان به صورت مستقل و پویا، بدون نیاز به کلیک کردن یا وارد کردن دستورات، پیکربندی کرد. برای انجام این کار، استفاده از فایل های پیکربندی باید در نظر گرفته شود و در راستای تغییر نیازمندی ها حفظ شود.
اجرای ساخت:فرآیند ساخت و ساز را با Packer شروع کنید. Packer به هاست Proxmox شما متصل می شود، یک VM موقت ایجاد می کند، تنظیمات را اعمال می کند و آن را به یک الگو تبدیل می کند. این الگو منبعی برای استقرار شما خواهد بود، الگوی برای شبیه سازی.
اعتبار سنجی:
تصویر تولید شده را با استقرار آن بر روی یک ماشین مجازی Proxmox بررسی کنید.
تصویر را در هاست های دیگر Proxmox توزیع کنید یا آن را برای استفاده در آینده ذخیره کنید.
مورد استفاده من و پیکربندی من
من از Packer در homelab خود برای تولید قالبها (Debian 12 و Ubuntu 22.04) استفاده میکنم که سپس از طریق Open Tofu برای ساخت ماشینهای مجازی مورد نیاز خود دوباره استفاده میکنم. برای آسانتر کردن سفارشیسازی، تا حد امکان از متغیرها استفاده میکنم. بنابراین فایل پایه ثابت است و فقط متغیرها (در یک فایل جداگانه) باید در صورت نیاز اصلاح شوند.
من قبلاً تصویر ISO Debian 12 را در فضای ذخیره سازی روی هاست Proxmox خود آپلود کرده ام. این امکان وجود دارد که از Packer برای دانلود تصویر ISO از اینترنت و ارسال آن به هاست Proxmox خود استفاده کنید. من این راه حل را انتخاب نکردم زیرا می خواستم دسترسی به وب را محدود کنم و خودم را برای “خود میزبانی” کامل تنظیم کنم.
برای ایجاد ارتباط بین Proxmox و Packer، یک کاربر در قلمرو “pve” ایجاد کردم، سپس یک توکن برای این کاربر ایجاد کردم و در نهایت حقوقی را به توکن API اختصاص دادم:
در تب “Datacenter” به بخش “Permissions” رفته و روی “Users” و دکمه “Add” کلیک کنید. اطلاعات لازم را وارد کنید (بدون نیاز به رمز عبور) سپس فرم را ذخیره کنید. نام این کاربر را به خاطر بسپارید.
هنوز در بخش «مجوزها»، روی «توکن API» و دکمه «افزودن» کلیک کنید. کاربری که قبلا ایجاد شده را انتخاب کنید، به نشانه یک نام بدهید (برای به خاطر سپردن) و با فرم ادامه دهید. سپس یک راز نمایش داده می شود و باید در مکانی امن ذخیره شود. این راز برای کار با Proxmox با Packer مورد نیاز است.
در نهایت، به بخش «مجوزها» برگردید، سپس روی دکمه «افزودن – مجوز توکن API» کلیک کنید: کاربری را با شناسه API که ایجاد کردهاید انتخاب کنید و حقوق زیر را به آن اضافه کنید:
مسیر: “https://dev.to/”
نقش : “PVEAdmin” (خیلی زیاد است، اما چاره ای نیست. یا می توانید نقش خود را با حقوق لازم ایجاد کنید…)
انتشار دهید: کادر را علامت بزنید (برای داشتن مجوز در کل زیرساخت – ماشین ها، ذخیره سازی، شبکه مفید است)
در پوشهای که فایلهای من در آن ذخیره میشوند، من یک زیرپوشه “autoinstall” ایجاد کردهام تا فایل پیشفرض را قرار دهم که به Debian اجازه میدهد به طور خودکار نصب شود.
~/git/homelab/packer$ tree
.
├── autoinstall
│ ├── preseed.cfg
├── customdeb12.pkrvars.hcl
└── debian12.pkr.hcl
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
از این پس، فایل های مورد نیاز برای ایجاد یک تصویر Debian 12 با Packer، برای Proxmox در اینجا آمده است:فایل debian12.pkr.hcl”: این فایلی است که الزامات Packer را برای موارد استفاده ما، اساس مدل ما، اتصال به سرور Proxmox و متغیرها را تعریف می کند.
// debian12.pkr.hcl
packer {
required_plugins {
name = {
version = “1.1.6”
source = “github.com/hashicorp/proxmox”
}
}
}
variable “bios_type” {
type = string
}
variable “boot_command” {
type = string
}
variable “boot_wait” {
type = string
}
variable “bridge_firewall” {
type = bool
default = false
}
variable “bridge_name” {
type = string
}
variable “cloud_init” {
type = bool
}
variable “iso_file” {
type = string
}
variable “iso_storage_pool” {
type = string
default = “local”
}
variable “machine_default_type” {
type = string
default = “pc”
}
variable “network_model” {
type = string
default = “virtio”
}
variable “os_type” {
type = string
default = “l26”
}
variable “proxmox_api_token_id” {
type = string
}
variable “proxmox_api_token_secret” {
type = string
sensitive = true
}
variable “proxmox_api_url” {
type = string
}
variable “proxmox_node” {
type = string
}
variable “qemu_agent_activation” {
type = bool
default = true
}
variable “scsi_controller_type” {
type = string
}
variable “ssh_timeout” {
type = string
}
variable “tags” {
type = string
}
variable “io_thread” {
type = bool
}
variable “cpu_type” {
type = string
default = “kvm64”
}
variable “vm_info” {
type = string
}
variable “disk_discard” {
type = bool
default = true
}
variable “disk_format” {
type = string
default = “qcow2”
}
variable “disk_size” {
type = string
default = “16G”
}
variable “disk_type” {
type = string
default = “scsi”
}
variable “nb_core” {
type = number
default = 1
}
variable “nb_cpu” {
type = number
default = 1
}
variable “nb_ram” {
type = number
default = 1024
}
variable “ssh_username” {
type = string
}
variable “ssh_password” {
type = string
}
variable “ssh_handshake_attempts” {
type = number
}
variable “storage_pool” {
type = string
default = “local-lvm”
}
variable “vm_id” {
type = number
default = 99999
}
variable “vm_name” {
type = string
}
locals {
packer_timestamp = formatdate(“YYYYMMDD-hhmm”, timestamp())
}
source “proxmox-iso” “debian12” {
bios = “${var.bios_type}”
boot_command = [“${var.boot_command}”]
boot_wait = “${var.boot_wait}”
cloud_init = “${var.cloud_init}”
cloud_init_storage_pool = “${var.storage_pool}”
communicator = “ssh”
cores = “${var.nb_core}”
cpu_type = “${var.cpu_type}”
http_directory = “autoinstall”
insecure_skip_tls_verify = true
iso_file = “${var.iso_file}”
machine = “${var.machine_default_type}”
memory = “${var.nb_ram}”
node = “${var.proxmox_node}”
os = “${var.os_type}”
proxmox_url = “${var.proxmox_api_url}”
qemu_agent = “${var.qemu_agent_activation}”
scsi_controller = “${var.scsi_controller_type}”
sockets = “${var.nb_cpu}”
ssh_handshake_attempts = “${var.ssh_handshake_attempts}”
ssh_pty = true
ssh_timeout = “${var.ssh_timeout}”
ssh_username = “${var.ssh_username}”
ssh_password = “${var.ssh_password}”
tags = “${var.tags}”
template_description = “${var.vm_info} – ${local.packer_timestamp}”
token = “${var.proxmox_api_token_secret}”
unmount_iso = true
username = “${var.proxmox_api_token_id}”
vm_id = “${var.vm_id}”
vm_name = “${var.vm_name}”
disks {
discard = “${var.disk_discard}”
disk_size = “${var.disk_size}”
format = “${var.disk_format}”
io_thread = “${var.io_thread}”
storage_pool = “${var.storage_pool}”
type = “${var.disk_type}”
}
network_adapters {
bridge = “${var.bridge_name}”
firewall = “${var.bridge_firewall}”
model = “${var.network_model}”
}
}
build {
sources = [“source.proxmox-iso.debian12″]
}
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
فایل Custom.pkvars.hcl”: برای سفارشی کردن مدل از متغیرها استفاده می شود.
// custom.pkvars.hcl
bios_type = “seabios”
boot_command = “auto console-keymaps-at/keymap=fr console-setup/ask_detect=false debconf/frontend=noninteractive fb=false url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg”
boot_wait = “10s”
bridge_name = “vmbr0”
bridge_firewall = false
cloud_init = true
cpu_type = “x86-64-v2-AES”
disk_discard = true
disk_format = “qcow2”
disk_size = “12G”
disk_type = “scsi”
iso_file = “local:iso/debian-12.4.0-amd64-netinst.iso”
machine_default_type = “q35”
nb_core = 1
nb_cpu = 1
nb_ram = 2048
network_model = “virtio”
io_thread = false
os_type = “l26”
proxmox_api_token_id = “packbot@pve!nom_token”
proxmox_api_token_secret = “aaaaaa-aaaa-bbbb-cccc-123456789012”
proxmox_api_url = “https://ip_proxmox:8006/api2/json”
proxmox_node = “nom_hôte_proxmox”
qemu_agent_activation = true
scsi_controller_type = “virtio-scsi-pci”
ssh_handshake_attempts = 6
ssh_timeout = “35m”
ssh_username = “umair”
ssh_password = “umairpwd”
storage_pool = “stoCeph”
tags = “template”
vm_id = 99998
vm_info = “Debian 12 Packer Template”
vm_name = “pckr-deb12”
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
چند نکته در مورد این متغیرها:
فراموش نکنید که مقادیر “bridge_name”، “iso_file” (نام فضای ذخیره سازی که تصویر ISO در آن قرار دارد و نام آن)، “proxmox_”، “ssh_*” را تغییر دهید.
متغیر “boot_command” برای وادار کردن ISO به استفاده از فایل پیش فرض استفاده می شود
“cloud_init نصب و فعال شده است تا پیکربندی ماشین های مجازی برای Open Tofu آسان تر شود.
من به شما اجازه می دهم که سایر متغیرها را در نظر بگیرید و آنها را مطابق با نیازهای خود تغییر دهید.
فایل “autoinstall/preseed.cfg”: فایل پیکربندی نصب دبیان، برای نصب بدون لمس.
#_preseed_V1
d-i debian-installer/language string en
d-i debian-installer/country string EN
d-i debian-installer/locale string en_US.UTF-8
d-i localechooser/supported-locales multiselect en_US.UTF-8, en_US.UTF-8
d-i keyboard-configuration/xkb-keymap select en
d-i console-keymaps-at/keymap select en-latin9
d-i debian-installer/keymap string en-latin9
d-i netcfg/choose_interface select auto
d-i netcfg/link_wait_timeout string 5
d-i netcfg/dhcp_timeout string 60
d-i netcfg/get_hostname string pckr-deb12
d-i netcfg/get_domain string local.xyz.com
d-i netcfg/wireless_wep string
d-i hw-detect/load_firmware boolean false
d-i mirror/country string FR
d-i mirror/http/hostname string deb.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
d-i passwd/root-login boolean true
d-i passwd/make-user boolean true
d-i passwd/root-password password umairpwd
d-i passwd/root-password-again password umairpwd
d-i passwd/user-fullname string umair
d-i passwd/username string umair
d-i passwd/user-password password umairpwd
d-i passwd/user-password-again password umairpwd
d-i clock-setup/utc boolean true
d-i time/zone string US/New York
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string 0.us.pool.ntp.org
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string lvm
d-i partman-auto-lvm/guided_size string max
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto/choose_recipe select multi
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman/mount_style select uuid
d-i base-installer/install-recommends boolean false
d-i apt-setup/cdrom/set-first boolean false
d-i apt-setup/use_mirror boolean true
d-i apt-setup/security_host string security.debian.org
tasksel tasksel/first multiselect standard, ssh-server
d-i pkgsel/include string qemu-guest-agent sudo ca-certificates cloud-init
d-i pkgsel/upgrade select safe-upgrade
popularity-contest popularity-contest/participate boolean false
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean false
d-i grub-installer/bootdev string default
d-i finish-install/reboot_in_progress note
d-i cdrom-detect/eject boolean true
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
با تمام فایل های بالا و پیکربندی کاربر در Proxmox، باید بتوانید یک ماشین ایجاد کنید. دستورات Packer برای اجرا به شرح زیر است:
# initialize the repository to retrieve:
packer init debian12.pkr.hcl
# validate Packer files:
packer validate -var-file=customdeb12.pkrvars.hcl debian12.pkr.hcl
# build the image, replacing the artefact if it already exists:
packer build -on-error=ask -force -var-file=customdeb12.pkrvars.hcl debian12.pkr.hcl
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
خودکارسازی استقرار ماشینهای مجازی (VMs) بخشی ضروری از زیرساختهای مدرن فناوری اطلاعات است. Packer و Proxmox دو ابزار قدرتمند هستند که در صورت ترکیب، راه حل موثری برای ایجاد خودکار تصویر VM ارائه می دهند. این مقاله به بررسی این موضوع میپردازد که چرا استفاده از Packer با Proxmox مفید است، و همچنین اجرای عملی این ترکیب را بررسی میکند.
چرا از Packer برای Proxmox استفاده کنیم؟
- تکرارپذیری و سازگاری: Packer به شما امکان می دهد تمام تنظیمات یک تصویر VM را در یک فایل با فرمت HCL یا JSON تعریف کنید. با استفاده از Packer، تکرارپذیری در فرآیند ایجاد تصویر را تضمین میکنید و از ثبات در استقرار خود اطمینان میدهید.
- پشتیبانی از پلتفرم های مختلف: Packer از چندین فروشنده پشتیبانی می کند و Proxmox تنها یکی از آنهاست. این انعطافپذیری به شما امکان میدهد تصاویری ایجاد کنید که میتوانند بر روی انواع مختلف پلتفرم، چه در محل و چه در فضای ابری، مستقر شوند.
- بهینه سازی منابع: می توانید ایجاد تصاویر سبک وزن، بهینه سازی شده، حذف اجزای غیر ضروری و اعمال تنظیمات خاص محیط خود را خودکار کنید.
- صرفه جویی در زمان: خودکارسازی فرآیند ایجاد تصویر زمان مورد نیاز برای آماده سازی ماشین های مجازی را به میزان قابل توجهی کاهش می دهد. شما می توانید کارهایی مانند نصب نرم افزار، پیکربندی شبکه و بسیاری دیگر را خودکار کنید و چرخه استقرار را تسریع کنید.
چگونه از Packer در Proxmox استفاده کنیم؟
Packer را روی دستگاه توسعه خود نصب کنید و آن را برای استفاده از ارائه دهنده Proxmox با مشخص کردن جزئیات اتصال (آدرس IP سروری که تصویر در آن ایجاد می شود، نام کاربری، رمز عبور) پیکربندی کنید. برای نصب، فقط می توانم پیشنهاد کنم که به وب سایت رسمی مراجعه کنید.
سپس 3 مرحله در فرآیند ایجاد تصویر Packer وجود دارد:
- ایجاد تعریف مدل Packer و فایل های پیکربندی خودکار سیستم عامل
- یک فایل پیکربندی Packer با فرمت HCL یا JSON ایجاد کنید که مراحل مورد نیاز برای ایجاد تصویر Proxmox خود را شرح دهد.
- پارامترهایی مانند نوع سیستم عامل، اسکریپت های تامین و پارامترهای خاص Proxmox را مشخص کنید.
سیستم عامل ها را می توان به صورت مستقل و پویا، بدون نیاز به کلیک کردن یا وارد کردن دستورات، پیکربندی کرد. برای انجام این کار، استفاده از فایل های پیکربندی باید در نظر گرفته شود و در راستای تغییر نیازمندی ها حفظ شود.
اجرای ساخت:
فرآیند ساخت و ساز را با Packer شروع کنید. Packer به هاست Proxmox شما متصل می شود، یک VM موقت ایجاد می کند، تنظیمات را اعمال می کند و آن را به یک الگو تبدیل می کند. این الگو منبعی برای استقرار شما خواهد بود، الگوی برای شبیه سازی.
اعتبار سنجی:
- تصویر تولید شده را با استقرار آن بر روی یک ماشین مجازی Proxmox بررسی کنید.
- تصویر را در هاست های دیگر Proxmox توزیع کنید یا آن را برای استفاده در آینده ذخیره کنید.
مورد استفاده من و پیکربندی من
من از Packer در homelab خود برای تولید قالبها (Debian 12 و Ubuntu 22.04) استفاده میکنم که سپس از طریق Open Tofu برای ساخت ماشینهای مجازی مورد نیاز خود دوباره استفاده میکنم. برای آسانتر کردن سفارشیسازی، تا حد امکان از متغیرها استفاده میکنم. بنابراین فایل پایه ثابت است و فقط متغیرها (در یک فایل جداگانه) باید در صورت نیاز اصلاح شوند.
من قبلاً تصویر ISO Debian 12 را در فضای ذخیره سازی روی هاست Proxmox خود آپلود کرده ام. این امکان وجود دارد که از Packer برای دانلود تصویر ISO از اینترنت و ارسال آن به هاست Proxmox خود استفاده کنید. من این راه حل را انتخاب نکردم زیرا می خواستم دسترسی به وب را محدود کنم و خودم را برای “خود میزبانی” کامل تنظیم کنم.
برای ایجاد ارتباط بین Proxmox و Packer، یک کاربر در قلمرو “pve” ایجاد کردم، سپس یک توکن برای این کاربر ایجاد کردم و در نهایت حقوقی را به توکن API اختصاص دادم:
- در تب “Datacenter” به بخش “Permissions” رفته و روی “Users” و دکمه “Add” کلیک کنید. اطلاعات لازم را وارد کنید (بدون نیاز به رمز عبور) سپس فرم را ذخیره کنید. نام این کاربر را به خاطر بسپارید.
- هنوز در بخش «مجوزها»، روی «توکن API» و دکمه «افزودن» کلیک کنید. کاربری که قبلا ایجاد شده را انتخاب کنید، به نشانه یک نام بدهید (برای به خاطر سپردن) و با فرم ادامه دهید. سپس یک راز نمایش داده می شود و باید در مکانی امن ذخیره شود. این راز برای کار با Proxmox با Packer مورد نیاز است.
- در نهایت، به بخش «مجوزها» برگردید، سپس روی دکمه «افزودن – مجوز توکن API» کلیک کنید: کاربری را با شناسه API که ایجاد کردهاید انتخاب کنید و حقوق زیر را به آن اضافه کنید:
- مسیر: “https://dev.to/”
- نقش : “PVEAdmin” (خیلی زیاد است، اما چاره ای نیست. یا می توانید نقش خود را با حقوق لازم ایجاد کنید…)
- انتشار دهید: کادر را علامت بزنید (برای داشتن مجوز در کل زیرساخت – ماشین ها، ذخیره سازی، شبکه مفید است)
در پوشهای که فایلهای من در آن ذخیره میشوند، من یک زیرپوشه “autoinstall” ایجاد کردهام تا فایل پیشفرض را قرار دهم که به Debian اجازه میدهد به طور خودکار نصب شود.
~/git/homelab/packer$ tree
.
├── autoinstall
│ ├── preseed.cfg
├── customdeb12.pkrvars.hcl
└── debian12.pkr.hcl
از این پس، فایل های مورد نیاز برای ایجاد یک تصویر Debian 12 با Packer، برای Proxmox در اینجا آمده است:
فایل debian12.pkr.hcl”: این فایلی است که الزامات Packer را برای موارد استفاده ما، اساس مدل ما، اتصال به سرور Proxmox و متغیرها را تعریف می کند.
// debian12.pkr.hcl
packer {
required_plugins {
name = {
version = "1.1.6"
source = "github.com/hashicorp/proxmox"
}
}
}
variable "bios_type" {
type = string
}
variable "boot_command" {
type = string
}
variable "boot_wait" {
type = string
}
variable "bridge_firewall" {
type = bool
default = false
}
variable "bridge_name" {
type = string
}
variable "cloud_init" {
type = bool
}
variable "iso_file" {
type = string
}
variable "iso_storage_pool" {
type = string
default = "local"
}
variable "machine_default_type" {
type = string
default = "pc"
}
variable "network_model" {
type = string
default = "virtio"
}
variable "os_type" {
type = string
default = "l26"
}
variable "proxmox_api_token_id" {
type = string
}
variable "proxmox_api_token_secret" {
type = string
sensitive = true
}
variable "proxmox_api_url" {
type = string
}
variable "proxmox_node" {
type = string
}
variable "qemu_agent_activation" {
type = bool
default = true
}
variable "scsi_controller_type" {
type = string
}
variable "ssh_timeout" {
type = string
}
variable "tags" {
type = string
}
variable "io_thread" {
type = bool
}
variable "cpu_type" {
type = string
default = "kvm64"
}
variable "vm_info" {
type = string
}
variable "disk_discard" {
type = bool
default = true
}
variable "disk_format" {
type = string
default = "qcow2"
}
variable "disk_size" {
type = string
default = "16G"
}
variable "disk_type" {
type = string
default = "scsi"
}
variable "nb_core" {
type = number
default = 1
}
variable "nb_cpu" {
type = number
default = 1
}
variable "nb_ram" {
type = number
default = 1024
}
variable "ssh_username" {
type = string
}
variable "ssh_password" {
type = string
}
variable "ssh_handshake_attempts" {
type = number
}
variable "storage_pool" {
type = string
default = "local-lvm"
}
variable "vm_id" {
type = number
default = 99999
}
variable "vm_name" {
type = string
}
locals {
packer_timestamp = formatdate("YYYYMMDD-hhmm", timestamp())
}
source "proxmox-iso" "debian12" {
bios = "${var.bios_type}"
boot_command = ["${var.boot_command}"]
boot_wait = "${var.boot_wait}"
cloud_init = "${var.cloud_init}"
cloud_init_storage_pool = "${var.storage_pool}"
communicator = "ssh"
cores = "${var.nb_core}"
cpu_type = "${var.cpu_type}"
http_directory = "autoinstall"
insecure_skip_tls_verify = true
iso_file = "${var.iso_file}"
machine = "${var.machine_default_type}"
memory = "${var.nb_ram}"
node = "${var.proxmox_node}"
os = "${var.os_type}"
proxmox_url = "${var.proxmox_api_url}"
qemu_agent = "${var.qemu_agent_activation}"
scsi_controller = "${var.scsi_controller_type}"
sockets = "${var.nb_cpu}"
ssh_handshake_attempts = "${var.ssh_handshake_attempts}"
ssh_pty = true
ssh_timeout = "${var.ssh_timeout}"
ssh_username = "${var.ssh_username}"
ssh_password = "${var.ssh_password}"
tags = "${var.tags}"
template_description = "${var.vm_info} - ${local.packer_timestamp}"
token = "${var.proxmox_api_token_secret}"
unmount_iso = true
username = "${var.proxmox_api_token_id}"
vm_id = "${var.vm_id}"
vm_name = "${var.vm_name}"
disks {
discard = "${var.disk_discard}"
disk_size = "${var.disk_size}"
format = "${var.disk_format}"
io_thread = "${var.io_thread}"
storage_pool = "${var.storage_pool}"
type = "${var.disk_type}"
}
network_adapters {
bridge = "${var.bridge_name}"
firewall = "${var.bridge_firewall}"
model = "${var.network_model}"
}
}
build {
sources = ["source.proxmox-iso.debian12"]
}
فایل Custom.pkvars.hcl”: برای سفارشی کردن مدل از متغیرها استفاده می شود.
// custom.pkvars.hcl
bios_type = "seabios"
boot_command = "auto console-keymaps-at/keymap=fr console-setup/ask_detect=false debconf/frontend=noninteractive fb=false url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg"
boot_wait = "10s"
bridge_name = "vmbr0"
bridge_firewall = false
cloud_init = true
cpu_type = "x86-64-v2-AES"
disk_discard = true
disk_format = "qcow2"
disk_size = "12G"
disk_type = "scsi"
iso_file = "local:iso/debian-12.4.0-amd64-netinst.iso"
machine_default_type = "q35"
nb_core = 1
nb_cpu = 1
nb_ram = 2048
network_model = "virtio"
io_thread = false
os_type = "l26"
proxmox_api_token_id = "packbot@pve!nom_token"
proxmox_api_token_secret = "aaaaaa-aaaa-bbbb-cccc-123456789012"
proxmox_api_url = "https://ip_proxmox:8006/api2/json"
proxmox_node = "nom_hôte_proxmox"
qemu_agent_activation = true
scsi_controller_type = "virtio-scsi-pci"
ssh_handshake_attempts = 6
ssh_timeout = "35m"
ssh_username = "umair"
ssh_password = "umairpwd"
storage_pool = "stoCeph"
tags = "template"
vm_id = 99998
vm_info = "Debian 12 Packer Template"
vm_name = "pckr-deb12"
چند نکته در مورد این متغیرها:
- فراموش نکنید که مقادیر “bridge_name”، “iso_file” (نام فضای ذخیره سازی که تصویر ISO در آن قرار دارد و نام آن)، “proxmox_”، “ssh_*” را تغییر دهید.
- متغیر “boot_command” برای وادار کردن ISO به استفاده از فایل پیش فرض استفاده می شود
- “cloud_init نصب و فعال شده است تا پیکربندی ماشین های مجازی برای Open Tofu آسان تر شود.
من به شما اجازه می دهم که سایر متغیرها را در نظر بگیرید و آنها را مطابق با نیازهای خود تغییر دهید.
فایل “autoinstall/preseed.cfg”: فایل پیکربندی نصب دبیان، برای نصب بدون لمس.
#_preseed_V1
d-i debian-installer/language string en
d-i debian-installer/country string EN
d-i debian-installer/locale string en_US.UTF-8
d-i localechooser/supported-locales multiselect en_US.UTF-8, en_US.UTF-8
d-i keyboard-configuration/xkb-keymap select en
d-i console-keymaps-at/keymap select en-latin9
d-i debian-installer/keymap string en-latin9
d-i netcfg/choose_interface select auto
d-i netcfg/link_wait_timeout string 5
d-i netcfg/dhcp_timeout string 60
d-i netcfg/get_hostname string pckr-deb12
d-i netcfg/get_domain string local.xyz.com
d-i netcfg/wireless_wep string
d-i hw-detect/load_firmware boolean false
d-i mirror/country string FR
d-i mirror/http/hostname string deb.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string
d-i passwd/root-login boolean true
d-i passwd/make-user boolean true
d-i passwd/root-password password umairpwd
d-i passwd/root-password-again password umairpwd
d-i passwd/user-fullname string umair
d-i passwd/username string umair
d-i passwd/user-password password umairpwd
d-i passwd/user-password-again password umairpwd
d-i clock-setup/utc boolean true
d-i time/zone string US/New York
d-i clock-setup/ntp boolean true
d-i clock-setup/ntp-server string 0.us.pool.ntp.org
d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string lvm
d-i partman-auto-lvm/guided_size string max
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto/choose_recipe select multi
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman/mount_style select uuid
d-i base-installer/install-recommends boolean false
d-i apt-setup/cdrom/set-first boolean false
d-i apt-setup/use_mirror boolean true
d-i apt-setup/security_host string security.debian.org
tasksel tasksel/first multiselect standard, ssh-server
d-i pkgsel/include string qemu-guest-agent sudo ca-certificates cloud-init
d-i pkgsel/upgrade select safe-upgrade
popularity-contest popularity-contest/participate boolean false
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean false
d-i grub-installer/bootdev string default
d-i finish-install/reboot_in_progress note
d-i cdrom-detect/eject boolean true
با تمام فایل های بالا و پیکربندی کاربر در Proxmox، باید بتوانید یک ماشین ایجاد کنید. دستورات Packer برای اجرا به شرح زیر است:
# initialize the repository to retrieve:
packer init debian12.pkr.hcl
# validate Packer files:
packer validate -var-file=customdeb12.pkrvars.hcl debian12.pkr.hcl
# build the image, replacing the artefact if it already exists:
packer build -on-error=ask -force -var-file=customdeb12.pkrvars.hcl debian12.pkr.hcl