Jak spravovat cloudovou infrastrukturu pomocí Terraformu

Jak spravovat cloudovou infrastrukturu pomocí Terraformu

V tomto článku se podíváme na to, z čeho se Terraform skládá, a krok za krokem spustíme vlastní infrastrukturu v cloudu s VMware — připravíme tři VM pro různé účely: proxy, diskové úložiště a CMS.

Vše podrobně a ve třech krocích:

1. Terraform — popis, výhody a součásti

Terraform je nástroj IaC (Infrastructure-as-Code) pro budování a správu virtuální infrastruktury pomocí kódu.

Při práci s tímto nástrojem jsme si všimli několika výhod:

  • Rychlost nasazení nových tenantů (uživatelských virtuálních prostředí). Obvykle, čím více nových klientů, tím více „kliknutí“ je třeba provést zaměstnancům technické podpory pro publikaci nových zdrojů. S Terraformem mohou uživatelé měnit parametry virtuálních strojů (například automaticky vypínat OS a zvětšovat oddíl virtuálního disku) bez účasti technické podpory a vypnutí samotného stroje.

  • Okamžité ověření plánu aktivace nového tenant. Pomocí popisu kódu infrastruktury můžeme okamžitě zkontrolovat, co a v jakém pořadí bude přidáno, a také v jakém konečném stavu bude ten nebo onen virtuální stroj či virtuální síť s připojeními k virtuálním strojům.

  • Možnost popisovat většinu populárních cloudových platforem. Můžete používat nástroj od Amazonu a Google Cloud až po soukromé platformy postavené na VMware vCloud Director, které nabízejí služby v rámci IaaS, SaaS a PaaS řešení.

  • Spravovat více cloudových poskytovatelů a rozdělovat infrastrukturu mezi nimi pro zvýšení odolnosti vůči výpadkům, přičemž používáte jednu konfiguraci pro vytváření, diagnostiku a správu cloudových zdrojů.

  • Pohodlné použití pro vytváření demonstračních stánků pro testování a ladění softwaru. Můžete vytvářet a předávat stánky pro oddělení testování, paralelně kontrolovat software v různých prostředích a také okamžitě měnit a odstraňovat zdroje s vytvořeným pouze jedním plánem pro stavbu zdrojů.

„Terárium“ Terraform

Krátce jsme představili výhody nástroje, nyní se podíváme na jeho součásti.

Poskytovatelé. 

V Terraformu lze prakticky jakýkoli typ infrastruktury představit jako zdroj. Vztah mezi zdroji a platformou API zajišťují moduly poskytovatelů, které umožňují vytvářet zdroje v rámci určité platformy, například Azure nebo VMware vCloud Director.

V rámci projektu můžete spolupracovat s různými poskytovateli na různých platformách.

Zdroje.

Popis zdrojů umožňuje spravovat komponenty platformy, například virtuální stroje nebo sítě. 

Můžete si sami vytvořit popis zdrojů pro poskytovatele VMware vCloud Director a použít tento popis k vytváření zdrojů u jakéhokoli hostingového poskytovatele, který používá vCloud Director. Budete potřebovat pouze nahradit parametry autentifikace a parametry síťového připojení potřebného hostingového poskytovatele.

Provisioners.

Tato součást umožňuje provádět operace první instalace a údržby operačního systému po vytvoření virtuálních strojů. Jakmile vytvoříte zdroj virtuálního stroje, pomocí provisioners můžete nastavit a připojit se přes SSH, provést aktualizaci operačního systému a také nahrát a spustit skript. 

Vstupní a výstupní proměnné.

Vstupní proměnné jsou vstupní proměnné pro jakýkoli typ bloků. 

Výstupní proměnné umožňují uložit hodnoty po vytvoření zdrojů a mohou být použity jako vstupní proměnné v jiných modulech, například v bloku Provisioners.

Stavy..

Stavové soubory ukládají informace o konfiguraci zdrojů platformy poskytovatele. Při prvním vytvoření platformy nejsou žádné údaje o zdrojích a před jakoukoli operací Terraform aktualizuje stav s reálnou infrastrukturou již popsaných zdrojů.

Hlavním cílem stavů je zachovat vazbu objektů již vytvořených zdrojů pro porovnání konfigurace přidávaných zdrojů a objektů, aby se předešlo opětovnému vytváření a změnám platformy.

Informace o stavu se ve výchozím nastavení ukládají do místního souboru terraform.tfstate, ale pokud je to nutné, existuje možnost použít vzdálené úložiště pro práci v týmu.

Také můžete importovat aktuální zdroje platformy do stavu, abyste mohli interagovat s dalšími zdroji, které byly vytvořeny bez pomoci Terraform.  

2. Vytváření infrastruktury

Komponenty jsme rozebrali, nyní pomocí Terraform postupně vytvoříme infrastrukturu se třemi virtuálními stroji. První s nainstalovaným proxy serverem nginx, druhá s úložným prostorem na bázi Nextcloud a třetí s CMS Bitrix.

Kód budeme psát a spouštět na příkladu našeho cloud na VMware vCloud Director. U nás uživatelé získávají účet s oprávněním Organizace Administrátor, pokud používáte účet se stejnými oprávněními v jiném cloudu VMware, budete moci reprodukovat kód z našich příkladů. Jdeme na to!

Nejprve vytvoříme pro náš nový projekt adresář, ve kterém budou umístěny soubory s popisem infrastruktury.

mkdir project01

Poté popíšeme komponenty infrastruktury. Terraform vytváří vazby a zpracovává soubory na základě popisu v souborech. Soubory samotné lze pojmenovat podle cílového určení popisovaných bloků, například network.tf — popisuje síťové parametry pro infrastrukturu.

Pro popis komponentů naší infrastruktury jsme vytvořili následující soubory:

Seznam souborů.

main.tf — popis parametrů pro virtuální prostředí — virtuální stroje, virtuální kontejnery;

network.tf — popis parametrů virtuální sítě a pravidel NAT, Firewall;

variables.tf — seznam proměnných, které používáme;

vcd.tfvars — hodnoty proměnných projektu pro modul VMware vCloud Director.

Jazyk konfigurace v Terraform je deklarativní a pořadí bloků není důležité, kromě bloků provisioner, protože v tomto bloku popisujeme příkazy k provedení při přípravě infrastruktury a tyto příkazy budou vykonány v pořadí.

Struktura bloků.

"" "" {

# Block body

= # Argument

}

Pro popis bloků se používá vlastn í programovací jazyk HCL (HashiCorp Configuration Language), infrastrukturu je možné popsat také pomocí JSON. Více o syntaxi se lze dozvědět na stránkách vývojáře.

Konfigurace proměnné prostředí, variables.tf a vcd.tfvars

Nejprve vytvoříme dva soubory, které popisují seznam všech používaných proměnných a jejich hodnot pro modul VMware vCloud Director. Nejprve vytvoříme soubor variables.tf.

Obsah souboru variables.tf.

proměnná "vcd_org_user" {

  popis = "vCD Tenant User"

}

proměnná "vcd_org_password" {

  popis = "vCD Tenant Password"

}

proměnná "vcd_org" {

  popis = "vCD Tenant Org"

}

proměnná "vcd_org_vdc" {

  popis = "vCD Tenant VDC"

}

proměnná "vcd_org_url" {

  popis = "vCD Tenant URL"

}

proměnná "vcd_org_max_retry_timeout" {

  výchozí = "60"

}

proměnná "vcd_org_allow_unverified_ssl" {

  výchozí = "true"

}

proměnná "vcd_org_edge_name" {

  popis = "vCD edge name"

}

proměnná "vcd_org_catalog" {

  popis = "vCD public catalog"

}

proměnná "vcd_template_os_centos7" {

  popis = "OS CentOS 7"

  výchozí = "CentOS7"

}

proměnná "vcd_org_ssd_sp" {

  popis = "Storage Policies"

  výchozí = "Gold Storage Policy"

}

proměnná "vcd_org_hdd_sp" {

  popis = "Storage Policies"

  výchozí = "Bronze Storage Policy"

}

proměnná "vcd_edge_local_subnet" {

  popis = "Organization Network Subnet"

}

proměnná "vcd_edge_external_ip" {

  popis = "External public IP"

}

proměnná "vcd_edge_local_ip_nginx" {}

proměnná "vcd_edge_local_ip_bitrix" {}

proměnná "vcd_edge_local_ip_nextcloud" {}

proměnná "vcd_edge_external_network" {}

Hodnoty proměnných, které získáváme od poskytovatele.

  • vcd_org_user — uživatelské jméno s právy Organization Administrator,

  • vcd_org_password — heslo uživatele,

  • vcd_org — název organizace,

  • vcd_org_vdc — název virtuálního datového centra,

  • vcd_org_url — API URL,

  • vcd_org_edge_name — název virtuálního routeru,

  • vcd_org_catalog — název katalogu se šablonami virtuálních strojů,

  • vcd_edge_external_ip — veřejná IP adresa,

  • vcd_edge_external_network — název externí sítě,

  • vcd_org_hdd_sp — název politiky uchovávání HDD,

  • vcd_org_ssd_sp — název politiky uchovávání SSD.

A zadáme své proměnné:

  • vcd_edge_local_ip_nginx — IP adresa virtuálního stroje s NGINX,

  • vcd_edge_local_ip_bitrix — IP adresa virtuálního stroje s 1C: Bitrix,

  • vcd_edge_local_ip_nextcloud — IP adresa virtuálního stroje s Nextcloud.

Druhým souborem vytváříme a uvádíme proměnné pro modul VMware vCloud Director v souboru vcd.tfvars: Připomínáme, že v našem příkladu používáme vlastní cloud mClouds, pokud pracujete s jiným poskytovatelem, ověřte si hodnoty u něj. 

Obsah souboru 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"

Síťová konfigurace, network.tf.

Proměnné prostředí byly nastaveny, nyní nakonfigurujeme schéma připojení virtuálních strojů — každému virtuálnímu stroji přidělíme soukromou IP adresu a pomocí Destination NAT "protneme" porty do vnější sítě. Pro omezení přístupu k řídicím portům nastavíme přístup pouze pro naši IP adresu.

Jak spravovat cloudovou infrastrukturu pomocí TerraformuSchéma sítě pro vytvářenou platformu Terraform

Vytváříme virtuální organizační síť s názvem net_lan01, výchozí bránou: 192.168.110.254, a také s adresním prostorem: 192.168.110.0/24.

Popisujeme virtuální síť.

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"

  }

}

Vytvoříme pravidla pro firewall, která umožní virtuálním strojům přístup k internetu. V rámci tohoto bloku budou mít všechny virtuální zdroje v cloudu přístup k internetu:

Popisujeme pravidla pro přístup VM na 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]

}

Nastavíme závislost, že po zpracování bloku vcdnetworkrouted.net přistoupíme ke konfiguraci bloku vcdnsxvfirewallrule, pomocí dependson. Používáme tuto možnost, protože některé závislosti nemusí být rozpoznány implicitně v konfiguraci.

Dále vytvoříme pravidla povolující přístup k portům z vnější sítě a uvádíme naši IP adresu pro připojení přes SSH k serverům. Jakýkoli uživatel internetu má přístup k portům 80 a 443 na webovém serveru a uživatel s IP adresou 90.1.15.1 má přístup k portům SSH virtuálních serverů.

Povolujeme přístup k portům z vnější sítě.

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]

}

Vytváříme pravidla Source NAT pro přístup k internetu z cloudové místní sítě:

Popisujeme pravidla Source NAT.

resource "vcd_nsxv_snat" "snat_local" {

edge_gateway = var.vcd_org_edge_name

  network_type = "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]

}

A na závěr konfigurace síťového bloku přidáváme pravidla Destination NAT pro přístup k službám z vnější sítě:

Přidáváme pravidla Destination NAT.

resource "vcd_nsxv_dnat" "dnat_tcp_nginx_https" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "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
network_type = "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]

}

Přidáme pravidlo NAT pro přesměrování portů na SSH server pod Nginx.

resource "vcd_nsxv_dnat" "dnat_tcp-nginx_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "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]

}

Přidáme pravidlo NAT pro přesměrování portů na SSH server 1C-Bitrix.

resource "vcd_nsxv_dnat" "dnat_tcp_bitrix_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "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]

}

Přidáme pravidlo NAT pro přesměrování portů na SSH server Nextcloud.

resource "vcd_nsxv_dnat" "dnat_tcp_nextcloud_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "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]

}

Konfigurace virtuálního prostředí main.tf

Jak jsme plánovali na začátku článku, vytvoříme tři virtuální stroje. Budou nastaveny pomocí „Guest Customization“. Síťové parametry nastavíme podle našich specifikací a heslo pro uživatele bude generováno automaticky.

Popíšeme vApp, ve kterém se nacházejí virtuální stroje a jejich konfigurace.

Jak spravovat cloudovou infrastrukturu pomocí TerraformuKonfigurace virtuálních strojů

Vytvoříme kontejner vApp. Abychom mohli okamžitě připojit vApp a VM k virtuální síti, také přidáme parametr depends_on:

Vytváříme kontejner

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

}

Vytvoříme virtuální stroj s popisem

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

}

}

Hlavní parametry v popisu VM:

  • name — jméno virtuálního stroje,

  • vappname — název vApp, do které přidat nový VM,

  • catalogname / templatename — název katalogu a název šablony virtuálního stroje,

  • storageprofile — výchozí politika uchovávání.

Parametry bloku network:

  • type — typ připojené sítě,

  • name — ke které virtuální síti připojit VM,

  • isprimary — hlavní síťový adaptér,

  • ipallocation_mode — režim přidělování adresy MANUAL / DHCP / POOL,

  • ip — IP adresa pro virtuální stroj, stanovíme ručně.

Blok override_template_disk:

  • sizeinmb — velikost boot disku pro virtuální stroj

  • storage_profile — politika uchovávání pro disk

Vytvoříme druhý VM s popisem úložiště 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 ]

}

V sekci vcdvminternal_disk popíšeme nový virtuální disk, který se připojuje k virtuální mašině.

Vysvětlení k bloku vcdvminternaldisk:

  • bustype — typ diskového řadiče

  • sizeinmb — velikost disku

  • busnumber / unitnumber — místo připojení v adaptéru

  • storage_profile — politika uchovávání pro disk

Popíšeme poslední VM na 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

}

}

Aktualizace OS a instalace dalších skriptů

Síť je připravena, virtuální stroje jsou popsány. Před importem naší infrastruktury můžeme předem provést počáteční provisioning pomocí bloků provisioners a bez použití Ansible.

Podíváme se, jak aktualizovat OS a spustit instalační skript CMS Bitrix pomocí bloku provisioner.

Nejprve provedeme instalaci balíčků aktualizace CentOS.

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" ]

}

}

}

Označení složek:

  • provisioner «remote-exec» — připojujeme blok vzdáleného «provisioningu»

  • V bloku connection popisujeme typ a parametry pro připojení:

  • type — protokol, v našem případě SSH;

  • user — uživatelské jméno;

  • password — heslo uživatele. V našem případě odkazujeme na parametr vcdvappvm.nginx.customization[0].admin_password, který uchovává vygenerované heslo pro uživatele systému.

  • host — externí IP adresa pro připojení;

  • port — port pro připojení, který jsme dříve uvedli v nastaveních DNAT;

  • inline — vyjmenujeme seznam příkazů, které budou zadány. Příkazy budou zadány v pořadí, jak je uvedeno v této sekci.

Jako příklad navíc provedeme skript pro instalaci 1C-Bitrix. Výstup výsledku provedení skriptu bude dostupný při provádění plánu. Pro instalaci skriptu nejprve popíšeme blok:

Popíšeme instalaci 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"

]

}

A hned popíšeme aktualizaci Bitrix.

Příklad provisioningu 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"

]

}

}

Důležité! Skript nemusí fungovat, pokud předem neodpojíte SELinux! Pokud potřebujete podrobný článek o instalaci a nastavení CMS 1C-Bitrix pomocí bitrix-env.sh, můžete využít náš článek v blogu na webu.

3. Inicializace infrastruktury

Jak spravovat cloudovou infrastrukturu pomocí TerraformuInicializace modulů a pluginů

Pro práci používáme jednoduchou „gentlemanskou sadu“: notebook s OS Windows 10 a distribuci z oficiálního webu terraform.io. Rozbalíme a inicializujeme pomocí příkazu: terraform.exe init

Po popisu výpočetní a síťové infrastruktury spouštíme plánování pro kontrolu naší konfigurace, kde můžeme vidět, co bude vytvořeno a jak jsou prvky propojeny.

  1. Spouštíme příkaz - terraform plan -var-file=vcd.tfvars.

  2. Získáváme výsledek - Plán: 16 přidat, 0 změnit, 0 zničit. Tedy podle tohoto plánu bude vytvořeno 16 zdrojů.

  3. Spouštíme plán příkazem - terraform.exe apply -var-file=vcd.tfvars.

Virtuální stroje budou vytvořeny a poté se provedou námi uvedené balíčky v rámci sekce provisioner — OS bude aktualizována a CMS Bitrix bude nainstalována.

Získání dat pro připojení

Po provedení plánu chceme získat textové údaje pro připojení k serverům, proto formátujeme sekci output následujícím způsobem:

output "nginxpassword" {

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

}

A následující výstup nám oznamuje heslo k vytvořenému virtuálnímu stroji:

Outputs: nginx_password = F#4u8!!N

Nakonec získáváme přístup k virtuálním strojům s aktualizovaným operačním systémem a předinstalovanými balíčky pro naši další práci. Všechno je připraveno!

Ale co když již máte existující infrastrukturu?

3.1. Práce Terraform s již existující infrastrukturou

Je to jednoduché, můžete importovat aktuální virtuální stroje a jejich vApp kontejnery pomocí příkazu import.

Popíšeme zdroj vAPP a virtuální stroj.

resource "vcd_vapp" "Monitoring" {

name = "Monitoring"

org = "mClouds"

vdc = "mClouds"

}

resource "vcd_vapp_vm" "Zabbix" {

name = "Zabbix"

org = "mClouds"

vdc = "mClouds"

vapp = "Monitoring"

}

Dalším krokem je provést import vlastností zdrojů vApp ve formátu vcdvapp.<vApp> <org>.<orgvdc>.<vApp>, kde:

  • vApp — název vApp;

  • org — název organizace;

  • org_vdc — název virtuálního datového centra.

Jak spravovat cloudovou infrastrukturu pomocí TerraformuImport vlastností zdroje vAPP

Provádíme import vlastností zdrojů VM ve formátu: vcdvappvm.<VM> <org>.<orgvdc>.<vApp>.<VM>, v němž:

  • VM — název VM;

  • vApp — název vApp;

  • org — název organizace;

  • orgvdc — název virtuálního datového centra.

Import byl úspěšný

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

vcd_vapp_vm.Zabbix: Import ze ID "mClouds.mClouds.Monitoring.Zabbix"...

vcd_vapp_vm.Zabbix: Import byl připraven!

vcd_vapp_vm byl připraven na import

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

Import byl úspěšný!

Importované zdroje jsou zobrazeny výše. Tyto zdroje jsou nyní v
vašem stavu Terraform a budou od nynějška spravovány pomocí Terraformu.

Nyní se můžeme podívat na nový importovaný zdroj:

Importovaný zdroj

> 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 = "allocated"

metadata = {}

name = "Monitoring"

org = "mClouds"

status = 4

status_text = "POCÍNÁNO"

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"

}

}

Nyní je vše připraveno – dokončili jsme poslední bod (import do existující infrastruktury) a projeli jsme hlavní aspekty práce s Terraformem. 

Nástroj se ukázal jako velmi užitečný a umožňuje popsat vaši infrastrukturu jako kód, počínaje virtuálními stroji jednoho cloudového poskytovatele až po popis zdrojů síťových komponentů.

Přitom nezávislost na prostředí umožňuje pracovat s místními, cloudovými zdroji a končit s ovládáním platformy. A pokud není podporovaná platforma a je potřeba přidat novou, lze napsat vlastního poskytovatele a použít jej.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster