||

Packer poradnik dla zaawansowanych – budowa szablonu Windows 10 VirtualBox

W poprzednim artykule [ Packer poradnik dla początkujących ] poznaliśmy podstawowe zasady jak zbudować nasz własny obraz z OS Windows 10 za pomocą Packer’a. Jak na pewno zauważyliście wszystkie rzeczy w pliku konfiguracyjnym „VM-Win10.json” są ustawione statycznie i nie ma możliwości w locie podmiany odpowiednich parametrów. W tym wpisie pokażę jak możemy takie zmienne tworzyć oraz…

W poprzednim artykule [ Packer poradnik dla początkujących ] poznaliśmy podstawowe zasady jak zbudować nasz własny obraz z OS Windows 10 za pomocą Packer’a.

Jak na pewno zauważyliście wszystkie rzeczy w pliku konfiguracyjnym „VM-Win10.json” są ustawione statycznie i nie ma możliwości w locie podmiany odpowiednich parametrów.

W tym wpisie pokażę jak możemy takie zmienne tworzyć oraz wskaże dodatkowe funkcje Virtualbox’a.

1 Generowanie dynamicznie pliku Autounattend.xml

Jeśli wnikliwie przypatrywaliście się poradniku dla początkujących pliku Autounattend.xml to zauważyliście, że dużo rzeczy jest tam wpisanych statycznie.

Najbardziej pożądaną zmienną zapewne jest nazwa tworzonej wirtualnej maszyny przez Packera. Odpowiedzialny za to jest kod:

<ComputerName>PCNAME</ComputerName>

 

Pierwszą rzeczą właśnie w zautomatyzowaniu tego procesu jest możliwość dynamicznej podmiany nazwy wirtualnej maszyny komputera podczas jej tworzenia.

Aby tego dokonać potrzebujemy plik wsadowy Autounattend_template.xml , Zmienne.json oraz skrypt Powershell XmlContent.ps1.

Autounattend_template.xml – jest to podstawowy plik jaki używaliśmy wcześniej

Zmienne.json – plik zawierający nasze zmienne jakie będziemy używać podczas tworzenia WM, w tym przypadku:

"VB_Name":"W10TmplAdv"

 

XmlContent.ps1 – skrypt, który będzie nam dynamicznie tworzył docelowy plik Autounattend.xml

$JsonLoad    =  Get-Content .\Zmienne.json | ConvertFrom-Json
$pathROOT    = (Get-Location).Path
$pathBaseXML = '\answer_files\Autounattend_template.xml'

$pathLoad= $pathROOT + $pathBaseXML
$pathSave= $pathROOT + "\Autounattend.xml"

$file = [xml](Get-Content $pathLoad)

$file.unattend.settings[1].component.ComputerName = $JsonLoad.VB_Name

$file.Save($pathSave)
Write-Host ""
Write-Output "Uzywane nazwy do pliku XML"
$JsonLoad.VB_Name

Write-Host ""

 

2 Generowanie dynamicznie nazwy komputera, CPU, RAM, HDD

By móc dopełnić możliwości dynamicznej podmiany zasobów musimy zmienić nasz oryginalny plik VM-Win10.json na taki, który przyjmie dynamicznie parametry

W tym przypadku musimy dodać zmienne, które będą w stanie podmienić nam  CPU, RAM,  HDD.

Modyfikujemy poniże parametry wg schematu:

VM-Win10.json

"vm_name": "{{user `VB_Name`}}",
"disk_size": "{{user `VB_disk0`}}",
"memory": "{{user `VB_ram`}}",
"cpus": "{{user `VB_cpus`}}",

Zmienne.json

{
    "VB_Name":"W10TmplAdv",
    "VB_ram": "6144",
    "VB_cpus": "4",
    "VB_disk0": "30720"
}

 

3 Tworzenie dedykowanego interfejsu sieciowego: NAT

Na pewno przyjdzie taki czas, że będziemy chcieli móc konkretnie spersonalizować kartę sieciową np. interfejs NAT. Tutaj z pomocą przychodzi nam dedykowane polecenie VBoxManage.

VBoxManage jest to zespół wbudowanych instrukcji poleceń dla VirtualBox. Dzięki niemu można całkowicie kontrolować wirtualne maszyny VirtualBox’a z poziomu wiersza poleceń wewnątrz systemu operacyjnego hosta. VBoxManage obsługuje wszystkie funkcje, do których graficzny interfejs użytkownika daje dostęp.

Modyfikujemy poniże parametry wg schematu:

VM-Win10.json

"vboxmanage": [
["modifyvm", "{{.Name}}", "--nic1", "NAT" ]

 

4 Tworzenie dedykowanego drugiego interfejsu sieciowego: Hostonly

"vboxmanage": [
      ["modifyvm", "{{.Name}}", "--nic2", "hostonly", "--hostonlyadapter2", "VirtualBox Host-Only Ethernet Adapter" ]

 

5 Output_directory czyli wskazanie domyślnej ścieżki eksportu pliku przy tworzeniu obrazu

Kiedy tworzony jest obraz wirtualnej maszyny przy użyciu pakera domyślnym miejscem gdzie eksportowany jest plik .VMDK oraz .OVF to właśnie katalog ów projektu.

Może przyjść potrzeba aby takie pliki przechowywać zupełnie w innym miejscu niż nasz projekt. Do tego celu musimy zdefiniować parametr „output_directory”.

Modyfikujemy poniże parametry wg schematu:

VM-Win10.json

"output_directory" : "D:\\Wirtualizacja\\VM\\{{user `VB_Name`}}",

W tym przypadku pliki będą eksportowane do katalogu  „D:\Wirtualizacja\VM\[nazwa maszynki z projektu]”

Cały kod projektu:

{
"builders": [
{
    "type": "virtualbox-iso",
    "vm_name": "{{user `VB_Name`}}",
    "guest_os_type": "Windows10_64",
    "guest_additions_mode": "attach",
    "iso_url": "D:\\Wirtualizacja\\ISO\\Windows10\\Windows10-Instalator.iso",
    "iso_checksum": "md5:38f567f513b6280a38c499edc8197561",
    "output_directory" : "D:\\Wirtualizacja\\VM\\{{user `VB_Name`}}",
    "headless": "false",
    "boot_wait": "10m",
    "communicator": "winrm",
    "winrm_username": "virtuallabspl",
    "winrm_password": "Start123!",
    "winrm_use_ssl": "false",
    "winrm_insecure": "true",
    "keep_registered": "true",
    "skip_export": "true",
    "floppy_files": [
      "Autounattend.xml",
      "script\\Config_WinRM.ps1",
      "script\\EnvConfigure.ps1",
      "script\\Set-IP-Address.ps1"
    ],
    "vboxmanage": [
      ["modifyvm", "{{.Name}}", "--nic1", "NAT" ],
      ["modifyvm", "{{.Name}}", "--nic2", "hostonly", "--hostonlyadapter2", "VirtualBox Host-Only Ethernet Adapter" ]
 ],
    "disk_size": "{{user `VB_disk0`}}",
    "memory": "{{user `VB_ram`}}",
    "cpus": "{{user `VB_cpus`}}",
    "shutdown_command": "shutdown /s /t 5 /f /d p:4:1 /c \"Zakonczenie dzialanie Packera - PowerOff\""
  }
],
"provisioners": [
  {
    "type": "powershell",
     "scripts": [
      "script/EnvConfigure.ps1",
      "script/Set-IP-Address.ps1"
    ]
  }
  ]
}

 

 

Struktura katalogów oraz plików przedstawia się następująco:

/answer_files
Autounattend_template.xml
/script
Config_WinRM.ps1
EnvConfigure.ps1
Set-IP-Address.ps1
XmlContent.ps1
/Autounattend.xml
/Run.ps1
/VM-Win10.json
/Zmienne.json

 

Całość projektu uruchamiam przygotowanym skryptem Powershell .\Run.ps1

Run.ps1 – skrypt , który agreguje mi pliki wsadowe do uruchomienia i skompilowania projektu:

 

vboxmanage.exe unregistervm --delete (Get-Content .\Zmienne.json | ConvertFrom-Json).VB_Name

Clear-Host
.\script\XmlContent.ps1
Start-Sleep 3

packer build -var-file=".\Zmienne.json" ".\VM-Win10.json"

Poniższe polecenie jest opcjonalne, kasuje ono WM z Virtualbox’a jeśli już istnieje.

vboxmanage.exe unregistervm –delete (Get-Content .\Zmienne.json | ConvertFrom-Json).VB_Name

 

Powyższy cały kod źródłowy dostępny jest na stronach  GitHub oraz Gitlab.