KI für DevOps-Engineers – Teil 1: Die Grundlagen von DevOps-KI
DevOps ist ein entscheidender Erfolgsfaktor in der Softwareentwicklung, und wir sind definitiv alle auf die eine oder andere Weise auf KI gestoßen. Eine
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.
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.
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.
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:
1$ packer
2usage: packer [--version] [--help] <command> [<args>]
3
4Available commands are:
5 build build image(s) from template
6 fix fixes templates from old versions of packer
7 inspect see components of a template
8 validate check that a template is valid
9 version Prints the Packer version
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.
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ü.
Das folgende Kommando muss am ESXi ausgeführt werden:
1esxcli 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.
Packer verbindet sich zudem per VNC zur virtuellen Maschine. Hierfür müssen in der Firewall die entsprechenden Ports freigegeben werden.
1chmod 644 /etc/vmware/firewall/service.xml
2chmod +t /etc/vmware/firewall/service.xml
Und diese Liste muss nun ans Ende der obigen Datei eingefügt werden:
1<service id="1000">
2 <id>packer-vnc</id>
3 <rule id="0000">
4 <direction>inbound</direction>
5 <protocol>tcp</protocol>
6 <porttype>dst</porttype>
7 <port>
8 <begin>5900</begin>
9 <end>6000</end>
10 </port>
11 </rule>
12 <enabled>true</enabled>
13 <required>true</required>
14</service>
Schließlichen müssen die korrekten Rechte wieder hergestellt und die Firewall neu geladen werden
1chmod 444 /etc/vmware/firewall/service.xml
2esxcli network firewall refresh
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
1{% raw %}
2{
3 "builders": [{
4 "name": "Ubuntu-19.04",
5 "type": "vmware-iso",
6 "vm_name": "Ubuntu-19.04",
7 "guest_os_type": "ubuntu-64",
8 "tools_upload_flavor": "linux",
9 "headless": true,
10
11 "iso_urls": ["iso/ubuntu-19.04-server-amd64.iso",
12 "http://cdimage.ubuntu.com/ubuntu/releases/19.04/release/ubuntu-19.04-server-amd64.iso"
13 ],
14 "iso_checksum": "7e8a0d07522f591dfee9bc9fcd7c05466763161e6cb0117906655bce1750b2fa",
15 "iso_checksum_type": "sha256",
16
17 "cpus": 2,
18 "memory": 4096,
19 "disk_size": 20140,
20
21 "boot_wait": "10s",
22 "boot_command": [
23 "<esc><wait>",
24 "<esc><wait>",
25 "<enter><wait>",
26 "/install/vmlinuz",
27 " initrd=/install/initrd.gz ",
28 "auto=true ",
29 "url=https://raw.githubusercontent.com/infralovers/packer-preseed/master/ubuntu.cfg ",
30 "fb=false ",
31 "auto=true ",
32 "language=en ",
33 "locale=en_US ",
34 "priority=critical ",
35 "keymap=us ",
36 "netcfg/get_hostname={{ .Name }} ",
37 "netcfg/get_domain=vm ",
38 "debconf/frontend=noninteractive ",
39 "debian-installer/country=AT ",
40 "console-setup/ask_detect=false ",
41 "console-keymaps-at/keymap=us ",
42 "DEBCONF_DEBUG=5 ",
43 "<enter>"
44 ],
45
46 "ssh_username": "vagrant",
47 "ssh_password": "vagrant",
48 "ssh_port": 22,
49 "ssh_wait_timeout": "20m",
50 "shutdown_command": "echo 'shutdown -P now' > shutdown.sh; echo 'vargant'|sudo -S sh 'shutdown.sh'",
51
52 "vnc_disable_password": true,
53 "format": "vmx",
54 "remote_type": "esx5",
55 "remote_host": "{{user `esxi_host`}}",
56 "remote_datastore": "{{user `esxi_datastore`}}",
57 "remote_username": "{{user `esxi_username`}}",
58 "remote_password": "{{user `esxi_password`}}",
59 "keep_registered": true,
60 "skip_export": true
61
62 }]
63}
64{% endraw %}
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.
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.
1packer build -var "esxi_host=YOUR-ESXI" -var "esxi_datastore=YOUR_DEFAULT_DATASTORE" -var "esxi_username=ESXI_USERNAME" -var "esxi_password=ESXI_PASSWORD" ubuntu.json
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
Die Konfiguration kann nun um folgendes erweitert werden:
1{% raw %}
2{
3 "builders": [{
4 ...
5 }],
6 "provisioners": [{
7 "type": "shell",
8 "execute_command": "echo 'vagrant' | {{.Vars}} sudo -S -E bash '{{.Path}}'",
9 "script": "scripts/setup.sh"
10 },
11 {
12 "type": "ansible-local",
13 "playbook_dir": "ansible",
14 "playbook_file": "ansible/main.yml",
15 "extra_arguments": ["--extra-vars \"root_password={{user `root_password`}} user_password={{user `user_password`}}\""]
16 },
17 {
18 "type": "shell",
19 "execute_command": "echo 'vagrant' | {{.Vars}} sudo -S -E bash '{{.Path}}'",
20 "script": "scripts/cleanup.sh"
21 }
22 ]
23}
24{% endraw %}
Der Inhalt des Verzeichnisses ist nun wie folgt
1|-- ansible
2| |-- ansible.cfg
3| |-- main.yml
4| |-- roles
5|-- scripts
6|-- example.json
7`-- 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.
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.
1{% raw %}
2{
3 "builders": [{
4 ...
5 }],
6 "provisioners": [{
7 }],
8 "post-processors": [
9 [{
10 "type": "vsphere",
11 "cluster": "{{user `esxi_vsphere_cluster`}}",
12 "host": "{{user `esxi_vsphere_host`}}",
13 "datacenter": "{{user `esxi_vsphere_dc`}}",
14 "username": "{{user `esxi_vsphere_username`}}",
15 "password": "{{user `esxi_password`}}",
16 "datastore": "{{user `esxi_datastore`}}",
17 "vm_name": "T_Ubuntu",
18 "vm_network": "VM Network",
19 "vm_folder": "/Templates",
20 "disk_mode": "thin",
21 "insecure": "true",
22 "overwrite": "true"
23 },
24 {
25 "type": "vsphere-template",
26 "host": "{{user `esxi_vsphere_host`}}",
27 "insecure": "true",
28 "datacenter": "{{user `esxi_vsphere_dc`}}",
29 "username": "{{user `esxi_vsphere_username`}}",
30 "password": "{{user `esxi_password`}}",
31 "folder": "/Templates"
32 }
33 ]
34 ]
35}
36{% endraw %}
Sie interessieren sich für unsere Trainings oder haben einfach eine Frage, die beantwortet werden muss? Sie können uns jederzeit kontaktieren! Wir werden unser Bestes tun, um alle Ihre Fragen zu beantworten.
Hier kontaktieren