Manu

Jak używać Packera do utworzenia "Golden Image" na przykładzie CentOS9 (przykład z VirtualBoxem)? - Plik HCL🛠️

Packer i "Golden Image": Tworzenie idealnych szablonów z VirtualBoxem! ✨

Stworzenie "Golden Image" za pomocą Packera wymaga napisania pliku konfiguracyjnego, który opisuje, jak ma być zbudowany obraz. Ten plik jest pisany w formacie JSON (JavaScript Object Notation) lub HCL (HashiCorp Configuration Language), które są po prostu ustrukturyzowanym sposobem przechowywania danych. 📝

Założenia do przykładu:

  • 🎯 Chcesz stworzyć "Golden Image" systemu Linux (np. Debian,CentOS) dla programu VirtualBox (program do tworzenia maszyn wirtualnych na Twoim komputerze).
  • Chcesz, aby ten obraz miał zainstalowany program htop (prosty menedżer procesów).
  • 💿 Masz plik instalacyjny .iso CentOS9 (np. CentOS-Stream-9-latest-x86_64-dvd1.iso).
---

Krok 1: Utwórz pliki i foldery konfiguracyjne dla Packera. 📁

To jest uproszczony przykład dla architektury folderów i plików, w prawdziwych projektach pliki są bardziej rozbudowane):


            packer-centos9/
				├── centos9-template.pkr.hcl # Główny plik konfiguracyjny Packera
				└── http/ # Katalog na pliki serwowane przez Packer (np. kickstart)
    					└── ks.cfg # Plik kickstart do automatycznej instalacji CentOS

Zamieszczam przykładowy plik jako przepis dla Packera, mówiący mu, jak zbudować "Golden Image" (złoty szablon) systemu CentOS Stream 9 w programie VirtualBox, a następnie przekształcić go w plik Vagrant Box, co jest bardzo popularnym sposobem tworzenia gotowych środowisk deweloperskich. 🌟

---

Wyjaśnienie kodu Packera zamieszczonego w moim repozytorium na GitHub🧩

Sekcja packer { ... } - Wymagane pluginy Packera 🔌

packer {
  required_plugins {
    virtualbox = {
      source  = "github.com/hashicorp/virtualbox"
      version = "~> 1"
    }
    vagrant = {
      source  = "github.com/hashicorp/vagrant"
      version = "~> 1"
    }
  }
}

Ta sekcja jest jak "lista zakupów" dla Packera. Mówi mu, jakie dodatkowe narzędzia (pluginy) są mu potrzebne do wykonania zadania. 🛍️

  • 🌐required_plugins { ... }: To sekcja, w której deklarujemy, które pluginy są niezbędne.
  • 🌐virtualbox = { ... }: Ten wpis mówi Packerowi, że do zbudowania obrazu będzie używał VirtualBoxa.
  • 🌐 source = "github.com/hashicorp/virtualbox": Wskazuje, skąd Packer ma pobrać ten plugin (od firmy HashiCorp, z ich repozytorium na GitHubie).
  • 🌐 version = "~> 1": Określa, że Packer powinien użyć pluginu w wersji 1.x (czyli dowolnej wersji zaczynającej się od "1.", ale nie 2.x).
  • 🌐 vagrant = { ... }: Ten wpis mówi Packerowi, że po zbudowaniu maszyny wirtualnej, ma ją przetworzyć na format zgodny z programem Vagrant. Vagrant to narzędzie do zarządzania maszynami wirtualnymi, bardzo popularne wśród deweloperów.
  • 🌐 source = "github.com/hashicorp/vagrant": Wskazuje na źródło pluginu Vagrant.
  • 🌐 version = "~> 1": Podobnie, użyj pluginu w wersji 1.x.

Sekcja source "virtualbox-iso" "centos9" { ... } - Definicja źródła i budowniczego 🏗️

source "virtualbox-iso" "centos9" {
  vm_name            = "packer-centos9-stream2"
  iso_url            = "https://mirror.stream.centos.org/9-stream/BaseOS/x86_64/iso/CentOS-Stream-9-latest-x86_64-dvd1.iso"
  iso_checksum       = "sha256:f1db7874a591d59ded57a5dffa3175f9967f7b3b69ce2352ff51914f6aee2180"
  guest_os_type      = "RedHat_64"
  disk_size          = 20000
  memory             = 1024
  cpus               = 1
  headless           = false
  http_directory     = "http"
  http_port_min      = 9000
  http_port_max      = 9090
  output_directory   = "D:/packer_output/centos9new"
  ssh_username       = "vagrant"
  ssh_password       = "YOURPASSWORD"
  ssh_timeout        = "240m"
  ssh_handshake_attempts = 200
  shutdown_command   = "echo 'vagrant' | sudo -S shutdown -P now"
  boot_wait          = "15s"
boot_command = [
    "<tab><wait>",
    "inst.text inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks.cfg<enter>"
  ]
vboxmanage = [
    ["modifyvm", "{{ .Name }}", "--nic1", "nat"],
    ["modifyvm", "{{.Name}}", "--nic1", "bridged"],
    ["modifyvm", "{{.Name}}", "--bridgeadapter1", "Realtek PCIe GbE Family Controller"]
  ]
}

Ta sekcja jest sercem "przepisu". Mówi Packerowi, jak ma zbudować nową maszynę wirtualną od podstaw.

  • ✔️ source "virtualbox-iso" "centos9" { ... }: To definiuje budowniczego. Mówimy Packerowi, że będziemy używać pluginu virtualbox-iso (czyli instalacji z pliku ISO w VirtualBoxie) i nadajemy tej konfiguracji nazwę "centos9".
  • ✔️ vm_name = "packer-centos9-stream2": To nazwa, jaką będzie miała tymczasowa maszyna wirtualna w VirtualBoxie podczas procesu budowania. Po zakończeniu procesu, ta tymczasowa maszyna zostanie usunięta.
  • ✔️ iso_url = "https://mirror.stream.centos.org/9-stream/BaseOS/x86_64/iso/CentOS-Stream-9-latest-x86_64-dvd1.iso": Packer pobierze plik instalacyjny ISO CentOS Stream 9 z podanego adresu.
  • ✔️ iso_checksum = "sha256:f1db7874a591d59ded57a5dffa3175f9967f7b3b69ce2352ff51914f6aee2180": To jest suma kontrolna pliku ISO. Packer sprawdzi, czy pobrany plik jest identyczny z tym, co oczekujemy, co chroni przed uszkodzonymi lub zmodyfikowanymi plikami. sha256: oznacza, że jest to suma kontrolna SHA256.
  • ✔️ guest_os_type = "RedHat_64": Mówi VirtualBoksowi, że instalujemy 64-bitowy system oparty na Red Hat (CentOS jest jego pochodną).
  • ✔️ disk_size = 20000: Ustawia rozmiar wirtualnego dysku twardego maszyny wirtualnej na 20 000 MB (czyli 20 GB).
  • ✔️ memory = 1024: Przydziela maszynie wirtualnej 1024 MB (czyli 1 GB) pamięci RAM.
  • ✔️ cpus = 1: Przydziela maszynie wirtualnej 1 rdzeń procesora.
  • ✔️🗨️ headless = false: To ważne! false oznacza, że podczas instalacji zobaczysz okno maszyny wirtualnej VirtualBox. Jeśli byłoby true, instalacja działałaby w tle bez okna. Dla początkujących false jest lepsze, bo widać, co się dzieje.
  • ✔️ http_directory = "http": Packer uruchomi mały serwer WWW w tym katalogu. Będzie on służył do udostępniania plików (np. ks.cfg, czyli pliku Kickstart, który automatyzuje instalację CentOSa) dla maszyny wirtualnej.
  • ✔️ http_port_min = 9000http_port_max = 9090: Określa zakres portów, z których Packer może wybrać port dla swojego serwera WWW.
  • ✔️ output_directory = "D:/packer_output/centos9new": To jest miejsce na Twoim komputerze, gdzie Packer zapisze gotowy obraz (lub pliki tymczasowe) po zakończeniu budowania.
  • ✔️ ssh_username = "vagrant"ssh_password = "YOURPASSWORD": Packer będzie używał tych danych logowania, aby po zainstalowaniu systemu połączyć się z maszyną wirtualną przez SSH i wykonać na niej dodatkowe polecenia konfiguracyjne (z sekcji provisioner).

    ⚠️ Pamiętaj, aby ZMIENIĆ YOURPASSWORD na faktyczne hasło, które ustawisz dla użytkownika vagrant w pliku Kickstart (ks.cfg)!

  • ✔️ ssh_timeout = "240m": Packer będzie czekał do 240 minut (4 godziny) na nawiązanie połączenia SSH.
  • ✔️ ssh_handshake_attempts = 200: Liczba prób nawiązania połączenia SSH.
  • ✔️ shutdown_command = "echo 'vagrant' | sudo -S shutdown -P now": To polecenie, które Packer wyśle do maszyny wirtualnej, aby ją bezpiecznie wyłączyć po zakończeniu wszystkich operacji. Używa hasła vagrant do autoryzacji sudo.
  • ✔️ boot_wait = "15s": Packer poczeka 15 sekund po uruchomieniu maszyny wirtualnej przed wysłaniem boot_command.
  • ✔️ boot_command = [ ... ]: To są "wirtualne naciśnięcia klawiszy", które Packer "wciska" w oknie konsoli maszyny wirtualnej, aby zainicjować proces instalacji.
  • ✔️ <tab><wait>: Naciska klawisz Tab, a potem czeka chwilę.
  • ✔️ inst.text inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks.cfg<enter>: To jest kluczowe polecenie dla instalatora CentOSa.
  • ✔️ inst.text: Uruchamia instalator w trybie tekstowym (bez grafiki).
  • ✔️ inst.ks=...: Mówi instalatorowi, aby pobrał plik Kickstart (ks.cfg) z serwera WWW uruchomionego przez Packera ({{ .HTTPIP }}:{{ .HTTPPort }} to zmienne, które Packer uzupełni adresem IP i portem swojego serwera WWW). <enter> symuluje naciśnięcie klawisza Enter.
  • ✔️ vboxmanage = [ ... ]: Ta sekcja pozwala Packerowi na bezpośrednie wydawanie poleceń vboxmanage (narzędzie do zarządzania VirtualBoxem) do tymczasowej maszyny wirtualnej.
  • ✔️ ["modifyvm", "{{ .Name }}", "--nic1", "nat"]: Ustawia pierwszą kartę sieciową (NIC1) w trybie **NAT** (Network Address Translation). To pozwala maszynie wirtualnej uzyskać dostęp do Internetu.
  • ✔️ ["modifyvm", "{{.Name}}", "--nic1", "bridged"]: Zmienia pierwszą kartę sieciową na tryb **Bridged** (mostkowany). W tym trybie maszyna wirtualna zachowuje się jak oddzielne urządzenie w Twojej sieci domowej, uzyskując własny adres IP od Twojego routera. To często przydatne, gdy chcesz, aby maszyna wirtualna była bezpośrednio dostępna z innych urządzeń w sieci.
  • ✔️ ["modifyvm", "{{.Name}}", "--bridgeadapter1", "Realtek PCIe GbE Family Controller"]: Określa, którą **fizyczną kartę sieciową** na Twoim komputerze Packer ma "mostkować" do maszyny wirtualnej. Musisz tutaj podać **dokładną nazwę swojej karty sieciowej** (np. Intel(R) Ethernet Connection (7) I219-LM). Realtek PCIe GbE Family Controller to tylko przykład.
---

Sekcja build { ... } - Proces budowania 🚀

build {
  sources = ["source.virtualbox-iso.centos9"]
provisioner "shell" {
    inline = [
      "sudo dnf update -y",
      "sudo dnf install -y openssh-server openssh-clients sudo curl wget net-tools rsync",
      "sudo systemctl enable --now sshd",
      "sudo usermod -aG wheel vagrant",
      "echo 'vagrant ALL=(ALL) NOPASSWD: ALL' | sudo tee /etc/sudoers.d/vagrant > /dev/null",
      "sudo chmod 0440 /etc/sudoers.d/vagrant",
      "sudo dnf clean all",
      "sudo rm -rf /tmp/* /var/cache/* /var/lib/cloud/instances/*",
      "sudo rm -f /var/log/wtmp /var/log/lastlog /etc/ssh/ssh_host_*",
      "sudo find /var/log -type f -name '*.log' -exec truncate -s 0 {} +",
      "history -c"
    ]
  }
post-processor "vagrant" {
    output = "centos9-stream-base.box"
  }
}

Ta sekcja opisuje faktyczny proces budowania "Golden Image". 🏗️

  • ⚙️ build { ... }: Główna sekcja budowania.
  • ⚙️ sources = ["source.virtualbox-iso.centos9"]: Mówi Packerowi, że do budowania ma użyć konfiguracji budowniczego o nazwie "centos9" (zdefiniowanej w sekcji source powyżej).
  • ⚙️ provisioner "shell" { ... }: To jest konfigurator. Wykonuje on polecenia wewnątrz zainstalowanej maszyny wirtualnej, po tym jak system operacyjny już się zainstaluje i Packer nawiąże połączenie SSH.
  • ⚙️ inline = [ ... ]: Lista poleceń, które zostaną wykonane na maszynie wirtualnej.
  • ⚙️ sudo dnf update -y: Aktualizuje wszystkie pakiety w systemie CentOS. dnf to menedżer pakietów w CentOS/Red Hat.
  • ⚙️ sudo dnf install -y openssh-server openssh-clients sudo curl wget net-tools rsync: Instaluje podstawowe narzędzia takie jak openssh-server (potrzebny do SSH), sudo, curl, wget, net-tools, rsync.
  • ⚙️ sudo systemctl enable --now sshd: Włącza i uruchamia usługę serwera SSH, aby Vagrant mógł się z nią połączyć.
  • ⚙️ sudo usermod -aG wheel vagrant: Dodaje użytkownika vagrant do grupy wheel, co pozwala mu na używanie sudo.
  • ⚙️ echo 'vagrant ALL=(ALL) NOPASSWD: ALL' | sudo tee /etc/sudoers.d/vagrant > /dev/null: Konfiguruje sudo dla użytkownika vagrant, aby nie musiał wpisywać hasła przy użyciu sudo.

    Pamiętaj, że w środowiskach produkcyjnych jest to ryzykowne!

  • ⚙️ sudo chmod 0440 /etc/sudoers.d/vagrant: Ustawia odpowiednie uprawnienia dla pliku konfiguracyjnego sudoers.
  • ⚙️ sudo dnf clean all: Czyści pamięć podręczną menedżera pakietów, co pomaga zmniejszyć rozmiar finalnego obrazu.
  • ⚙️ sudo rm -rf /tmp/ /var/cache/ /var/lib/cloud/instances/: Usuwa tymczasowe pliki, logi i inne rzeczy, które nie są potrzebne w "Golden Image", aby był jak najmniejszy i czysty.
  • ⚙️ history -c: Czyści historię poleceń z konsoli.
  • post-processor "vagrant" { ... }: To jest post-procesor. Wykonuje się po zakończeniu wszystkich operacji na maszynie wirtualnej i po jej wyłączeniu.
  • ⚙️ output = "centos9-stream-base.box": Ten post-procesor przetworzy finalny obraz z VirtualBoxa i zapisze go jako plik centos9-stream-base.box. Ten plik .box to standardowy format dla maszyn wirtualnych Vagranta, który można łatwo udostępniać i importować do innych projektów Vagranta.

💡 Pamiętaj, aby dostosować ścieżki i hasła w pliku konfiguracyjnym do swojego środowiska!

Brak komentarzy:

Prześlij komentarz