
V tomto článku se podíváme na to, z čeho se Terraform skládá, a krok za krokem spustíme vlastní infrastrukturu — 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 . 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 .
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 , 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.
Sché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.
Konfigurace 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 .
3. Inicializace infrastruktury
Inicializace modulů a pluginů
Pro práci používáme jednoduchou „gentlemanskou sadu“: notebook s OS Windows 10 a distribuci z oficiálního webu . 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.
Spouštíme příkaz
- terraform plan -var-file=vcd.tfvars.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ů.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.
Import 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
