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
.isoCentOS9 (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. 🌟
Pliki zarówno hcl jak i cfg można znaleźć w moim repo: GitHub Repo 🔗
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ć pluginuvirtualbox-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!falseoznacza, że podczas instalacji zobaczysz okno maszyny wirtualnej VirtualBox. Jeśli byłobytrue, instalacja działałaby w tle bez okna. Dla początkującychfalsejest 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 = 9000ihttp_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"issh_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 sekcjiprovisioner).⚠️ Pamiętaj, aby ZMIENIĆ
YOURPASSWORDna faktyczne hasło, które ustawisz dla użytkownikavagrantw 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łavagrantdo autoryzacjisudo. - ✔️
boot_wait = "15s": Packer poczeka 15 sekund po uruchomieniu maszyny wirtualnej przed wysłaniemboot_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 Controllerto 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 sekcjisourcepowyż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.dnfto 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 jakopenssh-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żytkownikavagrantdo grupywheel, co pozwala mu na używaniesudo. - ⚙️
echo 'vagrant ALL=(ALL) NOPASSWD: ALL' | sudo tee /etc/sudoers.d/vagrant > /dev/null: Konfigurujesudodla użytkownikavagrant, aby nie musiał wpisywać hasła przy użyciusudo.❗ Pamiętaj, że w środowiskach produkcyjnych jest to ryzykowne!
- ⚙️
sudo chmod 0440 /etc/sudoers.d/vagrant: Ustawia odpowiednie uprawnienia dla pliku konfiguracyjnegosudoers. - ⚙️
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 plikcentos9-stream-base.box. Ten plik.boxto 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