Packer Konfiguration
Obwohl wir die Vorlage bereits im vorherigen Kapitel eingerichtet haben, müssen wir noch ein paar Dinge konfigurieren, bevor Packer mit HyperV kommunizieren kann. Das liegt daran, dass wir innerhalb von WSL arbeiten, die selbst eine VM hinter den Kulissen von HyperV ist, aber eine sehr spezielle. So müssen wir z. B. dem Packer, der auf der WSL2-VM läuft, den Zugriff auf den Hypervisor ermöglichen, da der Packer während des Build-Prozesses eine neue VM startet.
Als erstes muss das Packer-Cache-Verzeichnis im Windows-Dateisystem angelegt werden. Dazu müssen Sie dieses Verzeichnis in Ihre bashrc oder die von Ihnen verwendete Shell-Umgebung eintragen:
PACKER_CACHE_DIR=/mnt/c/Users/user/.packer
Der zweite Punkt ist, dass Packer und Vagrant einige ssh-Schlüssel zur Verwendung erstellen. Standardmäßig ist ssh jedoch so konfiguriert, dass alle Verbindungsversuche abgelehnt werden, wenn Ihr privater Schlüssel ungeschützt ist. Sie müssen Ihre WSL feinjustieren, um das Windows-Dateisystem mit Metadaten zu mounten. Sie können die Zugriffsrechte für das Linux-Dateisystem auf Ihr eingehängtes Windows-Dateisystem einrichten. Einfach, oder? Kein Problem, fügen Sie einfach innerhalb Ihrer WSL die folgenden Dinge in Ihre /etc/wsl.conf ein
[boot]
systemd=true
[automount]
options=metadata
Der systemd-Teil ist für diese Übung nicht zwingend erforderlich, aber ich empfehle ihn dringend. Systemd ist ein praktisches Werkzeug.
Jetzt sollten Sie bereit sein, den Packer-Build zu starten. Eine weitere Sache, die Sie beachten sollten, ist, dass sich Ihr Projektverzeichnis im Windows-Dateisystem befindet. Das ist ärgerlich, aber so ist es nun einmal. Um das Problem zu beheben, habe ich einfach einen Symlink von meinem Home-Ordner zu meinem Windows-Projektverzeichnis erstellt, damit ich es später leicht finden kann.
Bevor Sie bauen, müssen Sie die Plugins herunterladen, die wir in Packer verwenden, also tun Sie das zuerst:
`packer init template.pkr.hcl`
Jetzt können Sie einen Packer-Build durch `packer build template.pkr.hcl` auslösen, und Sie sollten etwas wie dieses sehen:
(base) marczis@Sonya:~/pro/winpro/vagrant/kube/base_images/ubuntu_minimal$ packer build template.pkr.hcl
hyperv-iso.ubuntu: output will be in this color.
==> hyperv-iso.ubuntu: Creating build directory...
==> hyperv-iso.ubuntu: Retrieving ISO
==> hyperv-iso.ubuntu: Trying /mnt/c/Users/marcz/Documents/pro/ubuntu-22.04.4-live-server-amd64.iso
==> hyperv-iso.ubuntu: Trying /mnt/c/Users/marcz/Documents/pro/ubuntu-22.04.4-live-server-amd64.iso?checksum=sha256%3A45f873de9f8cb637345d6e66a583762730bbea30277ef7b32c9c3bd6700a32b2
==> hyperv-iso.ubuntu: /mnt/c/Users/marcz/Documents/pro/ubuntu-22.04.4-live-server-amd64.iso?checksum=sha256%3A45f873de9f8cb637345d6e66a583762730bbea30277ef7b32c9c3bd6700a32b2 => /mnt/c/Users/marcz/Documents/pro/ubuntu-22.04.4-live-server-amd64.iso
==> hyperv-iso.ubuntu: Starting HTTP server on port 8955
==> hyperv-iso.ubuntu: Creating switch 'public_network' if required...
==> hyperv-iso.ubuntu: switch 'public_network' already exists. Will not delete on cleanup...
==> hyperv-iso.ubuntu: Creating virtual machine...
==> hyperv-iso.ubuntu: Enabling Integration Service...
==> hyperv-iso.ubuntu: Mounting os dvd drive C:\Users\marcz\Documents\pro\ubuntu-22.04.4-live-server-amd64.iso ...
==> hyperv-iso.ubuntu: Skipping mounting Integration Services Setup Disk...
==> hyperv-iso.ubuntu: Mounting secondary DVD images...
==> hyperv-iso.ubuntu: Configuring vlan...
==> hyperv-iso.ubuntu: Determine Host IP for HyperV machine...
==> hyperv-iso.ubuntu: Host IP for the HyperV machine: 192.168.1.25
==> hyperv-iso.ubuntu: Attempting to connect with vmconnect...
==> hyperv-iso.ubuntu: Starting the virtual machine...
==> hyperv-iso.ubuntu: Waiting 5s for boot...
==> hyperv-iso.ubuntu: Typing the boot command...
==> hyperv-iso.ubuntu: Waiting for SSH to become available...
==> hyperv-iso.ubuntu: Connected to SSH!
==> hyperv-iso.ubuntu: Gracefully halting virtual machine...
==> hyperv-iso.ubuntu: Waiting for vm to be powered down...
==> hyperv-iso.ubuntu: Unmount/delete secondary dvd drives...
==> hyperv-iso.ubuntu: Unmount/delete Integration Services dvd drive...
==> hyperv-iso.ubuntu: Unmount/delete os dvd drive...
==> hyperv-iso.ubuntu: Delete os dvd drives controller 0 location 1 ...
==> hyperv-iso.ubuntu: Unmount/delete floppy drive (Run)...
==> hyperv-iso.ubuntu: Compacting disks...
hyperv-iso.ubuntu: Compacting disk: PackerBuilder.vhdx
hyperv-iso.ubuntu: Disk size is unchanged
==> hyperv-iso.ubuntu: Exporting virtual machine...
==> hyperv-iso.ubuntu: Collating build artifacts...
==> hyperv-iso.ubuntu: Disconnecting from vmconnect...
==> hyperv-iso.ubuntu: Unregistering and deleting virtual machine...
==> hyperv-iso.ubuntu: Deleting build directory...
==> hyperv-iso.ubuntu: Running post-processor: (type shell-local)
==> hyperv-iso.ubuntu (shell-local): Running local shell script: /tmp/packer-shell192936170
hyperv-iso.ubuntu (shell-local): ./Virtual Hard Disks/
hyperv-iso.ubuntu (shell-local): ./Virtual Hard Disks/PackerBuilder.vhdx
hyperv-iso.ubuntu (shell-local): ./Virtual Machines/
hyperv-iso.ubuntu (shell-local): ./Virtual Machines/3A007061-A58E-4C53-8464-DA85A8BF1600.vmcx
hyperv-iso.ubuntu (shell-local): ./Virtual Machines/3A007061-A58E-4C53-8464-DA85A8BF1600.vmgs
hyperv-iso.ubuntu (shell-local): ./Virtual Machines/3A007061-A58E-4C53-8464-DA85A8BF1600.VMRS
hyperv-iso.ubuntu (shell-local): ./Virtual Machines/box.xml
hyperv-iso.ubuntu (shell-local): ./metadata.json
hyperv-iso.ubuntu (shell-local): /home/marczis/pro/winpro/vagrant/kube/base_images/ubuntu_minimal
hyperv-iso.ubuntu (shell-local): ==> box: Box file was not detected as metadata. Adding it directly...
hyperv-iso.ubuntu (shell-local): ==> box: Adding box 'ubuntu' (v0) for provider:
hyperv-iso.ubuntu (shell-local): box: Unpacking necessary files from: file:///mnt/c/Users/marcz/Documents/pro/vagrant/kube/base_images/ubuntu_minimal/ubuntu.box
hyperv-iso.ubuntu (shell-local): ==> box: Successfully added box 'ubuntu' (v0) for ''!
Build 'hyperv-iso.ubuntu' finished after 11 minutes 24 seconds.
==> Wait completed after 11 minutes 24 seconds
==> Builds finished. The artifacts of successful builds are:
--> hyperv-iso.ubuntu: VM files in directory: output-ubuntu
--> hyperv-iso.ubuntu: VM files in directory: output-ubuntu
Wie Sie sehen können, dauert der Erstellungsprozess ziemlich lange - in meinem Fall 11,5 Minuten. Wenn man jedoch bedenkt, dass wir in dieser Zeit einen neuen Server einschalten, alle Installationsfragen beantworten, das System konfigurieren, einige Pakete installieren und den Status der virtuellen Maschine speichern, würde ich sagen, dass dies ein ziemlich anständiges Ergebnis ist.
Am Ende der Packer-Vorlage führen wir einige lokale Befehle aus, die die mit HyperV exportierte VM packen, daraus eine Box-Datei für Vagrant erstellen und sie sogar zu Vagrant hinzufügen. Im nächsten Abschnitt werden wir Vagrant verwenden, um virtuelle Maschinen auf HyperV basierend auf Vorlagen zu starten. Wenn Sie Vagrant noch nicht installiert haben, installieren Sie es bitte auf Ihrer WSL!
Vagrant Konfiguration
Genau wie bei Packer muss Vagrant so konfiguriert werden, dass es von WSL aus läuft und HyperV erreicht.
In Ihrer bashrc, oder wo auch immer Sie möchten, müssen Sie diese Umgebungsvariable konfigurieren:
export VAGRANT_WSL_ENABLE_WINDOWS_ACCESS="1"
Dadurch wird Vagrant für den Zugriff auf HyperV außerhalb von WSL konfiguriert.
Haben Sie noch Fragen? Wir sind für Sie da!