Schnelles Deployment von ESXi-VMs mit Terraform

Hallo zusammen, mein Name ist Ivan und ich bin ein systemischer Administrator (OPS).

Ich möchte erzählen, wie ich virtuelle Maschinen auf ESXi ohne vCenter mit Terraform aufsetze.

Es kommt häufig vor, dass ich virtuelle Maschinen einrichten oder neu erstellen muss, um verschiedene Anwendungen zu testen. Aus Faulheit habe ich über eine Automatisierung des Prozesses nachgedacht. Meine Suche führte mich zu einem großartigen Produkt von der Firma hashicorp, terraform.

Ich denke, viele wissen, was Terraform ist. Für diejenigen, die es nicht wissen: Es ist eine Anwendung zur Verwaltung jeder Cloud, Infrastruktur oder Dienstleistung unter Verwendung des IaC-Konzepts (Infrastruktur als Code).

Als Virtualisierungsumgebung nutze ich ESXi. Es ist einfach, benutzerfreundlich und zuverlässig.
Ich kann die Frage bereits vorausahnen.

Warum Terraform, wenn man auch vCenter Server nutzen kann?

Das kann man zwar, aber: Erstens, es ist eine zusätzliche Lizenz; zweitens, dieses Produkt ist sehr ressourcenintensiv und hat einfach keinen Platz auf meinem Heimserver; und drittens, die Möglichkeit, meine Fähigkeiten auszubauen.

Der Server basiert auf der Intel NUC-Plattform:

CPU: 2 CPUs x Intel(R) Core(TM) i3-4010U CPU @ 1,70GHz
RAM: 8GB
HDD: 500GB
ESXi-Version: ESXi-6.5.0-4564106-standard (VMware, Inc.)

Nun, fangen wir der Reihe nach an.

Lassen Sie uns zunächst ESXi konfigurieren, indem wir den VNC-Port in den Firewall-Einstellungen öffnen.

Standardmäßig ist die Datei schreibgeschützt. Führen Sie die folgenden Schritte aus:

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

Fügen Sie am Ende der Datei den folgenden Block hinzu:

packer-vnc
  
    inbound
    tcp
    dst
    
      5900
      6000
    
  
  true
  true

Verlassen Sie den Editor, speichern Sie die Änderungen. Setzen Sie die Berechtigungen zurück und starten Sie den Dienst neu:

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

Gültig bis zum Neustart des Hosts. Nach dem Neustart müssen Sie diesen Schritt wiederholen.

Ich werde die gesamte Arbeit in einer virtuellen Maschine auf demselben Server ausführen.

Technische Daten:

Betriebssystem: CentOS 7 x86_64 minimal
RAM: 1 GB
HDD: 20 GB
Selinux: deaktiviert
firewalld: deaktiviert

Für die nächsten Schritte benötigen wir packer, ebenso das Produkt von HashiCorp.

Es wird benötigt, um automatisch ein „goldenes“ Image zu erstellen, das wir in Zukunft verwenden werden.

yum install unzip git -y
curl -O https://releases.hashicorp.com/packer/1.5.5/packer_1.5.5_linux_amd64.zip
unzip packer_1.5.5_linux_amd64.zip -d /usr/bin && rm -rf packer_1.5.5_linux_amd64.zip
packer version
Packer v1.5.5

Bei Schritt packer version Es kann ein Fehler auftreten, da in RedHat-basierten Systemen möglicherweise ein Paket mit dem gleichen Namen vorhanden ist.

which -a packer
/usr/sbin/packer

Um das Problem zu lösen, können Sie einen Symlink erstellen oder den absoluten Pfad verwenden. /usr/bin/packer.

Jetzt benötigen wir ovftool. Download-Link. Wir laden es herunter, legen es auf den Server und installieren es:

chmod +x VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
./VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
VMware-Installationsprogramm wird entpackt... fertig.
Sie müssen die Endbenutzer-Lizenzvereinbarung für das VMware OVF Tool für Linux akzeptieren, um fortzufahren. Drücken Sie die Eingabetaste, um fortzufahren.
VMWARE ENDUSER-LIZENZVEREINBARUNG
Stimmen Sie zu? [ja/nein]:ja
Das Produkt ist bereit zur Installation. Drücken Sie die Eingabetaste, um die Installation zu starten oder Strg-C, um abzubrechen.
Installation des VMware OVF Tool-Komponenten für Linux 4.4.0
    Konfiguration...
[######################################################################] 100%
Die Installation war erfolgreich.

Lassen Sie uns fortfahren.

Ich habe auf Git alles Nötige vorbereitet.

git clone https://github.com/letnab/create-and-deploy-esxi.git && cd create-and-deploy-esxi

In den Ordner iso Sie müssen das Betriebssystem-Image ablegen. In meinem Fall ist es CentOS 7.

Außerdem müssen Sie die Datei bearbeiten centos-7-base.json:

variables: Geben Sie Ihre Verbindungsdaten an
iso_urls: Geben Sie die aktuelle URL an
iso_checksum: Prüfziffer Ihres Images 

Nach allen Änderungen starten wir den Build:

/usr/bin/packer build centos-7-base.json

Wenn alles richtig eingestellt und eingefügt ist, sehen Sie das Bild der automatischen Installation des Betriebssystems. Dieser Prozess dauert bei mir 7-8 Minuten.

Nach erfolgreichem Abschluss befindet sich im Ordner output-packer-centos7-x86_64 die OVA-Datei.

Installieren Sie Terraform:

curl -O https://releases.hashicorp.com/terraform/0.12.24/terraform_0.12.24_linux_amd64.zip
unzip terraform_0.12.24_linux_amd64.zip -d /usr/bin/ && rm -rf terraform_0.12.24_linux_amd64.zip
tf version
Terraform v0.12.24

Da Terraform keinen Provider für ESXi hat, müssen wir ihn erstellen.

Installieren wir Go:

cd /tmp
curl -O https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.14.2.linux-amd64.tar.gz && rm -rf go1.14.2.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version
go version go1.14.2 linux/amd64

Jetzt erstellen wir den Provider:

go get -u -v golang.org/x/crypto/ssh
go get -u -v github.com/hashicorp/terraform
go get -u -v github.com/josenk/terraform-provider-esxi
export GOPATH="$HOME/go"
cd $GOPATH/src/github.com/josenk/terraform-provider-esxi
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-w -extldflags "-static"' -o terraform-provider-esxi_`cat version`
cp terraform-provider-esxi_`cat version` /usr/bin

Wir sind auf der Zielgeraden. Lassen Sie uns unser Image bereitstellen.

Wechseln Sie in den Ordner:

cd /root/create-and-deploy-esxi/centos7

Zuerst bearbeiten wir die Datei variables.tf. Hier müssen Sie die Verbindung zum ESXi-Server angeben.

In der Datei network_config.cfg Hier werden die Netzwerkeinstellungen der zukünftigen virtuellen Maschine festgelegt. Passen Sie sie nach Ihren Bedürfnissen an und starten Sie den Befehl:

sed -i -e '2d' -e '3i "network": "'$(gzip < network_config.cfg| base64 | tr -d 'n')'",' metadata.json

Außerdem in der Datei main.tf ändern wir den Pfad zur OVA-Datei, falls er abweicht.

Der entscheidende Moment.

terraform init
Backend wird initialisiert...

Provider-Plugins werden initialisiert...

Die folgenden Provider haben keine Versionsbeschränkungen in der Konfiguration,
sodass die neuesten Versionen installiert wurden.

Um automatische Upgrades auf neue Hauptversionen, die möglicherweise
Breaking Changes enthalten, zu verhindern, wird empfohlen, Versionsbedingungen
wie "..." zu den entsprechenden Provider-Blöcken in der Konfiguration hinzuzufügen,
mit den folgenden empfohlenen Einschränkungsstrings:

* provider.esxi: version = "~> 1.6"
* provider.template: version = "~> 2.1"

Terraform wurde erfolgreich initialisiert!

Sie können nun mit Terraform arbeiten. Versuchen Sie, "terraform plan" auszuführen,
um zu sehen, welche Änderungen für Ihre Infrastruktur erforderlich sind. Alle Terraform-Befehle
sollten jetzt funktionieren.

Falls Sie jemals Module oder die Backend-Konfiguration für Terraform festlegen oder ändern,
führen Sie diesen Befehl erneut aus, um Ihr Arbeitsverzeichnis neu zu initialisieren. Wenn Sie es vergessen,
werden andere Befehle dies erkennen und Sie gegebenenfalls daran erinnern.

terraform plan
Aktualisiere den Terraform-Zustand im Speicher vor dem Plan...
Der aktualisierte Zustand wird verwendet, um diesen Plan zu berechnen, wird jedoch nicht
in den lokalen oder entfernten Zustandsspeicher gespeichert.

data.template_file.Default: Zustand wird aktualisiert...
data.template_file.network_config: Zustand wird aktualisiert...

------------------------------------------------------------------------

Ein Ausführungsplan wurde erstellt und ist unten dargestellt.
Ressourcemaßnahmen sind mit den folgenden Symbolen gekennzeichnet:
  + erstellen

Terraform wird die folgenden Aktionen durchführen:

  # esxi_guest.Default wird erstellt
  + resource "esxi_guest" "Default" {
      + boot_disk_size         = (bekannt nach Anwendung)
      + disk_store             = "datastore1"
      + guest_name             = "centos7-test"
      + guest_shutdown_timeout = (bekannt nach Anwendung)
      + guest_startup_timeout  = (bekannt nach Anwendung)
      + guestinfo              = {
          + "metadata"          = "base64text"
          + "metadata.encoding" = "gzip+base64"
          + "userdata"          = "base64text"
          + "userdata.encoding" = "gzip+base64"
        }
      + guestos                = (bekannt nach Anwendung)
      + id                     = (bekannt nach Anwendung)
      + ip_address             = (bekannt nach Anwendung)
      + memsize                = "1024"
      + notes                  = (bekannt nach Anwendung)
      + numvcpus               = (bekannt nach Anwendung)
      + ovf_properties_timer   = (bekannt nach Anwendung)
      + ovf_source             = "/root/create-and-deploy-esxi/output-packer-centos7-x86_64/packer-centos7-x86_64.ova"
      + power                  = "on"
      + resource_pool_name     = (bekannt nach Anwendung)
      + virthwver              = (bekannt nach Anwendung)

      + network_interfaces {
          + mac_address     = (bekannt nach Anwendung)
          + nic_type        = (bekannt nach Anwendung)
          + virtual_network = "VM-Netzwerk"
        }
    }

Plan: 1 hinzufügen, 0 ändern, 0 zerstören.

------------------------------------------------------------------------

Hinweis: Sie haben keinen "-out"-Parameter angegeben, um diesen Plan zu speichern, daher kann Terraform
nicht garantieren, dass genau diese Aktionen ausgeführt werden, wenn
"terraform apply" später ausgeführt wird.

Fazit:

terraform apply

Wenn alles richtig gemacht wurde, wird in 2-3 Minuten eine neue virtuelle Maschine aus dem zuvor erstellten Image bereitgestellt.

Die Anwendungsmöglichkeiten sind nur durch die eigene Fantasie begrenzt.

Ich wollte lediglich meine Erfahrungen teilen und die wichtigsten Aspekte bei der Arbeit mit diesen Produkten aufzeigen.

Vielen Dank für Ihre Aufmerksamkeit!

P.S.: Ich freue mich über konstruktive Kritik.

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster