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 , .
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.xmlFügen Sie am Ende der Datei den folgenden Block hinzu:
packer-vnc
inbound
tcp
dst
5900
6000
true
trueVerlassen 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 refreshGü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: deaktiviertFür die nächsten Schritte benötigen wir , 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.5Bei 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/packerUm das Problem zu lösen, können Sie einen Symlink erstellen oder den absoluten Pfad verwenden. /usr/bin/packer.
Jetzt benötigen wir ovftool. . 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-esxiIn 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.jsonWenn 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.24Da 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/amd64Jetzt 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/binWir sind auf der Zielgeraden. Lassen Sie uns unser Image bereitstellen.
Wechseln Sie in den Ordner:
cd /root/create-and-deploy-esxi/centos7Zuerst 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.jsonAuß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 applyWenn 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
