||

Packer poradnik dla początkujących – budowa szablonu Windows 10 VirtualBox

Przed przystąpieniem do budowania za pomocą Packera upewnijcie się proszę, że macie już skonfigurowane środowisko do uruchomienia buildu. Poradnik jak to zrobić, dostępny jest na dedykowanych stronach : konfiguracja środowiska Windows, Windows autounattend oraz Packer. Poniższy cały kod źródłowy dostępny jest na stronach  GitHub oraz Gitlab. Podstawowa konfiguracja pliku .json Builder – główny kod Packer’a   „builders”: […

Przed przystąpieniem do budowania za pomocą Packera upewnijcie się proszę, że macie już skonfigurowane środowisko do uruchomienia buildu. Poradnik jak to zrobić, dostępny jest na dedykowanych stronach : konfiguracja środowiska Windows, Windows autounattend oraz Packer.

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

Podstawowa konfiguracja pliku .json

Builder – główny kod Packer’a

 

"builders": [
{
    "type": "virtualbox-iso",
    "vm_name": "W10TempeBase",
    "guest_os_type": "Windows10_64",
    "guest_additions_mode": "attach",
    "iso_url": "D:\\Wirtualizacja\\ISO\\Windows10\\Windows10-Instalator.iso",
    "iso_checksum": "md5:38f567f513b6280a38c499edc8197561",
    "headless": "false",
    "boot_wait": "10m",
    "communicator": "winrm",
    "winrm_username": "virtuallabspl",
    "winrm_password": "Start123!",
    "winrm_use_ssl": "false",
    "winrm_insecure": "true",
    "keep_registered": "false",
    "skip_export": "false",
    "floppy_files": [
      "Autounattend.xml",
      "script\\Config_WinRM.ps1",
      "script\\EnvConfigure.ps1"
    ],
    "disk_size": "30720",
    "memory": "6144",
    "cpus": "4",
    "shutdown_command": "shutdown /s /t 5 /f /d p:4:1 /c \"Zakonczenie dzialanie Packera - PowerOff\""
  }
],

Objaśnienia:

type – nasz model kreowanie wirtualnej maszyny

vm_name – nazwa wirtualnej maszyny jaka się pojawi w VirtualBox

guest_os_type – typ systemu operacyjnego jaki zostanie rozpoznany przez VirtualBox

guest_additions_mode – sposób montowania ISO – dodatkowy napęd CD

iso_url – ścieżka do płyty ISO z obrazem systemu operacyjnego

iso_checksum – checksum do weryfikacji płyty ISO

headless – start GUI przy uruchamianiu wirtualnej maszyny

boot_wait – wskazanie czasu po jakim Packer ma realizować dalej zadania polecenia boot_command

winrm_username – nazwa użytkownika WinRM

winrm_password – hasło użytkownika WinRM

winrm_use_ssl – informacja czy używać SSL

winrm_insecure – informacja czy używać certyfikatu

keep_registered – zachowuje wirtualną maszynę w konsoli VirtualBox

skip_export – informacja czy eksportować wirtualną maszynę do OFV

floppy_files – wirtualna dyskieta przechowująca wskazane pliki

disk_size – wielkość dysku twardego

memory – wielkość pamięci operacyjnej

cpus – liczba CPU

shutdown_command – interpretacja polecenia wyłączającego wirtualną maszynę

script\\Config_WinRM.ps1 – skrypt PS konfigurujący WinRM

 

Cały kod Config_WinRM.ps1

################################
#  WinRM Configuration
###################################
# powershell -ExecutionPolicy Bypass -File a:\Config_WinRM.ps1

#Start-Process -Wait -Verb RunAs -PassThru -FilePath "netsh" -ArgumentList "advfirewall set allprofiles state off" | Out-Null
netsh advfirewall set  allprofiles state off
#netsh advfirewall firewall set rule group="Windows Remote Administration" new enable=yes
#netsh advfirewall firewall set rule name="Windows Remote Management (HTTP-In)" new enable=yes action=allow


$profile = Get-NetConnectionProfile
Set-NetConnectionProfile -Name $profile.Name -NetworkCategory Private

Enable-PSRemoting -Force
winrm quickconfig -q
winrm set winrm/config '@{MaxTimeoutms="1800000"}'
winrm set winrm/config/winrs '@{MaxMemoryPerShellMB="800"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'
winrm set winrm/config/service/auth '@{Basic="true"}'
winrm set winrm/config/client/auth '@{Basic="true"}'
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "*" -Force


Set-Service winrm -startuptype "auto"

Restart-Service winrm


mkdir c:\testSkryptu

Test-WSMan $env:COMPUTERNAME | Out-File c:\testSkryptu\winrm.txt

Provisioner – kod uruchamiający dedykowany skrypt

 

"provisioners": [
  {
    "type": "powershell",
     "scripts": [
      "script/EnvConfigure.ps1"
    ]
  }
  ]

 

Objaśnienia:

script\\EnvConfigure.ps1 – skrypt PS konfigurujący pomocniczą konfigurację wewnątrz wirtualnej maszyny

Kod EnvConfigure.ps1 :

Write-Host "Disabling IPv6 on all interfaces...."
Disable-NetAdapterBinding -Name "*" -ComponentID ms_tcpip6 | Out-Null

Write-Host "TLS 1.2 Enable...."

Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord

Write-Host "Enable RDP and Disable UserAuthentication...."

Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -name "fDenyTSConnections" -Value 0
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -name "UserAuthentication" -Value 0

Write-Host ""

 

Cały kod packer:

 

{
"builders": [
{
    "type": "virtualbox-iso",
    "vm_name": "W10TempeBase",
    "guest_os_type": "Windows10_64",
    "guest_additions_mode": "attach",
    "iso_url": "D:\\Wirtualizacja\\ISO\\Windows10\\Windows10-Instalator.iso",
    "iso_checksum": "md5:38f567f513b6280a38c499edc8197561",
    "headless": "false",
    "boot_wait": "10m",
    "communicator": "winrm",
    "winrm_username": "virtuallabspl",
    "winrm_password": "Start123!",
    "winrm_use_ssl": "false",
    "winrm_insecure": "true",
    "keep_registered": "false",
    "skip_export": "false",
    "floppy_files": [
      "Autounattend.xml",
      "script\\Config_WinRM.ps1",
      "script\\EnvConfigure.ps1"
    ],
    "disk_size": "30720",
    "memory": "6144",
    "cpus": "4",
    "shutdown_command": "shutdown /s /t 5 /f /d p:4:1 /c \"Zakonczenie dzialanie Packera - PowerOff\""
  }
],
"provisioners": [
  {
    "type": "powershell",
     "scripts": [
      "script/EnvConfigure.ps1"
    ]
  }
  ]
}

 

Tutaj dodatkowo wspomagałem się gotowym plikiem Autounattend.xml , który opisałem szerzej w artykule Poradnik Windows answer file – tworzenie autounattend.xml

Uruchomienie całego buildu odbywa się przez wydanie polecenia: packer build

W tym przypadku konkretnie: packer build „.\VM-Win10.json”

 

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

Name
—-
/script/Config_WinRM.ps1

/script/EnvConfigure.ps1

/Autounattend.xml
/README.md
/Run.ps1
/VM-Win10.json

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