x

Menü

Automatisierte VMWare Vorlagen mit Hashicorp Packer

veröffentlicht in: Infrastructure as a Service DevOps HashiCorp Datum: 15.10.2019
Martin Buchleitner, Senior IT-Consultant

Über den Autor

Martin Buchleitner ist ein Senior IT-Berater für Infralovers und für Commandemy. Twitter github LinkedIn

Alle Artikel von diesem Autor sehen

Automatisiert VMWare Vorlage mit HashiCorp Packer

Bei Cloud-Anbietern bekommt man Vorlagen virtueller Maschinen, die an den jeweiligen Anbieter angepasst und vorprovisioniert sind. Was ist nun, wenn man auch selbst virtuelle Maschinen, die bereits vorprovisioniert sind, auf VMWare vSphere nutzen möchte?

In diesem Fall hilft einem das Tool HashiCorp Packer. In diesem Posting geht es um die Konzepte von Packer und wie man damit selbst vorprovionierte Vorlagen für virtuelle Maschinen bereitstellt.

Was ist Packer

Packer ist ein Open Source Programm um identische Vorlagen für diverse Platformen anhand einer einzigen Definition zu erstellen.

Packer ist sehr schlank, läuft auf sämtlichen Betriebssystemen und ist hoch performant, um parallel um Vorlagen für verschiedene Platformen zu erstellen.

Packer ersetzt aber nicht Konfigurationsmanagement wie Chef oder Puppet. Vielmer erlaubt Packer diese und andere Tools zu nutzen, um Software in den Vorlagen zu installieren.

Eine Vorlage ist eine einzige statische Einheit, die ein vorkonfiguriertes Betriessystem und Software beinhaltet, welche es erlaubt schnell neue virtuelle Maschinen zu erstellen.

Das Format der Vorlage ist je nach Platform verschieden - Beispiele hierfür sind AMIs für EC2, VMDK/VMX Dateien für VMWare oder OVF für VirtualBox.

Vorteile von Packer

Packer Vorlagen erlauben es komplett provisionierte und vorkonfigurierte Maschinen zu erstellen, die in viel kürzerer Zeit instanziert werden können, da die gewünschte Software ja bereits installiert wurde.

Diese Vorteile können aber nicht nur für den Produktiv-Betrieb Vorteile bringen, sondern auch für die Entwicklung.

Diese kann so zum Beispiel in viel schnellerer Zeit Testinstanzen erstellen und den Feedback Zyklus erheblich beschleunigen.

Da Packer im Stande ist für jegliche Platformen aus der gleichen Konfigurationsdatei idente Vorlagen zu bauen, kann die Produktion in AWS laufen, die Umgebung für die Qualitätssicherung durchaus auch in einer privaten Cloud wie Openstack, und Entwicklungsumgebungen in lokalen Virtualisierungen wie VMWare oder VirtualBox.

Packer installiert und konfiguriert sämtliche Software innerhalb der Vorlage zum Zeitpunkt des Bauens der Vorlage.

Wenn hier Fehler in diesen Skripten sind, werden sie früher entdeckt, als wenn diese Maschine später erst gestartet werden muss.

Nachdem eine Vorlage gebaut ist, kann diese Vorlage schnell als Maschine gestartet werden, um erste Smoke Tests zu machen um festzustellen, ob diese funktioniert.

Wenn alles funktioniert, kann man so sicherstellen dass diese Vorlage sauber funktionieren wird.

Packer macht es extrem einfach diese Vorteile zu nutzen.

Ubuntu Beispiel

Packer

Um nun eine Vorlage bauen zu können, muss man erst Packer herunterladen. Nach dem Installieren von Packer, sollte man noch verifizieren, ob die Installation auch funktioniert und startet eine Eingabeaufforderung oder Konsole:

$ packer
usage: packer [--version] [--help] <command> [<args>]

Available commands are:
    build       build image(s) from template
    fix         fixes templates from old versions of packer
    inspect     see components of a template
    validate    check that a template is valid
    version     Prints the Packer version

ESXi Konfiguration

Um nun Vorlagen für VMWare vSphere mit einem VMWare ESXi 6 oder neuer bauen zu können, muss der ESXi erst ein wenig modifiziert werden, damit dieser im Zusammenspiel mit Packer verwendet werden kann.

Packer kommuniziert per SSH mit ESXi. Zudem muss man noch ermöglichen, dass die Gäste IP detektiert werden kann und schließlich auch per VNC der Zugriff funktioniert.

SSH

Im Webinterface von VMWare ESXi6 unter dem Punkt “Verwalten” gibt es ein Tab “Dienste”. Hier gibt es weiters noch einen Eintrag “TSH-SSH”, welcher aktiviert werden muss. Dieser Dienst sollte immer gestartet werden, Die Option dafür versteckt sich im “Aktionen” Menü.

Gäste IP Hack

Das folgende Kommando muss am ESXi ausgeführt werden:

esxcli system settings advanced set -o /Net/GuestIPHack -i 1

Es erlaubt Packer die Gäste IP innerhalb des ESXi auszulesen ohne das die virtuelle Maschine diese selbst wiedergibt.

VNC ports in der Firewall

Packer verbindet sich zudem per VNC zur virtuellen Maschine. Hierfür müssen in der Firewall die entsprechenden Ports freigegeben werden.

chmod 644 /etc/vmware/firewall/service.xml
chmod +t /etc/vmware/firewall/service.xml

Und diese Liste muss nun ans Ende der obigen Datei eingefügt werden:

<service id="1000">
  <id>packer-vnc</id>
  <rule id="0000">
    <direction>inbound</direction>
    <protocol>tcp</protocol>
    <porttype>dst</porttype>
    <port>
      <begin>5900</begin>
      <end>6000</end>
    </port>
  </rule>
  <enabled>true</enabled>
  <required>true</required>
</service>

Schließlichen müssen die korrekten Rechte wieder hergestellt und die Firewall neu geladen werden

chmod 444 /etc/vmware/firewall/service.xml
esxcli network firewall refresh

Vorlagen Definition

Die Konfigurationsdatei definiert welche Vorlage Packer bauen wird und wie diese heissen soll. Das Format dieser Datei ist einfaches JSON. JSON bietet eine gewisse Balance zwischen Menschen-Editierbarkeit und Maschinen-Editierbarkeit, da diese Dateien auch einfach generiert werden können.

Hier starten wir nun mit einer neuen Datei example.json mit folgendem Inhalt


{
  "builders": [{
    "name": "Ubuntu-19.04",
    "type": "vmware-iso",
    "vm_name": "Ubuntu-19.04",
    "guest_os_type": "ubuntu-64",
    "tools_upload_flavor": "linux",
    "headless": true,

    "iso_urls": ["iso/ubuntu-19.04-server-amd64.iso",
      "http://cdimage.ubuntu.com/ubuntu/releases/19.04/release/ubuntu-19.04-server-amd64.iso"
    ],
    "iso_checksum": "7e8a0d07522f591dfee9bc9fcd7c05466763161e6cb0117906655bce1750b2fa",
    "iso_checksum_type": "sha256",

    "cpus": 2,
    "memory": 4096,
    "disk_size": 20140,

    "boot_wait": "10s",
    "boot_command": [
      "<esc><wait>",
      "<esc><wait>",
      "<enter><wait>",
      "/install/vmlinuz",
      " initrd=/install/initrd.gz ",
      "auto=true ",
      "url=https://raw.githubusercontent.com/infralovers/packer-preseed/master/ubuntu.cfg ",
      "fb=false ",
      "auto=true ",
      "language=en ",
      "locale=en_US ",
      "priority=critical ",
      "keymap=us ",
      "netcfg/get_hostname={{ .Name }} ",
      "netcfg/get_domain=vm ",
      "debconf/frontend=noninteractive ",
      "debian-installer/country=AT ",
      "console-setup/ask_detect=false ",
      "console-keymaps-at/keymap=us ",
      "DEBCONF_DEBUG=5 ",
      "<enter>"
    ],

    "ssh_username": "vagrant",
    "ssh_password": "vagrant",
    "ssh_port": 22,
    "ssh_wait_timeout": "20m",
    "shutdown_command": "echo 'shutdown -P now' > shutdown.sh; echo 'vargant'|sudo -S sh 'shutdown.sh'",

    "vnc_disable_password": true,
    "format": "vmx",
    "remote_type": "esx5",
    "remote_host": "{{user `esxi_host`}}",
    "remote_datastore": "{{user `esxi_datastore`}}",
    "remote_username": "{{user `esxi_username`}}",
    "remote_password": "{{user `esxi_password`}}",
    "keep_registered": true,
    "skip_export": true

  }]
}

Man kann auch mit VMWare Fusion beginnen die Automatisierung zu definieren. Hierfür müssen dann die Einträge beginnend mit remote_ entfernt werden. Dies kann recht hilfreich sein, wenn man beginnt, diese Vorlage zu erstellen. Die Rückmeldungen über etwaige Änderungen werden viel schneller wiedergegeben - die Fehlersuche in den Preseed und Kickstart Dateien kan durchaus mühsam sein.

Im aktuellen Ubuntu Beispiel ist deshalb auch noch die Option DEBCONF_DEBUG gesetzt. Dies dazu führt, dass Konfigurionseinträge, welche ungültig sind oder fehlen, auch entsprechende Logmeldungen in der Fehlerausgabe hinterlassen.

Vorlage bauen

Mit einer validen Konfigurationsdatei ist es nun an der Zeit die erste virtuelle Maschine zu bauen. Das kann man mit der unteren Kommandozeile machen. Dies kann nun je nach Betriebssystem mehrere Minuten dauern.

Da in unserer Konfigurationsdatei noch ESXi-spezifische Variablen definiert wurden, müssen diese als Argument zum Bauzeitpunkt noch gesetzt werden.

packer build -var "esxi_host=YOUR-ESXI" -var "esxi_datastore=YOUR_DEFAULT_DATASTORE" -var "esxi_username=ESXI_USERNAME" -var "esxi_password=ESXI_PASSWORD" ubuntu.json

Provisionierung Packer Vorlagen

Der Befehl sollte nun eine Standard Ubuntu 19.04 Installation anhand der preseed Datei generiert haben, welche einen User enthält, dem es erlaubt ist sudo zu verwenden.

Der nächste Schritt ist nun die Anpassung der virtuellen Maschine. Für diesen Zweck kennt Packer provisioners.

Mit dieser Methode kann man nun

  • Installation provisinieren ( zB ansible installation )
  • Anpassungen der Konfiguration ( ansible playbook(s) )
  • Temporäre Installationen entfernen

Die Konfiguration kann nun um folgendes erweitert werden:


{
  "builders": [{
   ...
  }],
  "provisioners": [{
      "type": "shell",
      "execute_command": "echo 'vagrant' | {{.Vars}} sudo -S -E bash '{{.Path}}'",
      "script": "scripts/setup.sh"
    },
    {
      "type": "ansible-local",
      "playbook_dir": "ansible",
      "playbook_file": "ansible/main.yml",
      "extra_arguments": ["--extra-vars \"root_password={{user `root_password`}} user_password={{user `user_password`}}\""]
    },
    {
      "type": "shell",
      "execute_command": "echo 'vagrant' | {{.Vars}} sudo -S -E bash '{{.Path}}'",
      "script": "scripts/cleanup.sh"
    }
  ]
}

Der Inhalt des Verzeichnisses ist nun wie folgt

|-- ansible
|   |-- ansible.cfg
|   |-- main.yml
|   |-- roles
|-- scripts
|-- example.json
`-- variables.json

Innerhalb von ansible/main.yaml kann man nun einen ansible Play definieren um Software Packete zu installieren und eigene Einstellungen zu tätigen.

Packer Nachbehandlung

Nachdem nun Packer auch mit den obigen Änderungen funktioniert, ist das Resultat eine virtuelle Maschine, die bereits nach unserem Wunsch angepasst wurde. Anfangs wollten wir jedoch eine VMWare Vorlage generieren um daraus dann virtuelle Maschinen zu erzeugen.

Hierfür hat Packer Post Processors implementiert. In unserem Fall verwenden wir nun den vsphere post processor und auch den vsphere-template post processor.

Der vsphere Post Processor stoppt die virtuelle Maschine, schaltet sie aus und transferiert sie in einen spezifischen Ordner.

Danach generiert der vsphere template Post Processor aus der virtuellen Maschine eine VMWare Vorlage, aus der dann später Maschinen erzeugt werden können.


{
    "builders": [{
   ...
  }],
  "provisioners": [{
  }],
  "post-processors": [
  [{
        "type": "vsphere",
        "cluster": "{{user `esxi_vsphere_cluster`}}",
        "host": "{{user `esxi_vsphere_host`}}",
        "datacenter": "{{user `esxi_vsphere_dc`}}",
        "username": "{{user `esxi_vsphere_username`}}",
        "password": "{{user `esxi_password`}}",
        "datastore": "{{user `esxi_datastore`}}",
        "vm_name": "T_Ubuntu",
        "vm_network": "VM Network",
        "vm_folder": "/Templates",
        "disk_mode": "thin",
        "insecure": "true",
        "overwrite": "true"
      },
      {
        "type": "vsphere-template",
        "host": "{{user `esxi_vsphere_host`}}",
        "insecure": "true",
        "datacenter": "{{user `esxi_vsphere_dc`}}",
        "username": "{{user `esxi_vsphere_username`}}",
        "password": "{{user `esxi_password`}}",
        "folder": "/Templates"
      }
    ]
  ]
}