Hallo zusammen, ich bin Ivan und ich bin ein alkoholabhängiger Systemadministrator (OPS).
Ich möchte erzählen, wie ich virtuelle Maschinen auf ESXi ohne vCenter mit Terraform bereitstelle.
Es kommt oft vor, dass ich VMs bereitstellen oder neu erstellen muss, um bestimmte Anwendungen zu testen. Aus Faulheit habe ich über die Automatisierung des Prozesses nachgedacht. Meine Suche führte mich zu einem hervorragenden Produkt von , .
Ich denke, viele wissen, was Terraform ist, und für diejenigen, die es nicht wissen, ist es eine Anwendung zur Verwaltung jeder Cloud, Infrastruktur oder Dienstleistung unter Verwendung des IasC-Konzepts (Infrastruktur als Code).
Als Virtualisierungsumgebung verwende ich ESXi. Es ist ziemlich einfach, benutzerfreundlich und zuverlässig.
Ich kann die Frage vorhersehen.
Warum Terraform, wenn man vCenter Server verwenden kann?
Man kann es natürlich, aber. Erstens, es ist eine zusätzliche Lizenz, zweitens, dieses Produkt ist sehr ressourcenintensiv und passt einfach nicht auf meinen Heimserver, und drittens die Möglichkeit, die Fähigkeiten zu verbessern.
Als Server fungiert die 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.)So, nun alles der Reihe nach.
Lass uns zunächst ESXi einrichten, insbesondere den VNC-Port in den Firewall-Einstellungen öffnen.
Standardmäßig ist die Datei schreibgeschützt. Wir führen die folgenden Manipulationen durch:
chmod 644 /etc/vmware/firewall/service.xml
chmod +t /etc/vmware/firewall/service.xml
vi /etc/vmware/firewall/service.xmlWir fügen den folgenden Block am Ende der Datei hinzu:
packer-vnc
inbound
tcp
dst
5900
6000
true
trueWir verlassen, speichern. Ändern die Rechte zurück und starten den Dienst neu:
chmod 444 /etc/vmware/firewall/service.xml
esxcli network firewall refreshGültig bis zum Neustart des Hosts. Danach muss diese Manipulation wiederholt werden.
Die gesamte Arbeit werde ich in einer virtuellen Maschine auf demselben Server durchführen.
Spezifikationen:
OS: Centos 7 x86_64 minimal
RAM: 1GB
HDD: 20GB
Selinux: deaktiviert
firewalld: deaktiviertAls nächstes benötigen wir , ebenfalls ein Produkt von HashiCorp.
Es wird zur automatischen Erstellung eines 'goldenen' Images benötigt. Das werden wir in Zukunft verwenden.
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.5Schritt packer version Es kann ein Fehler auftreten, da sich möglicherweise ein Paket mit dem gleichen Namen in RedHat-basierten Systemen befindet.
which -a packer
/usr/sbin/packerUm das Problem zu lösen, kann man einen symbolischen Link erstellen oder den absoluten Pfad verwenden. /usr/bin/packer.
Jetzt benötigen wir ovftool. . Wir laden 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 Installer wird entpackt...fertig.
Sie müssen der Lizenzvereinbarung für den VMware OVF Tool-Komponenten für Linux Endbenutzer zustimmen, um fortzufahren. Drücken Sie die Eingabetaste, um fortzufahren.
VMWARE ENDBENUTZER-LIZENZVEREINBARUNG
Stimmen Sie zu? [ja/nein]:ja
Das Produkt ist bereit zur Installation. Drücken Sie die Eingabetaste, um mit der Installation zu beginnen oder Strg-C, um abzubrechen.
Installation der VMware OVF Tool-Komponente für Linux 4.4.0
Konfiguration...
[######################################################################] 100%
Installation war erfolgreich.Wir machen weiter.
Ich habe alles Notwendige auf Git vorbereitet.
git clone https://github.com/letnab/create-and-deploy-esxi.git && cd create-and-deploy-esxiIn den Ordner iso muss das Betriebssystem-Image gelegt werden. In meinem Fall ist es CentOS 7.
Es ist auch notwendig, die Datei centos-7-base.json:
variables: Geben Sie Ihre Daten für die Verbindung 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 korrekt eingestellt ist, sehen Sie den Prozess der automatischen Installation des Betriebssystems. Dieser Prozess dauert bei mir 7-8 Minuten.
Nach erfolgreichem Abschluss befindet sich die Datei output-packer-centos7-x86_64 im OVA-Dateiformat.
Wir installieren 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, muss dieser erstellt werden.
Wir installieren 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/amd64Dann 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 im Endspurt. Lasst uns unser Image ausrollen.
Wir wechseln in den Ordner:
cd /root/create-and-deploy-esxi/centos7Zuerst bearbeiten wir die Datei variables.tf. Es muss die Verbindung zum ESXi-Server angegeben werden.
In der Datei network_config.cfg enthalten die Netzwerkeinstellungen der zukünftigen virtuellen Maschine. Wir passen diese an unsere Bedürfnisse an und führen den Einzeiler aus:
sed -i -e '2d' -e '3i "network": "'$(gzip < network_config.cfg| base64 | tr -d 'n')'",' metadata.jsonUnd in der Datei main.tf ändern wir den Pfad zur OVA-Datei, falls er abweicht.
Der Moment der Wahrheit.
terraform init
Backend wird initialisiert...
Provider-Plugins werden initialisiert...
Die folgenden Provider haben keine Versionsbeschränkungen in der Konfiguration,
weshalb die neueste Version installiert wurde.
Um automatischen Upgrades auf neue Hauptversionen zu verhindern, die breaking
Änderungen enthalten könnten, wird empfohlen, Versionsbeschränkungen wie
"version = "..." zu den entsprechenden Provider-Blöcken in der Konfiguration
hinzuzufügen, mit den unten vorgeschlagenen Einschränkungszeichenfolgen.
* 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 alle Änderungen zu sehen, die für Ihre Infrastruktur erforderlich sind. Alle
Terraform-Befehle sollten jetzt funktionieren.
Wenn Sie jemals Module oder Backend-Konfigurationen für Terraform festlegen oder ändern,
führen Sie diesen Befehl erneut aus, um Ihr Arbeitsverzeichnis neu zu initialisieren.
Wenn Sie das vergessen, werden andere Befehle das erkennen und Sie gegebenenfalls daran
erinnern, dies zu tun.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 der lokalen oder entfernten Zustandsspeicherung gespeichert.
data.template_file.Default: Aktualisiere den Zustand...
data.template_file.network_config: Aktualisiere den Zustand...
------------------------------------------------------------------------
Ein Ausführungsplan wurde erstellt und wird unten angezeigt.
Ressourcemaßnahmen sind mit den folgenden Symbolen gekennzeichnet:
+ erstellen
Terraform wird die folgenden Aktionen ausführen:
# esxi_guest.Default wird erstellt
+ resource "esxi_guest" "Default" {
+ boot_disk_size = (nach Anwendung bekannt)
+ disk_store = "datastore1"
+ guest_name = "centos7-test"
+ guest_shutdown_timeout = (nach Anwendung bekannt)
+ guest_startup_timeout = (nach Anwendung bekannt)
+ guestinfo = {
+ "metadata" = "base64text"
+ "metadata.encoding" = "gzip+base64"
+ "userdata" = "base64text"
+ "userdata.encoding" = "gzip+base64"
}
+ guestos = (nach Anwendung bekannt)
+ id = (nach Anwendung bekannt)
+ ip_address = (nach Anwendung bekannt)
+ memsize = "1024"
+ notes = (nach Anwendung bekannt)
+ numvcpus = (nach Anwendung bekannt)
+ ovf_properties_timer = (nach Anwendung bekannt)
+ ovf_source = "/root/create-and-deploy-esxi/output-packer-centos7-x86_64/packer-centos7-x86_64.ova"
+ power = "an"
+ resource_pool_name = (nach Anwendung bekannt)
+ virthwver = (nach Anwendung bekannt)
+ netzwerkschnittstellen {
+ mac_address = (nach Anwendung bekannt)
+ nic_type = (nach Anwendung bekannt)
+ virtual_network = "VM Network"
}
}
Plan: 1 hinzufügen, 0 ändern, 0 löschen.
------------------------------------------------------------------------
Hinweis: Sie haben keinen "-out"-Parameter angegeben, um diesen Plan zu speichern,
weshalb Terraform nicht garantieren kann, dass genau diese Aktionen ausgeführt
werden, wenn "terraform apply" anschließend ausgeführt wird.
Fertig:
terraform applyWenn alles richtig gemacht wurde, wird innerhalb von 2-3 Minuten eine neue virtuelle Maschine aus dem zuvor erstellten Image bereitgestellt.
Die Verwendungsmöglichkeiten sind nur durch die Fantasie begrenzt.
Ich wollte nur meine Erkenntnisse teilen und die wichtigsten Aspekte bei der Arbeit mit diesen Produkten zeigen.
Danke für Ihre Aufmerksamkeit!
P.S.: Ich freue mich über konstruktive Kritik.
Quelle: habr.com
