Skip to main content

Command Palette

Search for a command to run...

Syllabus học Packer

Updated
12 min readView as Markdown

TUẦN 0 - Nền tảng tư duy

Ngày 1: Triết lý Immutable Infrastructure & vị trí của Packer

  • Mục tiêu: Hiểu vì sao Packer tồn tại, không chỉ cách chạy nó.

  • Nội dung:

    • Lý thuyết: Immutable vs mutable infra, config drift, so sánh Packer build với Docker build layer; pipeline chuẩn Source → Packer → Golden Image → Terraform → Production.

    • Thực hành: Cài Packer, packer version, packer plugins install github.com/hashicorp/amazon.

  • Mini-Project: Vẽ sơ đồ pipeline image factory dự kiến cho hệ thống của bạn (base → hardened → app image).

TUẦN 1 - Sử dụng thành thạo HCL2 & Core usage

Ngày 2: Cấu trúc HCL2 Template

  • Mục tiêu: Nắm 5 block chính và thứ tự thực thi thật.

  • Nội dung:

    • Lý thuyết: packer{}, variable{}, local{}, data{}, source{}, build{}.

    • Thực hành: Viết template tối giản build amazon-ebs từ Ubuntu AMI, chạy packer init + packer validate.

  • Mini-Project: Template build 1 AMI Nginx cơ bản.

Ngày 3: Variables, Locals, Data Sources

  • Mục tiêu: Tham số hóa toàn bộ template.

  • Nội dung:

    • Lý thuyết: variable validation/sensitive, local computed values, data "amazon-ami" để tự động lấy AMI mới nhất.

    • Thực hành: Tách file variables.pkr.hcl + *.pkrvars.hcl, chạy -var-file.

  • Mini-Project: Refactor template Ngày 2 để region/instance_type/tags đều là biến, dùng data source lấy AMI base tự động thay vì hardcode AMI ID.

Ngày 4: Builders cơ bản

  • Mục tiêu: Thành thạo amazon-ebs, docker.

  • Nội dung:

    • Lý thuyết: Communicator (SSH), lifecycle build cơ bản (launch → connect → provision → snapshot → cleanup).

    • Thực hành: Build cùng 1 app image cho cả AMI và Docker image từ 1 template dùng nhiều source.

  • Mini-Project: Không, gộp vào Ngày 8.

Ngày 5: Builders nâng cao - Multi-cloud

  • Mục tiêu: Biết builder cho các cloud khác.

  • Nội dung:

    • Lý thuyết: amazon-chroot (build không cần launch instance mới) vs amazon-ebs; azure-arm; googlecompute; vsphere-iso cho on-prem.

    • Thực hành: Build thử amazon-chroot trên 1 EC2 instance, so sánh thời gian build với amazon-ebs.

Ngày 6: Provisioners

  • Mục tiêu: Thành thạo cấu hình OS bên trong image.

  • Nội dung:

    • Lý thuyết: shell, shell-local, file, ansible; only/except; on_failure (cleanup, abort).

    • Thực hành: Viết provisioner cài Nginx + copy config file + chạy Ansible playbook.

Ngày 7: Post-processors & Manifest

  • Mục tiêu: Xuất metadata phục vụ pipeline downstream.

  • Nội dung:

    • Lý thuyết: manifest, compress, checksum, docker-push; chain post-processor.

    • Thực hành: Xuất manifest.json chứa AMI ID, đọc bằng jq trong script CI.

Ngày 8: Multi-builder & Parallel build

  • Mục tiêu: Build song song nhiều target từ 1 source logic.

  • Nội dung:

    • Lý thuyết: build{} block với nhiều sources, biến -only.

    • Thực hành: Build đồng thời AMI (us-east-1, ap-southeast-1) + Docker image.

  • Mini-Project: Template "1 nguồn, nhiều đích" build image Nginx+app cho AWS 2 region + Docker, output manifest hợp nhất.

Ngày 9: Communicator (SSH/WinRM internals)

  • Mục tiêu: Hiểu kênh giao tiếp Packer ↔ instance tạm.

  • Nội dung:

    • Lý thuyết: SSH handshake, key pair tạm Packer tự sinh, timeout tuning (ssh_timeout), bootstrap script.

    • Thực hành: Chạy packer build -debug để thấy từng bước dừng, quan sát key pair/SG tạm trên AWS Console.

Ngày 10: Ôn tập & Mini-Project tổng hợp Tuần 1

  • Mini-Project: Pipeline hoàn chỉnh: build AMI Nginx + app từ biến hóa đầy đủ, provision qua Ansible, xuất manifest, build song song 2 region.

TUẦN 2 - Internals (Plugin architecture, Go source)

Ngày 11: Kiến trúc Plugin-based & go-plugin

  • Mục tiêu: Hiểu vì sao Packer 1.7+ tách plugin.

  • Nội dung:

    • Lý thuyết: go-plugin (RPC/gRPC) - cơ chế chung với Terraform/Vault/Nomad; lý do tách: independent release, giảm core size.

    • Thực hành: packer plugins installed, xem binary plugin nằm ở đâu (~/.config/packer/plugins/).

Ngày 12: Packer Core object & Build lifecycle

  • Mục tiêu: Hiểu luồng nội bộ khi chạy packer build.

  • Nội dung:

    • Lý thuyết: core.Build(), mỗi build 1 goroutine, context cancellation khi Ctrl-C → graceful cleanup.

    • Thực hành: Ctrl-C giữa chừng 1 build AMI, quan sát AWS tự cleanup instance/SG tạm.

Ngày 13: HCL2 parsing pipeline

  • Mục tiêu: Hiểu từ file .pkr.hcl đến Go struct.

  • Nội dung:

    • Lý thuyết: hashicorp/hcl/v2 → AST → hcldec decode → cty type system (chung nền tảng với Terraform).

    • Thực hành: Đọc source packer-plugin-sdk/hcl2helper.

Ngày 14: Plugin SDK - interface Builder/Provisioner/PostProcessor

  • Mục tiêu: Nắm interface bắt buộc mọi plugin phải implement.

  • Nội dung:

    • Lý thuyết: Prepare(), Run(), Cancel().

    • Thực hành: Đọc source packer-plugin-amazon để thấy implement thật.

Ngày 15: Tự viết custom Provisioner plugin

  • Mục tiêu: Thực chiến internals.

  • Nội dung:

    • Thực hành: Viết plugin Go đơn giản (in system info), compile, cài local, gọi trong template.
  • Mini-Project: Provisioner plugin custom "print build metadata" hoạt động end-to-end.

Ngày 16: Tự viết custom Post-processor plugin

  • Mục tiêu: Mở rộng thêm 1 loại plugin khác.

  • Nội dung:

    • Thực hành: Viết post-processor ghi thêm metadata (build time, git commit) vào file JSON riêng.

Ngày 17: Debug RPC & Plugin handshake

  • Mục tiêu: Biết debug khi plugin lỗi.

  • Nội dung:

    • Lý thuyết: PACKER_LOG=1, PACKER_LOG_PATH; lỗi "plugin handshake failed" thường do version mismatch.

    • Thực hành: Cố tình gây lỗi handshake (sai version plugin), đọc log để chẩn đoán.

Ngày 18: Source Code Reading Roadmap

  • Mục tiêu: Có lộ trình đọc code hiệu quả thay vì đọc lan man.

  • Nội dung: Đọc theo thứ tự: packer-plugin-sdkpacker core → packer-plugin-amazonpacker-plugin-dockerpacker-plugin-ansible.

  • Mini-Project: Viết note tóm tắt kiến trúc mỗi repo (1 trang/repo).

TUẦN 3 - AWS/Cloud Internals & Windows Image Engineering

Ngày 19: AMI Internals

  • Mục tiêu: Hiểu quan hệ AMI ↔ EBS Snapshot ↔ Volume.

  • Nội dung:

    • Lý thuyết: AMI → Snapshot → EBS Volume → EC2; Block Device Mapping.

    • Thực hành: Trace 1 AMI trong Console, xem snapshot backing nó, tính chi phí lưu trữ.

Ngày 20: Launch Template & Block Device Mapping nâng cao

  • Mục tiêu: Kết nối image với hạ tầng launch.

  • Nội dung:

    • Lý thuyết: Launch Template version, ENA/NVMe, volume encryption khi build.

    • Thực hành: Config launch_block_device_mappings trong Packer template, verify volume type sau build.

Ngày 21: amazon-ebs vs amazon-chroot - internals sâu

  • Mục tiêu: Hiểu tradeoff kỹ thuật thật sự, không chỉ "cái nào nhanh hơn".

  • Nội dung:

    • Lý thuyết: chroot mount volume trực tiếp vào instance đang chạy Packer (không launch instance mới) → nhanh nhưng phải chạy trên EC2, cùng architecture.

    • Thực hành: Benchmark thời gian build 2 phương pháp trên cùng 1 EC2.

Ngày 22: Windows Image Engineering - WinRM

  • Mục tiêu: Mở rộng khỏi Linux-centric.

  • Nội dung:

    • Lý thuyết: communicator = "winrm", WinRM port/auth khác SSH hoàn toàn.

    • Thực hành: Build thử 1 Windows AMI cơ bản, provisioner PowerShell cài IIS.

Ngày 23: Windows - Sysprep, EC2Launch/EC2Config, Chocolatey

  • Mục tiêu: Build Windows image production-ready.

  • Nội dung:

    • Lý thuyết: Vì sao cần Sysprep trước khi tạo AMI (reset SID); EC2Launch v2 vs EC2Config cũ; Chocolatey để cài package như apt/yum.

    • Thực hành: Template Windows Server hoàn chỉnh: cài app qua Chocolatey → Sysprep → tạo AMI.

  • Mini-Project: Windows base image chuẩn hóa cho công ty (updates + agent monitoring + hardening cơ bản).

Ngày 24: So sánh internals Azure/GCP

  • Mục tiêu: Không bị khóa tư duy vào AWS.

  • Nội dung:

    • Lý thuyết: Azure managed image/Shared Image Gallery vs GCP image family; khác biệt về snapshot/versioning.

    • Thực hành: Build 1 image tối giản trên Azure hoặc GCP, so sánh manifest output với AWS.

TUẦN 4 - Image Factory Architecture & Security

Ngày 25: Image Factory Architecture - Image Lineage

  • Mục tiêu: Thiết kế hệ thống phân lớp image, không build 1 image "phẳng" cho mọi thứ.

  • Nội dung:

    • Lý thuyết: Base Image → Hardened Image → Runtime Image → Application Image; image inheritance, image promotion.

    • Thực hành: Thiết kế sơ đồ 4 lớp cho hệ thống thật (vd: Amazon Linux → CIS Hardened → Company Base → Product Image).

Ngày 26: Xây dựng Base Image & Hardened Image

  • Mục tiêu: Build lớp nền tái sử dụng được.

  • Nội dung:

    • Thực hành: Template build "Base Image" (chỉ OS + agent chuẩn), publish AMI ID, sau đó template "Hardened Image" build from Base Image AMI đó (kế thừa).
  • Mini-Project: Chain 2 template: Base → Hardened, xác nhận Hardened image build đúng trên nền Base vừa tạo (dùng data source lấy AMI mới nhất của Base).

Ngày 27: Security Hardening

  • Mục tiêu: Đưa compliance vào image thay vì làm thủ công sau deploy.

  • Nội dung:

    • Lý thuyết: CIS Benchmark, STIG, SSH hardening, auditd, FIPS mode.

    • Thực hành: Provisioner chạy Lynis hoặc OpenSCAP scan, in kết quả compliance score.

Ngày 28: Image Scanning & Secrets Management

  • Mục tiêu: Không bake secret vào image, phát hiện lỗ hổng trước khi publish.

  • Nội dung:

    • Lý thuyết: Vì sao secret phải lấy runtime (instance metadata/Vault/Secrets Manager) chứ không hardcode; nguyên lý image scanning.

    • Thực hành: Tích hợp Trivy scan image sau build, fail pipeline nếu có CVE critical.

Ngày 29: Testing Image trước khi Promote

  • Mục tiêu: Có bước "kiểm định" trước khi image được coi là production-ready.

  • Nội dung:

    • Lý thuyết: Pattern Build → Test → Promote → Deploy.

    • Thực hành: Viết test bằng Goss hoặc InSpec kiểm tra service running, port mở, package version.

  • Mini-Project: Pipeline build → scan (Trivy) → test (Goss) → chỉ tag "validated" nếu tất cả pass.

Ngày 30: AMI Lifecycle Management & Retention

  • Mục tiêu: Giải quyết bài toán "đau đầu hơn cả build" - quota và chi phí.

  • Nội dung:

    • Lý thuyết: Tag lifecycle (latest, latest-validated, production, rollback), retention policy 30/90/180 ngày, AMI/snapshot quota, storage cost.

    • Thực hành: Viết script (hoặc dùng AWS Data Lifecycle Manager) tự động deregister AMI cũ + xóa snapshot orphan.

TUẦN 5 - CI/CD, Terraform/HCP, Kubernetes

Ngày 31: CI/CD hóa Packer build

  • Mục tiêu: Build tự động, không chạy tay.

  • Nội dung:

    • Lý thuyết: Pipeline stages packer init → validate → build; build matrix nhiều region.

    • Thực hành: Viết GitHub Actions workflow build + upload manifest artifact.

Ngày 32: HCP Packer Registry & Channel Management

  • Mục tiêu: Quản lý version/governance tập trung.

  • Nội dung:

    • Lý thuyết: hcp_packer_registry block, channel dev/staging/prod trỏ tới image version khác nhau.

    • Thực hành: Đăng ký build lên HCP Packer, tạo channel, promote thủ công.

Ngày 33: Terraform + Packer Integration sâu

  • Mục tiêu: Nối liền pipeline image → hạ tầng.

  • Nội dung:

    • Lý thuyết: data "hcp_packer_image" vs data "aws_ami"; workflow Packer → HCP Registry → Terraform → ASG/EKS NodeGroup.

    • Thực hành: Terraform apply dùng data "hcp_packer_image" lấy "latest validated" image cho Launch Template.

  • Mini-Project: Full loop: build image mới → validate → promote channel "production" → Terraform tự pick lên mà không sửa code Terraform.

Ngày 34: Kubernetes Node Images

  • Mục tiêu: Ứng dụng Packer cho Platform Engineering hiện đại.

  • Nội dung:

    • Lý thuyết: Custom EKS node image (Amazon Linux + SSM Agent + Datadog + Falco + security config), dùng cho Managed Node Group / Karpenter / self-managed node.

    • Thực hành: Build 1 custom node AMI, dùng làm amiSelector cho Karpenter hoặc launch template của node group.

Ngày 35: Debugging & Troubleshooting nâng cao

  • Mục tiêu: Xử lý sự cố thực chiến - nơi tốn thời gian nhất trong production.

  • Nội dung:

    • Lý thuyết: Phân loại lỗi thường gặp: SSH timeout, provisioner failed, plugin handshake failed, AMI creation failed, snapshot timeout, API rate limit.

    • Thực hành: Cố tình gây từng loại lỗi (vd: sai SG rule chặn SSH), luyện đọc PACKER_LOG để chẩn đoán nhanh.

TUẦN 6 - Ecosystem & Capstone

Ngày 36: Packer Ecosystem

  • Mục tiêu: Hiểu vị trí Packer trong toàn hệ sinh thái HashiCorp.

  • Nội dung: Lý thuyết: quan hệ Packer ↔ Terraform ↔ Vault (secrets runtime) ↔ Nomad (chạy image) ↔ Boundary (access) ↔ Waypoint (legacy, ít dùng).

Ngày 37: Tối ưu hiệu năng & chi phí tổng hợp

  • Mục tiêu: Build nhanh, rẻ, gọn.

  • Nội dung: Thực hành: parallel provisioning, base layer caching pattern (build kế thừa thay vì build lại từ đầu), giảm kích thước image (cleanup cache, sparsify QEMU).

Ngày 38: Capstone Project - Image Factory hoàn chỉnh

  • Mục tiêu: Tổng hợp toàn bộ 38 ngày thành 1 hệ thống thật.

  • Yêu cầu capstone:

    1. Kiến trúc 4 lớp image (Base → Hardened → Runtime → App) với lineage rõ ràng.

    2. CI/CD tự động build + Trivy scan + Goss test + promote qua HCP Packer channel.

    3. Terraform tiêu thụ image qua data "hcp_packer_image" để deploy ASG hoặc EKS node group.

    4. Retention policy tự động cleanup AMI/snapshot cũ.

    5. Custom plugin (provisioner hoặc post-processor) tự viết được dùng trong pipeline này.

    6. 1 image Windows và 1 image Linux, cả hai đều pass CIS hardening scan.

Knowledge

Part 1 of 50