feat: Add Packer build automation scripts
Some checks are pending
Build and Release / build-sign-package (push) Waiting to run
Some checks are pending
Build and Release / build-sign-package (push) Waiting to run
- Added packer/variables.pkr.hcl with configurable variables - Added build-template.sh with interactive build script - Added .env.example for environment configuration - Updated windows.pkr.hcl to use variables - Supports environment variables and command line arguments
This commit is contained in:
parent
e4f03427b7
commit
61ae0d0a07
4 changed files with 315 additions and 17 deletions
19
.env.example
Normal file
19
.env.example
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Windows Automation Environment Configuration
|
||||||
|
# Copy this file to .env and fill in your values
|
||||||
|
|
||||||
|
# Proxmox Configuration
|
||||||
|
export PROXMOX_URL="https://la-vmh-07:8006/api2/json"
|
||||||
|
export PROXMOX_USERNAME="root@pam"
|
||||||
|
export PROXMOX_PASSWORD="your-proxmox-root-password"
|
||||||
|
export PROXMOX_NODE="la-vmh-07"
|
||||||
|
|
||||||
|
# Windows Configuration
|
||||||
|
export WINRM_PASSWORD="PackerPassword123!"
|
||||||
|
|
||||||
|
# Proxmox API Token (alternative to password)
|
||||||
|
export PM_API_TOKEN_ID="root@pam!forgejo-automation"
|
||||||
|
export PM_API_TOKEN_SECRET="your-api-token-secret"
|
||||||
|
|
||||||
|
# Terraform Variables
|
||||||
|
export TF_VAR_build_id="001"
|
||||||
|
export TF_VAR_template_vm_id="9000"
|
||||||
199
build-template.sh
Executable file
199
build-template.sh
Executable file
|
|
@ -0,0 +1,199 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Windows Packer Build Script
|
||||||
|
# This script builds the Windows 11 LTSC template on Proxmox
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Colors
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${BLUE}║${NC} ${GREEN}Windows 11 LTSC Packer Build${NC} ${BLUE}║${NC}"
|
||||||
|
echo -e "${BLUE}║${NC} ${GREEN}Proxmox Virtual Environment${NC} ${BLUE}║${NC}"
|
||||||
|
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Default values
|
||||||
|
PROXMOX_NODE="la-vmh-07"
|
||||||
|
PROXMOX_URL="https://${PROXMOX_NODE}:8006/api2/json"
|
||||||
|
PROXMOX_USERNAME="root@pam"
|
||||||
|
|
||||||
|
# Check for .env file
|
||||||
|
if [ -f ".env" ]; then
|
||||||
|
echo -e "${GREEN}Loading configuration from .env file...${NC}"
|
||||||
|
source .env
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Parse command line arguments
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--node)
|
||||||
|
PROXMOX_NODE="$2"
|
||||||
|
PROXMOX_URL="https://${PROXMOX_NODE}:8006/api2/json"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--url)
|
||||||
|
PROXMOX_URL="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--user)
|
||||||
|
PROXMOX_USERNAME="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--password)
|
||||||
|
export PKR_VAR_proxmox_password="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--check)
|
||||||
|
echo "Running validation only..."
|
||||||
|
CHECK_MODE=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--help|-h)
|
||||||
|
echo "Usage: $0 [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo " --node HOSTNAME Proxmox node name (default: la-vmh-07)"
|
||||||
|
echo " --url URL Proxmox API URL"
|
||||||
|
echo " --user USERNAME Proxmox username (default: root@pam)"
|
||||||
|
echo " --password PASS Proxmox password"
|
||||||
|
echo " --check Validate only, don't build"
|
||||||
|
echo ""
|
||||||
|
echo "Environment variables:"
|
||||||
|
echo " PKR_VAR_proxmox_password Proxmox password"
|
||||||
|
echo " PKR_VAR_proxmox_url Proxmox API URL"
|
||||||
|
echo " PKR_VAR_proxmox_node Proxmox node name"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo -e "${RED}Unknown option: $1${NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Determine script directory
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
cd "$SCRIPT_DIR"
|
||||||
|
|
||||||
|
echo -e "${YELLOW}Configuration:${NC}"
|
||||||
|
echo " Proxmox URL: $PROXMOX_URL"
|
||||||
|
echo " Proxmox User: $PROXMOX_USERNAME"
|
||||||
|
echo " Proxmox Node: $PROXMOX_NODE"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check if running on Proxmox host
|
||||||
|
echo -e "${YELLOW}Checking environment...${NC}"
|
||||||
|
if hostname | grep -q "pve\|proxmox"; then
|
||||||
|
echo -e "${GREEN}✓ Running on Proxmox host${NC}"
|
||||||
|
ON_PROXMOX=true
|
||||||
|
else
|
||||||
|
echo -e "${YELLOW}⚠ Running on remote host${NC}"
|
||||||
|
echo -e "${YELLOW} Make sure Proxmox API is accessible from this machine${NC}"
|
||||||
|
ON_PROXMOX=false
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for Packer
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}Checking for Packer...${NC}"
|
||||||
|
if ! command -v packer &> /dev/null; then
|
||||||
|
echo -e "${RED}Packer not found!${NC}"
|
||||||
|
echo ""
|
||||||
|
echo "To install Packer:"
|
||||||
|
echo ""
|
||||||
|
if [ "$ON_PROXMOX" = true ]; then
|
||||||
|
echo " # On Proxmox:"
|
||||||
|
echo " wget https://apt.releases.hashicorp.com/pool/main/h/hashicorp_*_amd64.deb"
|
||||||
|
echo " apt install -y ./hashicorp_*.deb"
|
||||||
|
echo " rm hashicorp_*.deb"
|
||||||
|
else
|
||||||
|
echo " # Download from:"
|
||||||
|
echo " https://www.packer.io/downloads"
|
||||||
|
echo ""
|
||||||
|
echo " # Or via Homebrew (macOS):"
|
||||||
|
echo " brew install packer"
|
||||||
|
echo ""
|
||||||
|
echo " # Or via Chocolatey (Windows):"
|
||||||
|
echo " choco install packer"
|
||||||
|
fi
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓ Packer version: $(packer --version)${NC}"
|
||||||
|
|
||||||
|
# Initialize Packer
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}Initializing Packer plugins...${NC}"
|
||||||
|
packer init packer/
|
||||||
|
|
||||||
|
# Validate configuration
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}Validating Packer configuration...${NC}"
|
||||||
|
export PKR_VAR_proxmox_url="$PROXMOX_URL"
|
||||||
|
export PKR_VAR_proxmox_node="$PROXMOX_NODE"
|
||||||
|
export PKR_VAR_proxmox_username="$PROXMOX_USERNAME"
|
||||||
|
|
||||||
|
if ! packer validate packer/windows.pkr.hcl; then
|
||||||
|
echo -e "${RED}❌ Packer validation failed!${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo -e "${GREEN}✓ Configuration validated${NC}"
|
||||||
|
|
||||||
|
# Check mode - just validate and exit
|
||||||
|
if [ "$CHECK_MODE" = true ]; then
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}Validation complete. No build performed.${NC}"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build the template
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${BLUE}║${NC} ${GREEN}Starting Build${NC} ${BLUE}║${NC}"
|
||||||
|
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}⏱ Estimated time: 15-25 minutes${NC}"
|
||||||
|
echo -e "${YELLOW}📝 Build logs will be shown in real-time${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Set environment variables
|
||||||
|
export PKR_VAR_proxmox_url="$PROXMOX_URL"
|
||||||
|
export PKR_VAR_proxmox_node="$PROXMOX_NODE"
|
||||||
|
|
||||||
|
# Run Packer build
|
||||||
|
if packer build -timestamp-ui packer/windows.pkr.hcl; then
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}╔════════════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${GREEN}║${NC} ${GREEN}✅ BUILD SUCCESSFUL!${NC} ${GREEN}║${NC}"
|
||||||
|
echo -e "${GREEN}╚════════════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}Template created successfully!${NC}"
|
||||||
|
echo ""
|
||||||
|
echo "Next steps:"
|
||||||
|
echo " 1. Verify in Proxmox: ${YELLOW}qm list | grep win11-ltsc${NC}"
|
||||||
|
echo " 2. Note the VM ID (e.g., 9000)"
|
||||||
|
echo " 3. Update terraform/variables.tf with the VM ID"
|
||||||
|
echo " 4. Test provisioning: ${YELLOW}cd terraform && tofu init && tofu apply${NC}"
|
||||||
|
echo ""
|
||||||
|
else
|
||||||
|
echo ""
|
||||||
|
echo -e "${RED}╔══════════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${RED}║${NC} ${RED}❌ BUILD FAILED${NC} ${RED}║${NC}"
|
||||||
|
echo -e "${RED}╚══════════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}Troubleshooting steps:${NC}"
|
||||||
|
echo " 1. Verify Proxmox is running and accessible"
|
||||||
|
echo " 2. Check ISO files exist in /mnt/pve-07-iso-nvme/template/iso/"
|
||||||
|
echo " 3. Verify credentials are correct"
|
||||||
|
echo " 4. Check network connectivity"
|
||||||
|
echo ""
|
||||||
|
echo -e "${YELLOW}Common issues:${NC}"
|
||||||
|
echo " - ISO not found: Verify path in variables.pkr.hcl"
|
||||||
|
echo " - WinRM timeout: Check Autounattend.xml configuration"
|
||||||
|
echo " - Permission denied: Verify Proxmox user permissions"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
79
packer/variables.pkr.hcl
Normal file
79
packer/variables.pkr.hcl
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
variable "proxmox_url" {
|
||||||
|
type = string
|
||||||
|
default = "https://la-vmh-07:8006/api2/json"
|
||||||
|
description = "Proxmox API URL"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_username" {
|
||||||
|
type = string
|
||||||
|
default = "root@pam"
|
||||||
|
description = "Proxmox authentication user"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_password" {
|
||||||
|
type = string
|
||||||
|
default = ""
|
||||||
|
description = "Proxmox password (set via PKR_VAR_proxmox_password env var)"
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "proxmox_node" {
|
||||||
|
type = string
|
||||||
|
default = "la-vmh-07"
|
||||||
|
description = "Proxmox node name"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "vm_name" {
|
||||||
|
type = string
|
||||||
|
default = "win11-ltsc-template"
|
||||||
|
description = "Name of the template VM"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "vm_memory" {
|
||||||
|
type = number
|
||||||
|
default = 8192
|
||||||
|
description = "VM memory in MB"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "vm_cores" {
|
||||||
|
type = number
|
||||||
|
default = 4
|
||||||
|
description = "Number of CPU cores"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "vm_disk_size" {
|
||||||
|
type = string
|
||||||
|
default = "60G"
|
||||||
|
description = "Disk size"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "iso_storage" {
|
||||||
|
type = string
|
||||||
|
default = "local"
|
||||||
|
description = "Proxmox storage for ISOs"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "windows_iso" {
|
||||||
|
type = string
|
||||||
|
default = "CLIENT_LTSC_EVAL_x64FRE_en-us.iso"
|
||||||
|
description = "Windows ISO filename"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "disk_storage" {
|
||||||
|
type = string
|
||||||
|
default = "local-lvm"
|
||||||
|
description = "Proxmox storage for disks"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "virtio_iso" {
|
||||||
|
type = string
|
||||||
|
default = "local:iso/virtio-win.iso"
|
||||||
|
description = "Path to VirtIO ISO"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "winrm_password" {
|
||||||
|
type = string
|
||||||
|
default = "PackerPassword123!"
|
||||||
|
description = "Windows Administrator password for WinRM"
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
|
|
@ -8,51 +8,52 @@ packer {
|
||||||
}
|
}
|
||||||
|
|
||||||
source "proxmox-iso" "windows-11" {
|
source "proxmox-iso" "windows-11" {
|
||||||
proxmox_url = "https://proxmox-host:8006/api2/json"
|
proxmox_url = "${var.proxmox_url}"
|
||||||
username = "root@pam"
|
username = "${var.proxmox_username}"
|
||||||
password = "secret"
|
password = "${var.proxmox_password}"
|
||||||
node = "la-vmh-07"
|
node = "${var.proxmox_node}"
|
||||||
|
|
||||||
vm_name = "win11-ltsc-template"
|
vm_name = "${var.vm_name}"
|
||||||
template_description = "Built with Packer on ${timestamp()}"
|
template_description = "Built with Packer on ${timestamp()}"
|
||||||
iso_file = "local:iso/CLIENT_LTSC_EVAL_x64FRE_en-us.iso"
|
iso_file = "${var.iso_storage}:iso/${var.windows_iso}"
|
||||||
|
|
||||||
qemu_agent = true
|
qemu_agent = true
|
||||||
cores = 4
|
cores = "${var.vm_cores}"
|
||||||
memory = 8192
|
memory = "${var.vm_memory}"
|
||||||
machine = "q35"
|
machine = "q35"
|
||||||
bios = "ovmf"
|
bios = "ovmf"
|
||||||
efi_config {
|
efi_config {
|
||||||
efi_storage_pool = "local-lvm"
|
efi_storage_pool = "${var.disk_storage}"
|
||||||
pre_enrolled_keys = true
|
pre_enrolled_keys = true
|
||||||
}
|
}
|
||||||
tpm_config {
|
tpm_config {
|
||||||
version = "2.0"
|
version = "2.0"
|
||||||
tpm_storage_pool = "local-lvm"
|
tpm_storage_pool = "${var.disk_storage}"
|
||||||
}
|
}
|
||||||
|
|
||||||
scsi_controller = "virtio-scsi-pci"
|
scsi_controller = "virtio-scsi-pci"
|
||||||
disks {
|
disks {
|
||||||
disk_size = "60G"
|
disk_size = "${var.vm_disk_size}"
|
||||||
storage_pool = "local-lvm"
|
storage_pool = "${var.disk_storage}"
|
||||||
type = "virtio"
|
type = "virtio"
|
||||||
format = "raw"
|
format = "raw"
|
||||||
cache_mode = "writeback"
|
cache_mode = "writeback"
|
||||||
}
|
}
|
||||||
|
|
||||||
additional_iso_files {
|
additional_iso_files {
|
||||||
device = "sata1"
|
device = "sata1"
|
||||||
iso_file = "local:iso/virtio-win.iso"
|
iso_file = "${var.virtio_iso}"
|
||||||
}
|
}
|
||||||
|
|
||||||
communicator = "winrm"
|
communicator = "winrm"
|
||||||
winrm_username = "Administrator"
|
winrm_username = "Administrator"
|
||||||
winrm_password = "PackerPassword123!"
|
winrm_password = "${var.winrm_password}"
|
||||||
winrm_insecure = true
|
winrm_insecure = true
|
||||||
winrm_use_ssl = true
|
winrm_use_ssl = true
|
||||||
|
|
||||||
boot_command = [
|
boot_command = [
|
||||||
"<wait><wait><wait>","<enter><wait>","<enter><wait>",
|
"<wait><wait><wait>", "<enter><wait>", "<enter><wait>",
|
||||||
"<enter><wait>","<enter>"
|
"<enter><wait>", "<enter>"
|
||||||
]
|
]
|
||||||
boot_wait = "10s"
|
boot_wait = "10s"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue