Wie man eine Cloud-Infrastruktur mit Terraform verwaltet

Wie man eine Cloud-Infrastruktur mit Terraform verwaltet

In diesem Artikel werden wir die Bestandteile von Terraform untersuchen und Schritt fĂŒr Schritt unsere eigene Infrastruktur aufbauen. in der Cloud mit VMware — wir bereiten drei VMs fĂŒr verschiedene Zwecke vor: Proxy, Dateispeicher und CMS.

Alles im Detail und in drei Phasen:

1. Terraform — Beschreibung, Vorteile und Komponenten

Terraform ist ein IaC (Infrastructure-as-Code) Tool zur Erstellung und Verwaltung virtueller Infrastruktur mit Hilfe von Code.

Bei der Arbeit mit dem Tool haben wir mehrere Vorteile festgestellt:

  • Geschwindigkeit bei der Bereitstellung neuer Mandanten (benutzerdefinierte virtuelle Umgebungen). In der Regel gilt: Je mehr neue Kunden es gibt, desto mehr "Klicks" mĂŒssen die Mitarbeiter des technischen Supports tĂ€tigen, um neue Ressourcen bereitzustellen. Mit Terraform können die Benutzer Parameter von virtuellen Maschinen Ă€ndern (z.B. das automatische Herunterfahren des Betriebssystems und das Erhöhen der Partition der virtuellen Festplatte) ohne Eingreifen des technischen Supports und ohne das Herunterfahren der Maschine selbst.

  • Sofortige ÜberprĂŒfung des Aktivierungsplans des neuen Mandanten. Mit der Beschreibung des Infrastrukturcodes können wir sofort ĂŒberprĂŒfen, was und in welcher Reihenfolge hinzugefĂŒgt wird, sowie in welchem Endzustand sich die jeweilige virtuelle Maschine oder das virtuelle Netzwerk mit Verbindungen zu virtuellen Maschinen befinden wird.

  • Die Möglichkeit, die meisten gĂ€ngigen Cloud-Plattformen zu beschreiben. Sie können das Tool verwenden von Amazon und Google Cloud, bis hin zu privaten Plattformen auf Basis von VMware vCloud Director, die Dienste im Rahmen von IaaS-, SaaS- und PaaS-Lösungen anbieten.

  • Mehrere Cloud-Anbieter verwalten und die Infrastruktur zwischen ihnen verteilen, um die Ausfallsicherheit zu erhöhen, indem eine Konfiguration zur Erstellung, Diagnose und Verwaltung von Cloud-Ressourcen verwendet wird.

  • Benutzerfreundlichkeit zur Erstellung von DemostĂ€nden zum Testen und Debuggen von Software. Sie können StĂ€nde fĂŒr die Testabteilung erstellen und weitergeben, Software parallel in verschiedenen Umgebungen testen, sowie Ressourcen sofort Ă€ndern und löschen, indem Sie nur einen einzigen Ressourcenaufbauplan erstellen.

"Terrarium" Terraform

Wir haben kurz ĂŒber die Vorteile des Tools gesprochen, jetzt lassen Sie uns die Komponenten besprechen

Providers (Anbieter). 

In Terraform kann praktisch jeder Infrastrukturtyp als Ressource dargestellt werden. Die Verbindung zwischen Ressourcen und der API-Plattform wird durch Provider-Module gewÀhrleistet, die es ermöglichen, Ressourcen auf einer bestimmten Plattform, z. B. Azure oder VMware vCloud Director, zu erstellen.

Im Rahmen des Projekts können Sie mit verschiedenen Anbietern auf unterschiedlichen Plattformen interagieren.

Ressourcen (Ressourcenbeschreibung).

Die Beschreibung von Ressourcen ermöglicht die Verwaltung von Komponenten der Plattform, wie z. B. virtuellen Maschinen oder Netzwerken. 

Sie können eine Ressourcenbeschreibung fĂŒr den Anbieter VMware vCloud Director selbst erstellen und diese Beschreibung verwenden, um Ressourcen bei jedem Hosting-Anbieter, der vCloud Director nutzt, zu erstellen. Sie mĂŒssen lediglich die Authentifizierungs- und Netzwerkkonfigurationsparameter des entsprechenden Hosting-Anbieters Ă€ndern.

Provisioners.

Diese Komponente ermöglicht das DurchfĂŒhren von Operations zur Erstinstallation und Wartung des Betriebssystems nach der Erstellung von virtuellen Maschinen. Nachdem Sie die Ressource einer virtuellen Maschine erstellt haben, können Sie mit Hilfe von Provisioners SSH konfigurieren und sich verbinden, das Betriebssystem aktualisieren sowie Skripte hochladen und ausfĂŒhren. 

Input- und Output-Variablen.

Input-Variablen sind Eingangswerte fĂŒr beliebige Blocktypen. 

Output-Variablen ermöglichen es, Werte nach der Erstellung von Ressourcen zu speichern und können als Eingangswerte in anderen Modulen verwendet werden, z. B. im Provisioners-Block.

States (ZustÀnde).

State-Dateien speichern Informationen ĂŒber die Konfiguration der Ressourcen der Plattform des Anbieters. Bei der ersten Erstellung der Plattform gibt es keine Informationen ĂŒber die Ressourcen, und vor jeder Operation aktualisiert Terraform den Zustand mit der realen Infrastruktur der bereits beschriebenen Ressourcen.

Das Hauptziel der ZustĂ€nde ist es, die Bindung von Objekten bereits erstellter Ressourcen zu speichern, um die Konfiguration von hinzuzufĂŒgenden Ressourcen und Objekten zu vergleichen und die erneute Erstellung und Änderungen der Plattform zu vermeiden.

Die Standardzustandsinformationen werden in einer lokalen Datei terraform.tfstate gespeichert, aber bei Bedarf gibt es die Möglichkeit, eine entfernte Speicherung fĂŒr die Zusammenarbeit im Team zu verwenden.

Sie können auch die aktuellen Ressourcen der Plattform in einen Zustand importieren, um weiterhin mit anderen Ressourcen zu interagieren, die wiederum ohne Hilfe von Terraform erstellt wurden.  

2. Erstellung der Infrastruktur

Die Komponenten wurden besprochen, nun werden wir mit Terraform schrittweise eine Infrastruktur mit drei virtuellen Maschinen erstellen. Die erste mit einem installierten Proxy-Server nginx, die zweite mit Speicherplatz auf Basis von Nextcloud und die dritte mit dem CMS Bitrix.

Wir werden den Code schreiben und ausfĂŒhren am Beispiel unseres Clouds auf VMware vCloud Director. Unsere Benutzer erhalten ein Konto mit den Rechten eines Organization Administrators. Wenn Sie ein Konto mit denselben Rechten in einer anderen VMware-Cloud verwenden, können Sie den Code aus unseren Beispielen reproduzieren. Los geht's!

Zuerst erstellen wir ein Verzeichnis fĂŒr unser neues Projekt, in dem die Dateien mit der Beschreibung der Infrastruktur abgelegt werden.

mkdir project01

Dann beschreiben wir die Komponenten der Infrastruktur. Terraform erstellt Verbindungen und verarbeitet die Dateien basierend auf der Beschreibung in den Dateien. Die Dateien können je nach Zielsetzung der beschriebenen Blöcke benannt werden, zum Beispiel beschreibt network.tf die Netzwerkkonfiguration fĂŒr die Infrastruktur.

FĂŒr die Beschreibung der Komponenten unserer Infrastruktur haben wir folgende Dateien erstellt:

Liste der Dateien.

main.tf — Beschreibung der Parameter fĂŒr die virtuelle Umgebung — virtuelle Maschinen, virtuelle Container;

network.tf — Beschreibung der Parameter des virtuellen Netzwerks und der NAT-, Firewall-Regeln;

variables.tf — Liste der verwendeten Variablen;

vcd.tfvars — Werte der Projektvariablen fĂŒr das Modul VMware vCloud Director.

Die Konfigurationssprache in Terraform ist deklarativ und die Reihenfolge der Blöcke spielt keine Rolle, außer bei den provisioner-Blöcken, da wir in diesem Block die Befehle beschreiben, die bei der Vorbereitung der Infrastruktur ausgefĂŒhrt werden sollen, und sie werden in der angegebenen Reihenfolge ausgefĂŒhrt.

Struktur der Blöcke.

"" "" {

# Block body

= # Argument

}

FĂŒr die Beschreibung der Blöcke wird eine eigene Programmiersprache verwendet, HCL (HashiCorp Configuration Language). Es ist auch möglich, die Infrastruktur mit JSON zu beschreiben. Mehr ĂŒber die Syntax kann man auf der Entwicklerwebsite nachlesen.

Konfiguration der Umgebungsvariablen, variables.tf und vcd.tfvars

Zuerst erstellen wir zwei Dateien, die die Liste aller verwendeten Variablen und deren Werte fĂŒr das Modul VMware vCloud Director beschreiben. Als erstes erstellen wir die Datei variables.tf.

Inhalt der Datei variables.tf.

Variable "vcd_org_user" {

  Beschreibung = "vCD Tenant User"

}

Variable "vcd_org_password" {

  Beschreibung = "vCD Tenant Password"

}

Variable "vcd_org" {

  Beschreibung = "vCD Tenant Org"

}

Variable "vcd_org_vdc" {

  Beschreibung = "vCD Tenant VDC"

}

Variable "vcd_org_url" {

  Beschreibung = "vCD Tenant URL"

}

Variable "vcd_org_max_retry_timeout" {

  Standard = "60"

}

Variable "vcd_org_allow_unverified_ssl" {

  Standard = "true"

}

Variable "vcd_org_edge_name" {

  Beschreibung = "vCD edge name"

}

Variable "vcd_org_catalog" {

  Beschreibung = "vCD public catalog"

}

Variable "vcd_template_os_centos7" {

  Beschreibung = "OS CentOS 7"

  Standard = "CentOS7"

}

Variable "vcd_org_ssd_sp" {

  Beschreibung = "Storage Policies"

  Standard = "Gold Storage Policy"

}

Variable "vcd_org_hdd_sp" {

  Beschreibung = "Storage Policies"

  Standard = "Bronze Storage Policy"

}

Variable "vcd_edge_local_subnet" {

  Beschreibung = "Organization Network Subnet"

}

Variable "vcd_edge_external_ip" {

  Beschreibung = "External public IP"

}

Variable "vcd_edge_local_ip_nginx" {}

Variable "vcd_edge_local_ip_bitrix" {}

Variable "vcd_edge_local_ip_nextcloud" {}

Variable "vcd_edge_external_network" {}

Werte der Variablen, die wir vom Anbieter erhalten.

  • vcd_org_user — Benutzername mit Rechten des Organisationsadministrators,

  • vcd_org_password — Passwort des Benutzers,

  • vcd_org — Name der Organisation,

  • vcd_org_vdc — Name des virtuellen Rechenzentrums,

  • vcd_org_url — API URL,

  • vcd_org_edge_name — Name des virtuellen Routers,

  • vcd_org_catalog — Name des Katalogs mit Vorlagen fĂŒr virtuelle Maschinen,

  • vcd_edge_external_ip — Öffentliche IP-Adresse,

  • vcd_edge_external_network — Name des externen Netzwerks,

  • vcd_org_hdd_sp — Name der HDD-Speicherpolitik,

  • vcd_org_ssd_sp — Name der SSD-Speicherpolitik.

Und wir geben unsere Variablen ein:

  • vcd_edge_local_ip_nginx — IP-Adresse der virtuellen Maschine mit NGINX,

  • vcd_edge_local_ip_bitrix — IP-Adresse der virtuellen Maschine mit 1C: Bitrix,

  • vcd_edge_local_ip_nextcloud — IP-Adresse der virtuellen Maschine mit Nextcloud.

Im zweiten Datei erstellen wir und geben die Variablen fĂŒr das VMware vCloud Director-Modul in der Datei vcd.tfvars an: Wir erinnern uns, dass wir in unserem Beispiel die eigene Cloud mClouds, verwenden. Wenn Sie mit einem anderen Anbieter arbeiten, klĂ€ren Sie die Werte bei ihm. 

Inhalt der Datei vcd.tfvars.

vcd_org_url = "https://vcloud.mclouds.ru/api"

vcd_org_user = "orgadmin"

vcd_org_password = "*"

vcd = "org"

vcd_org_vdc = "orgvdc"

vcd_org_maxretry_timeout = 60

vcd_org_allow_unverified_ssl = true

vcd_org_catalog = "Templates"

vcd_templateos_centos7 = "CentOS7"

vcd_org_ssd_sp = "Gold Storage Policy"

vcd_org_hdd_sp = "Bronze Storage Policy"

vcd_org_edge_name = "MCLOUDS-EDGE"

vcd_edge_external_ip = "185.17.66.1"

vcd_edge_local_subnet = "192.168.110.0/24"

vcd_edge_local_ip_nginx = "192.168.110.1"

vcd_edge_local_ip_bitrix = "192.168.110.10"

vcd_edge_local_ip_nextcloud = "192.168.110.11"

vcd_edge_external_network = "NET-185-17-66-0"

Netzwerkkonfiguration, network.tf.

Die Umgebungsvariablen sind festgelegt, jetzt konfigurieren wir das Verbindungschema der virtuellen Maschinen – jeder virtuellen Maschine wird eine private IP-Adresse zugewiesen, und ĂŒber Destination NAT "leiten" wir die Ports ins externe Netzwerk. Um den Zugriff auf die Verwaltungsports einzuschrĂ€nken, gewĂ€hren wir nur unserer IP-Adresse Zugriff.

Wie man eine Cloud-Infrastruktur mit Terraform verwaltetDas Netzwerk-Schema fĂŒr die erstellte Terraform-Plattform

Wir erstellen ein virtuelles privates Netzwerk mit dem Namen net_lan01, Standardgateway: 192.168.110.254, sowie mit folgendem Adressbereich: 192.168.110.0/24.

Wir beschreiben das virtuelle Netzwerk.

resource "vcd_network_routed" "net" {

  name = "net_lan01"

  edge_gateway = var.vcd_org_edge_name

  gateway = "192.168.110.254"

  dns1 = "1.1.1.1"

  dns2 = "8.8.8.8"

 static_ip_pool {

start_address = "192.168.110.1"

end_address = "192.168.110.253"

  }

}

Wir erstellen Regeln fĂŒr die Firewall, die den virtuellen Maschinen den Zugang zum Internet ermöglicht. Innerhalb dieses Blocks haben alle virtuellen Ressourcen in der Cloud Zugang zum Internet:

Wir beschreiben die Regeln fĂŒr den Zugang von VM zum Internet.

resource "vcd_nsxv_firewall_rule" "fw_internet_access" {

  edge_gateway   = var.vcdorgedgename

  name = "Internet Access"

  source {

gateway_interfaces = ["internal"]

  }

  destination {

gateway_interfaces = ["external"]

  }

  service {

protocol = "any"

  }

  depends_on = [vcdnetworkrouted.net]

}

Wir setzen die AbhÀngigkeit, dass wir nach der Verarbeitung des Blocks vcdnetworkrouted.net mit der Konfiguration des Blocks vcdnsxvfirewallrule fortfahren., mithilfe von dependson. Wir nutzen diese Option, da einige AbhÀngigkeiten möglicherweise in der Konfiguration nicht offensichtlich erkannt werden können.

Als nĂ€chstes erstellen wir Regeln, die den Zugang zu den Ports aus dem externen Netzwerk erlauben, und geben unsere IP-Adresse fĂŒr den SSH-Zugang zu den Servern an. Jeder Benutzer aus dem Internet hat Zugang zu den Ports 80 und 443 auf dem Webserver, und der Benutzer mit der IP-Adresse 90.1.15.1 hat Zugang zu den SSH-Ports der virtuellen Server.

Wir erlauben den Zugang zu den Ports aus dem externen Netzwerk.

resource "vcd_nsxv_firewall_rule" "fwnatports" {

  edge_gateway   = var.vcd_org_edge_name

  name = "HTTPs Access"

  source {

gateway_interfaces = ["external"]

  }

  destination {

  gateway_interfaces = ["internal"]

  }

  service {

protocol = "tcp"

port = "80"

  }

  service {

protocol = "tcp"

port = "443"

  }

  depends_on = [vcd_network_routed.net]

}

resource "vcd_nsxv_firewall_rule" "fw_nat_admin_ports" {

  edge_gateway   = var.vcd_org_edge_name

  name = "Admin Access"

  source {

  ip_addresses = [ "90.1.15.1" ]

  }

  destination {

  gateway_interfaces = ["internal"]

  }

  service {

protocol = "tcp"

port = "58301"

  }

  service {

protocol = "tcp"

port = "58302"

  }

  service {

protocol = "tcp"

port = "58303"

  }

  depends_on = [vcd_network_routed.net]

}

Wir erstellen Regeln fĂŒr Source NAT, um Zugang zum Internet aus dem Cloud-LAN zu erhalten:

Wir beschreiben die Regeln fĂŒr Source NAT.

resource "vcd_nsxv_snat" "snat_local" {

edge_gateway = var.vcd_org_edge_name

  netzwerk_typ = "ext"

  network_name = var.vcdedgeexternalnetwork

  original_address   = var.vcd_edge_local_subnet

translated_address = var.vcd_edge_external_ip

  depends_on = [vcd_network_routed.net]

}

Und zum Abschluss der Konfiguration des Netzwerkblocks fĂŒgen wir Regeln fĂŒr Destination NAT hinzu, um Zugang zu den Diensten aus dem externen Netzwerk zu erhalten:

Wir fĂŒgen die Regeln fĂŒr Destination NAT hinzu.

resource "vcd_nsxv_dnat" "dnat_tcp_nginx_https" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
netzwerk_typ = "ext"

  description = "NGINX HTTPs"

original_address = var.vcd_edge_external_ip
original_port = 443

translated_address = var.vcd_edge_local_ip_nginx
translated_port = 443
protocol = "tcp"

depends_on = [vcd_network_routed.net]
}
resource "vcd_nsxv_dnat" "dnat_tcp_nginx_http" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
netzwerk_typ = "ext"

description = "NGINX HTTP"

original_address = var.vcd_edge_external_ip
original_port = 80

translated_address = var.vcd_edge_local_ip_nginx
translated_port = 80
protocol = "tcp"

depends_on = [vcd_network_routed.net]

}

Wir fĂŒgen eine NAT-Regel zur Portweiterleitung an den SSH-Server unter Nginx hinzu.

resource "vcd_nsxv_dnat" "dnat_tcp-nginx_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
netzwerk_typ = "ext"

description = "SSH NGINX"

original_address = var.vcd_edge_external_ip
original_port = 58301

translated_address = var.vcd_edge_local_ip_nginx
translated_port = 22
protocol = "tcp"

depends_on = [vcd_network_routed.net]

}

Wir fĂŒgen eine NAT-Regel zur Portweiterleitung an den SSH-Server mit 1C-Bitrix hinzu.

resource "vcd_nsxv_dnat" "dnat_tcp_bitrix_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
netzwerk_typ = "ext"

description = "SSH Bitrix"

original_address = var.vcd_edge_external_ip
original_port = 58302

translated_address = var.vcd_edge_local_ip_bitrix
translated_port = 22
protocol = "tcp"

depends_on = [vcd_network_routed.net]

}

Wir fĂŒgen eine NAT-Regel zur Portweiterleitung an den SSH-Server mit Nextcloud hinzu.

resource "vcd_nsxv_dnat" "dnat_tcp_nextcloud_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
netzwerk_typ = "ext"

description = "SSH Nextcloud"

original_address = var.vcd_edge_external_ip
original_port = 58303 translated_address = var.vcd_edge_local_ip_nextcloud
translated_port = 22
protocol = "tcp"

depends_on = [vcd_network_routed.net]

}

Konfiguration der virtuellen Umgebung main.tf

Wie zu Beginn des Artikels geplant, werden wir drei virtuelle Maschinen erstellen. Diese werden durch „Guest Customization“ vorbereitet. Die Netzwerkkonfiguration werden wir entsprechend unseren angegebenen Einstellungen vornehmen, und das Passwort fĂŒr den Benutzer wird automatisch generiert.

Wir beschreiben das vApp, in dem sich die virtuellen Maschinen und ihre Konfiguration befinden.

Wie man eine Cloud-Infrastruktur mit Terraform verwaltetKonfiguration der virtuellen Maschinen

Wir erstellen einen vApp-Container. Damit wir den vApp und die VM sofort mit dem virtuellen Netzwerk verbinden können, fĂŒgen wir auch den Parameter depends_on hinzu:

Wir erstellen einen Container

resource "vcd_vapp" "vapp" {
name = "web"
power_on = "true" depends_on = [vcd_network_routed.net]

}

Wir erstellen eine virtuelle Maschine mit Beschreibung

resource "vcd_vapp_vm" "nginx" {

vapp_name = vcd_vapp.vapp.name

name = "nginx"

catalog_name = var.vcd_org_catalog

template_name = var.vcd_template_os_centos7

storage_profile = var.vcd_org_ssd_sp

memory = 8192

cpus = 1

cpu_cores = 1

network {

type = "org"

name = vcd_network_routed.net.name

is_primary = true

adapter_type = "VMXNET3"

ip_allocation_mode = "MANUAL"

ip = var.vcd_edge_local_ip_nginx

}

override_template_disk {

bus_type = "paravirtual"

size_in_mb = "32768"

bus_number = 0

unit_number = 0

storage_profile = var.vcd_org_ssd_sp

}

}

Die grundlegenden Parameter in der VM-Beschreibung:

  • name — Name der virtuellen Maschine,

  • vappname — Name der vApp, in die die neue VM hinzugefĂŒgt werden soll,

  • catalogname / templatename — Name des Katalogs und Name des Vorlagen der virtuellen Maschine,

  • storageprofile — Standard-Speicherpolitik.

Parameter des Blocks network:

  • type — Art des verbundenen Netzwerks,

  • name — An welches virtuelle Netzwerk die VM angeschlossen wird,

  • isprimary — primĂ€rer Netzwerkadapter,

  • ipallocation_mode — Adresszuweisungsmodus MANUAL / DHCP / POOL,

  • ip — IP-Adresse fĂŒr die virtuelle Maschine, die werden wir manuell angeben.

Block override_template_disk:

  • sizeinmb — GrĂ¶ĂŸe der Boot-Disk fĂŒr die virtuelle Maschine

  • storage_profile — Speicherpolitik fĂŒr die Disk

Wir erstellen die zweite VM mit der Beschreibung des Dateispeichers Nextcloud

resource "vcd_vapp_vm" "nextcloud" {

vapp_name = vcd_vapp.vapp.name

name = "nextcloud"

catalog_name = var.vcd_org_catalog

template_name = var.vcd_template_os_centos7

storage_profile = var.vcd_org_ssd_sp

memory = 8192

cpus = 1

cpu_cores = 1

network {

type = "org"

name = vcd_network_routed.net.name

is_primary = true

adapter_type = "VMXNET3"

ip_allocation_mode = "MANUAL"

ip = var.vcd_edge_local_ip_nextcloud

}

override_template_disk {

bus_type = "paravirtual"

size_in_mb = "32768"

bus_number = 0

unit_number = 0

storage_profile = var.vcd_org_ssd_sp

}

}

resource "vcd_vm_internal_disk" "disk1" {

vapp_name = vcd_vapp.vapp.name

vm_name = "nextcloud"

bus_type = "paravirtual"

size_in_mb = "102400"

bus_number = 0

unit_number = 1

storage_profile = var.vcd_org_hdd_sp

allow_vm_reboot = true

depends_on = [ vcd_vapp_vm.nextcloud ]

}

Im Abschnitt vcdvminternal_disk beschreiben wir eine neue virtuelle Festplatte, die an die virtuelle Maschine angeschlossen wird.

ErklÀrung zum Block vcdvminternaldisk:

  • bustype — Typ des Festplattenspeichers

  • sizeinmb — GrĂ¶ĂŸe der Festplatte

  • busnumber / unitnumber — Anschlussstelle im Adapter

  • storage_profile — Speicherpolitik fĂŒr die Disk

Wir beschreiben die letzte VM fĂŒr Bitrix

resource "vcd_vapp_vm" "bitrix" {

vapp_name = vcd_vapp.vapp.name

name = "bitrix"

catalog_name = var.vcd_org_catalog

template_name = var.vcd_template_os_centos7

storage_profile = var.vcd_org_ssd_sp

memory = 8192

cpus = 1

cpu_cores = 1

network {

type = "org"

name = vcd_network_routed.net.name

is_primary = true

adapter_type = "VMXNET3"

ip_allocation_mode = "MANUAL"

ip = var.vcd_edge_local_ip_bitrix

}

override_template_disk {

bus_type = "paravirtual"

size_in_mb = "81920"

bus_number = 0

unit_number = 0

storage_profile = var.vcd_org_ssd_sp

}

}

Betriebssystemaktualisierung und Installation zusÀtzlicher Skripte

Das Netzwerk ist bereit, die virtuellen Maschinen sind beschrieben. Vor dem Import unserer Infrastruktur können wir eine erste Bereitstellung mit den Provisioner-Blöcken und ohne Verwendung von Ansible durchfĂŒhren.

Betrachten wir, wie man das Betriebssystem aktualisiert und das Installationsskript fĂŒr das CMS Bitrix mit Hilfe des Provisioners ausfĂŒhrt.

Zuerst fĂŒhren wir die Installation der Aktualisierungspakete fĂŒr CentOS durch.

resource "null_resource" "nginx_update_install" {

provisioner "remote-exec" {

connection {

type = "ssh"

user = "root"

password = vcd_vapp_vm.nginx.customization[0].admin_password

host = var.vcd_edge_external_ip

port = "58301"

timeout = "30s"

}

inline = [

"yum -y update && yum -y upgrade",

"yum -y install wget nano epel-release net-tools unzip zip" ]

}

}

}

Bezeichnung der Komponenten:

  • provisioner «remote-exec» — blockieren wir den Block fĂŒr die remote "Provisionierung"

  • Im Block connection beschreiben wir Typ und Parameter fĂŒr die Verbindung:

  • type — Protokoll, in unserem Fall SSH;

  • user — Benutzername;

  • password — Benutzerpasswort. In unserem Fall verweisen wir auf den Parameter vcdvappvm.nginx.customization[0].admin_password, der das generierte Passwort fĂŒr den Systembenutzer speichert.

  • host — externe IP-Adresse fĂŒr die Verbindung;

  • port — Anschlussport, der zuvor in den DNAT-Einstellungen angegeben wurde;

  • inline — wir listen die Befehle auf, die eingegeben werden. Die Befehle werden der Reihenfolge nach ausgefĂŒhrt, wie in diesem Abschnitt angegeben.

Als Beispiel fĂŒhren wir zusĂ€tzlich das Installationsskript fĂŒr 1C-Bitrix aus. Die Ausgabe des Skriptergebnisses wird wĂ€hrend der AusfĂŒhrung des Plans verfĂŒgbar sein. Um das Skript zu installieren, beschreiben wir zuerst den Block:

Wir beschreiben die Installation von 1C-Bitrix.

provisioner "file" {

source = "prepare.sh"

destination = "\/tmp\/prepare.sh"

connection {

type = "ssh"

user = "root"

password = vcd_vapp_vm.nginx.customization[0].admin_password

host = var.vcd_edge_external_ip

port = "58301"

timeout = "30s"

}

}

provisioner "remote-exec" {

inline = [

"chmod +x \/tmp\/prepare.sh", ".\/tmp\/prepare.sh"

]

}

Und sofort beschreiben wir das Update fĂŒr Bitrix.

Beispiel fĂŒr die Bereitstellung von 1C-Bitrix.

resource "null_resource" "install_update_bitrix" {

provisioner "remote-exec" {

connection {

type = "ssh"

user = "root"

password = vcd_vapp_vm.bitrix.customization[0].admin_password

host = var.vcd_edge_external_ip

port = "58302"

timeout = "60s"

}

inline = [

"yum -y update && yum -y upgrade",

"yum -y install wget nano epel-release net-tools unzip zip",

"wget http:\/\/repos.1c-bitrix.ru\/yum\/bitrix-env.sh -O \/tmp\/bitrix-env.sh",

"chmod +x \/tmp\/bitrix-env.sh",

"\/tmp\/bitrix-env.sh"

]

}

}

Wichtig! Das Skript funktioniert möglicherweise nicht, wenn SELinux nicht vorher deaktiviert wird! Wenn Sie einen ausfĂŒhrlichen Artikel zur Installation und Konfiguration von CMS 1C-Bitrix mit bitrix-env.sh benötigen, können Sie unsere Artikel im Blog auf der Website nutzen.

3. Initialisierung der Infrastruktur

Wie man eine Cloud-Infrastruktur mit Terraform verwaltetInitialisierung von Modulen und Plugins

FĂŒr die Arbeit verwenden wir ein einfaches „Gentleman-Set“: einen Laptop mit Windows 10 und ein Distribution von der offiziellen Website terraform.io. Entpacken und initialisieren wir mit dem Befehl: terraform.exe init

Nach der Beschreibung der Rechen- und Netzwerkstruktur starten wir die Planung, um unsere Konfiguration zu ĂŒberprĂŒfen, wo wir sehen können, was erstellt wird und wie es miteinander verbunden ist.

  1. Wir fĂŒhren den Befehl aus - terraform plan -var-file=vcd.tfvars.

  2. Wir erhalten das Ergebnis - Plan: 16 hinzuzufĂŒgen, 0 zu Ă€ndern, 0 zu zerstören. Das heißt, nach diesem Plan werden 16 Ressourcen erstellt.

  3. Wir starten den Plan mit dem Befehl - terraform.exe apply -var-file=vcd.tfvars.

Die virtuellen Maschinen werden erstellt, und dann werden die von uns aufgelisteten Pakete im Rahmen des Provisionierers ausgefĂŒhrt – das Betriebssystem wird aktualisiert und CMS Bitrix wird installiert.

Abrufen von Daten fĂŒr die Verbindung

Nach der AusfĂŒhrung des Plans möchten wir die Zugangsdaten fĂŒr die Server in Textform erhalten, dafĂŒr gestalten wir den Abschnitt output wie folgt:

output "nginxpassword" {

 value = vcdvappvm.nginx.customization[0].adminpassword

}

Und die nĂ€chste Ausgabe informiert uns ĂŒber das Passwort der erstellten virtuellen Maschine:

Outputs: nginx_password = F#4u8!!N

Insgesamt erhalten wir Zugriff auf die virtuellen Maschinen mit dem aktualisierten Betriebssystem und den vorinstallierten Paketen fĂŒr unsere weitere Arbeit. Alles ist bereit!

Aber was, wenn Sie bereits eine bestehende Infrastruktur haben?

3.1. Arbeiten von Terraform mit einer bestehenden Infrastruktur

Es ist ganz einfach, Sie können die aktuellen virtuellen Maschinen und deren vApp-Container mit dem Befehl importieren.

Wir beschreiben die Ressource vAPP und die virtuelle Maschine.

resource "vcd_vapp" "Monitoring" {

name = "Monitoring"

org = "mClouds"

vdc = "mClouds"

}

resource "vcd_vapp_vm" "Zabbix" {

name = "Zabbix"

org = "mClouds"

vdc = "mClouds"

vapp = "Monitoring"

}

Der nĂ€chste Schritt besteht darin, die Eigenschaften der vApp-Ressourcen im Format auszufĂŒhren vcdvapp. .., wo:

  • vApp — Name der vApp;

  • org — Name der Organisation;

  • org_vdc — Name des virtuellen Rechenzentrums.

Wie man eine Cloud-Infrastruktur mit Terraform verwaltetImport der Eigenschaften der vAPP-Ressource

FĂŒhren wir den Import der Eigenschaften der VM-Ressourcen im Format aus: vcdvappvm. ..., in dem:

  • VM — Name der VM;

  • vApp — Name der vApp;

  • org — Name der Organisation;

  • orgvdc — Name des virtuellen Rechenzentrums.

Der Import war erfolgreich

C:UsersMikhailDesktopterraform>terraform import vcd_vapp_vm.Zabbix mClouds.mClouds.Monitoring.Zabbix

vcd_vapp_vm.Zabbix: Importieren von ID "mClouds.mClouds.Monitoring.Zabbix"...

vcd_vapp_vm.Zabbix: Import vorbereitet!

vcd_vapp_vm fĂŒr den Import vorbereitet

vcd_vapp_vm.Zabbix: Status wird aktualisiert... [id=urn:vcloud:vm:778f4a89-1c8d-45b9-9d94-0472a71c4d1f]

Import erfolgreich!

Die importierten Ressourcen sind oben angezeigt. Diese Ressourcen befinden sich jetzt in
Ihrem Terraform-Zustand und werden fortan von Terraform verwaltet.

Jetzt können wir die neue importierte Ressource ansehen:

Importierte Ressource

> terraform show

...

# vcd_vapp.Monitoring:

resource "vcd_vapp" "Monitoring" {

guest_properties = {}

href = "https://vcloud.mclouds.ru/api/vApp/vapp-fe5db285-a4af-47c4-93e8-55df92f006ec"

id = "urn:vcloud:vapp:fe5db285-a4af-47c4-93e8-55df92f006ec"

ip = "zugewiesen"

metadata = {}

name = "Monitoring"

org = "mClouds"

status = 4

status_text = "EINGESCHALTET"

vdc = "mClouds"

}




# vcd_vapp_vm.Zabbix:

resource "vcd_vapp_vm" "Zabbix" {

computer_name = "Zabbix"

cpu_cores = 1

cpus = 2

expose_hardware_virtualization = false

guest_properties = {}

hardware_version = "vmx-14"

href = "https://vcloud.mclouds.ru/api/vApp/vm-778f4a89-1c8d-45b9-9d94-0472a71c4d1f"

id = "urn:vcloud:vm:778f4a89-1c8d-45b9-9d94-0472a71c4d1f"

internal_disk = [

{

bus_number = 0

bus_type = "paravirtual"

disk_id = "2000"

iops = 0

size_in_mb = 122880

storage_profile = "Gold Storage Policy"

thin_provisioned = true

unit_number = 0

},

]

memory = 8192

metadata = {}

name = "Zabbix"

org = "mClouds"

os_type = "centos8_64Guest"

storage_profile = "Gold Storage Policy"

vapp_name = "Monitoring"

vdc = "mClouds"

customization {

allow_local_admin_password = true

auto_generate_password = true

change_sid = false

enabled = false

force = false

join_domain = false

join_org_domain = false

must_change_password_on_first_login = false

number_of_auto_logons = 0

}

network {

adapter_type = "VMXNET3"

ip_allocation_mode = "DHCP"

is_primary = true

mac = "00:50:56:07:01:b1"

name = "MCLOUDS-LAN01"

type = "org"

}

}

Jetzt ist es definitiv fertig – wir haben den letzten Punkt (Import in eine bestehende Infrastruktur) abgeschlossen und alle wesentlichen Aspekte der Arbeit mit Terraform betrachtet. 

Das Tool hat sich als sehr nĂŒtzlich erwiesen und ermöglicht es, Ihre Infrastruktur als Code zu beschreiben, angefangen bei virtuellen Maschinen eines Cloud-Anbieters bis hin zur Beschreibung von Ressourcen fĂŒr Netzwerkomponenten.

Die UnabhĂ€ngigkeit von der Umgebung ermöglicht die Arbeit mit lokalen und Cloud-Ressourcen sowie das Management von Plattformen. Wenn es keine unterstĂŒtzte Plattform gibt und der Wunsch besteht, eine neue hinzuzufĂŒgen, kann ein eigener Anbieter geschrieben und genutzt werden.

Quelle: habr.com

60GB SSD 8Gb DDR4