Pozn.: Tuto oblast jsem studoval pouze několik dní z oficiální dokumentace a dalších materiálů na internetu. Popis obsahuje základní informace. Existuje řada obecných otázek, které jsou důležité při produkčním použití. Jako optimální dělení konfiguračních souborů, využití proměnných, jmenná konvence apod. Nějaké odpovědi jsou uvedeny v oficiální dokumentaci, ale není to úplně konzistentní a nesedí s různými příklady. Znamená to další studování a testování.
HashiCorp Terraform
Terraform je softwarový nástroj vytvořený společností HashiCorp. Umožňuje využít infrastrukturu jako kód (Infrastructure as Code) k poskytování (provision) a správě (manage) infrastruktury organizace. Můžeme automatizovat životní cyklus cloudu, privátního datacentra i SaaS infrastruktury.
Terraform umožňuje bezpečně a efektivně budovat, měnit a verzovat infrastrukturu. Pro deklarativní popis se využívá jazyk HashiCorp Configuration Language (HCL), alternativně také syntaxe kompatibilní s JSON. Můžeme vytvářet prostředky (třeba vApp, sítě, VM, FW) a opakovat nasazení v různých prostředích s konzistentní konfigurací. Terraform porovná popis s aktuálním stavem a provede pouze nezbytné změny. Můžeme integrovat do CI/CD pipeline (DevOps procesů).
Terraform State
Pomocí Terraform můžeme definovat nové prostředky (objekty), které se po aplikaci vytvoří v infrastruktuře. Terraform ukládá stav (State) spravované infrastruktury a konfigurace do souboru terraform.tfstate. Používá se k mapování zdrojů deklarovaných v konfiguraci na skutečné objekty v cílové infrastruktuře. Obsahuje informace o identitách a atributech vytvořených prostředků. Pomocí stavu určuje Terraform rozdíly mezi aktuálním a žádaným stavem, které je potřeba aplikovat.

Terraform očekává, že je jediný, kdo vytváří (nebo ničí) objekty a ukládá jejich identitu do stavu. Takže existuje jednoznačné (jeden na jednoho) mapování mezi nakonfigurovanými instancemi zdrojů a vzdálenými objekty. Pokud to tak není, tak máme k dispozici příkazy pro obnovu stavu, import externě vytvořených objektů, zapomenutí objektů nebo základní úpravu stavu. To jsou pokročilejší operace, kterým se tento článek nevěnuje.
Stavový soubor je tedy důležitý a neměli bychom o něj přijít (pokud s Terraformem pracuje více lidí, tak bychom jej měli sdílet). Když objekt existuje ve stavovém souboru, ale nenachází se v konfiguraci, tak při aplikaci dojde k jeho odstranění. Pokud vytvoříme konfiguraci objektu (blok resource), který již existuje v infrastruktuře, ale informace o něm nemáme ve stavu, tak při aplikaci dojde k chybě.
Error: error creating vApp Demo-vApp: error executing task request: error instantiating a new vApp:: API Error: 400: [ ] The VMware Cloud Director entity Demo-vApp already exists.
Pozn.: Pokud v konfiguraci definujeme pouze nový objekt, který chceme v infrastruktuře vytvořit, tak Terraform pracuje pouze s ním a existující objekty infrastruktury ignoruje. Jinak řečeno pracuje se pouze s objekty popsanými v konfiguračních souborech.
Oficiální dokumentace
Instalace (na Windows)
Terraform CLI
Terraform můžeme provozovat na různém operačním systému jako Windows, macOS nebo Linux (či využít Windows Subsystem for Linux). Z oficiální stránky Install Terraform stáhneme poslední verzi (v době psaní článku 1.14.4). Na Windows jde o jeden EXE soubor, který uložíme někde na disku a ideálně přidáme jeho cestu do systémové proměnné prostředí PATH.
Ověřit verzi můžeme v příkazové řádce:
C:\>terraform -version Terraform v1.14.4 on windows_amd64
Microsoft Visual Studio Code (VS Code)
Jako editor pro Terraform (HCL) soubory se velmi často využívá Visual Studio Code. Existuje pro něj oficiální HashiCorp Terraform rozšíření. Zvýrazňuje syntaxi, má automatické doplňování, validaci atd. Instalaci stáhneme z oficiálních stránek Visual Studio Code.
Po instalaci a spuštění nainstalujeme rozšíření (v levém panelu klikneme na ikonu Extensions (Ctrl+Shift+X)):
- HashiCorp Terraform
- HashiCorp HCL
VMware Cloud Director Provider
Terraform využívá binární pluginy nazývané poskytovatelé (Providers) k interakci s cloudovými službami, SaaS a dalšími API. Terraform konfigurace musí deklarovat, které poskytovatele vyžaduje, aby je Terraform mohl nainstalovat a používat. HashiCorp udržuje Terraform Registry, odkud můžeme získat veřejné poskytovatele a moduly.
Existuje oficiální VMware Cloud Director Provider vmware/vcd. Aktuální verze 3.14 podporuje Cloud Director (VCD) verze 10.4, 10.5 a 10.6. Dokumentace VMware Cloud Director Provider 3.14. Umožňuje definovat Cloud Director infrastrukturu jako kód v konfiguračních souborech Terraform. Můžeme definovat prostředky, které se automatizovaně zřizují (provisioning) nebo odstraňují (deprovisioning).
Náš Terraform projekt pro VMware Cloud Director (VCD)
Terraform používá konfigurační soubory v HCL jazyce, což jsou textové soubory s příponou .tf. Když provádíme operace pomocí Terraform CLI, tak se načtou všechny konfigurační soubory z aktuálního adresáře a vyřeší se závislosti v naší konfiguraci. To umožňuje organizovat konfiguraci do více souborů, což je doporučeno. Pojmenování souborů a rozdělení obsahu záleží na nás. Určité příklady jsou v Terraform dokumentaci a tutoriálech.
Na disku vytvoříme složku pro náš VCD projekt (v příkladu jde o d:\VCD-terraform). Zde budeme vytvářet jednotlivé konfigurační soubory. Ve VS Code otevřeme vytvořenou složku pomocí File - Open Folder.
V našem příkladu budeme vytvářet soubory
terraform.tf- konfigurace Terrafomu a VMware Cloud Director Providervariables.tf- definice názvů proměnnýchterraform.tfvars- přiřazení hodnot proměnnýmoutput.tf- výpis informací o existujících objektech infrastrukturymain.tf- konfigurace prostředků, vytváření infrastrukturních objektů ve VCD

Konfigurace Terraformu a VCD poskytovatele
Vytvoříme soubor terraform.tf, do kterého vložíme konfiguraci samotného Terrafomu (blok terraform), včetně určení, jaké poskytovatele nainstalovat. Přidáme konfiguraci VMware Cloud Director poskytovatele (blok provider), kterou bychom mohli umístit i do jiného souboru.
# Version and providers requirement terraform { required_version = ">= 1.5.0" required_providers { vcd = { source = "vmware/vcd" version = "~> 3.14" } } } # Configure the VMware Cloud Director Provider provider "vcd" { user = var.vcd_user password = var.vcd_pass auth_type = "integrated" org = var.vcd_org vdc = var.vcd_vdc url = var.vcd_url max_retry_timeout = var.vcd_max_retry_timeout allow_unverified_ssl = var.vcd_allow_unverified_ssl logging = var.vcd_log logging_file = var.vcd_log_file }
Definice proměnných
V řadě případů (opakovaný údaj, znovupoužitelnost) se doporučuje do konfiguračních souborů nevkládat přímo hodnoty, ale využít proměnné. Ty musíme nejprve definovat a pak zadat jejich hodnotu. Proměnné jsme použili již v konfiguraci VCD poskytovatele. Pro definici si vytvoříme soubor variables.tf. V definici proměnné můžeme určit řadu parametrů, jako typ, validaci, popis, ale vše je volitelné.
Můžeme použít pouze prázdnou definici variable <LABEL> { }. Proměnné v konfiguraci odkazujeme pomocí var.<NAME>.
# Logging variable "vcd_log" { description = "Enable Logging" type = bool } variable "vcd_log_file" { description = "Logging File" type = string } # VMware Cloud Director variables variable "vcd_user" { description = "VCD username" type = string } variable "vcd_pass" { description = "VCD username password" type = string sensitive = true } variable "vcd_org" { description = "VMware Cloud Director Organization" type = string } variable "vcd_vdc" { description = "Virtual Data Center" type = string } variable "vcd_url" { description = "VCD API URL" type = string } variable "vcd_max_retry_timeout" { type = number } variable "vcd_allow_unverified_ssl" { description = "Allow unverified SSL" type = bool } variable "vcd_catalog_name" { description = "VCD Catalog" type = string } variable "vcd_template_name" { description = "Catalog Template" type = string }
Přiřazení hodnot proměnným
Přiřazení hodnot proměnným můžeme provést několika způsoby. Například pomocí parametru při volání Terraform CLI, využít proměnné prostředí nebo soubor s definicí proměnných. Zde použijeme soubor terraform.tfvars.
# Logging vcd_log = "false" vcd_log_file = "vcd-debug.log" # VMware Cloud Director Connection Variables vcd_org = "Firma" vcd_vdc = "Firma vDC" vcd_url = "https://server.domain.com/api" vcd_user = "test2" vcd_pass = "XXX" vcd_max_retry_timeout = "240" vcd_allow_unverified_ssl = false # Catalog vcd_catalog_name = "Firma_catalog" vcd_template_name = "template-Alma"
Připojení do VMware Cloud Director
Přihlašovací údaje
Pro připojení do VMware Cloud Director jsou potřeba credentials (přihlašovací údaje) s dostatečným oprávněním (rolí). To je samozřejmě velmi citlivá věc. Zde si ukazujeme nejjednodušší metodu speciálně vytvořený uživatel a zadání jména a hesla. Můžeme také využít Bearer nebo API token či SAML. Pokud údaje zadáme do souboru, tak tento soubor musíme chránit a neukládat jej do Gitu.
Alternativně můžeme proměnné (třeba heslo) zadávat při spuštění:
terraform apply -var vcd_pass = "XXX"
Parametry připojení
V tomto článku se připojujeme do určité organizace (tenantu) a určitého VDC. Nejsme Sys Admin spravující více organizací. Při konfiguraci prostředků můžeme určit Org a VDC. To dělat nebudeme, takže se použijí tyto nastavené hodnoty u poskytovatele.
V parametrech pro připojení k VMware Cloud Director musíme zadat správné údaje našeho prostředí. Na jaké adrese (URL) běží Cloud Director API pro připojení Terraformu. Název naší organizace a Virtual Data Center, ve kterém se budou API operace provádět. Název organizace nalezneme pod Administration - Settings - General - Organization name (ne Organization full name). Název vDC nalezneme pod Data Centers - naše vDC - Settings - General - Name.
V názvu organizace se rozlišují velká a malá písmena. Pokud nezadáme název správně, tak dostaneme chybu, že nebyla organizace nalezena.
Error: org FIrma not found: [ENF] entity not found
Pokud narazíme na problémy, tak můžeme v poskytovateli zapnout logování API volání (požadavky a odpovědi, plus debug) do souboru.
Inicializace Terraform workspace
Když máme připravenu základní Terraform konfiguraci, tak musíme poprvé provést inicializaci pracovního adresáře. Dojde ke stažení určeného poskytovatele. Inicializaci provedeme CLI příkazem terraform init, který musíme spustit v projektové složce. Ve VS Code můžeme využít terminál (zobrazení View - Terminal).
PS D:\VCD-terraform> terraform init Initializing the backend... Initializing provider plugins... - Finding vmware/vcd versions matching "~> 3.14"... - Installing vmware/vcd v3.14.1... - Installed vmware/vcd v3.14.1 (signed by a HashiCorp partner, key ID 8BF53DB49CDB70B0) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://developer.hashicorp.com/terraform/cli/plugins/signing Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.
Ověření konfigurace
Můžeme provést ověření syntaxe a vnitřní konzistence naší konfigurace. Nedochází ke spuštění, ale pouze kontrole kódu.
PS D:\VCD-terraform> terraform validate Success! The configuration is valid.
VMware Cloud Director Resources (prostředky / zdroje / objekty)
Prostředek (Resource) je jakýkoliv objekt infrastruktury, který chceme vytvořit nebo spravovat. Druhy prostředků závisí na nainstalovaných poskytovatelích (Providers). V každém prostředku můžeme použít různé argumenty, které definují jeho vlastnosti.
VMware Cloud Director Provider nabízí řadu prostředků (detailní popis nalezneme v dokumentaci), například:
Zjištění informací o existujících objektech (prostředcích)
Zdroje dat (Data Sources) načítají data od poskytovatele, ale nevytváří ani nemění prostředky. Používá se blok data <TYPE> <LABEL>. Type určuje typ zdroje dat (prostředku). Label určuje jméno objektu (štítek). Můžeme pak odkazovat na načtená data pomocí data.<type>.<label>.<attribute>. Uvnitř bloku musíme použít (v našich příkladech) minimálně argument name, kde určíme název prostředku daného typu.
Načtené (nebo nakonfigurované) informace můžeme zobrazit v příkazové řádce pomocí bloku output <LABEL>. Pomocí povinného argumentu value určíme vrácenou hodnotu (může být vypočtena). My se zde odkazujeme na načtený objekt a můžeme jej zobrazit celý nebo některý jeho atribut.
Pro příklad vytvoříme soubor output.tf (ten se běžně používá jako výstup pro moduly), kde načteme informace o vApp Demo-vApp a zobrazíme seznam jmen VM, která se v ní nachází.
# read vApp details data "vcd_vapp" "my-vapp" { name = "Demo-vApp" } # display vApp details output "vapp-details" { value = data.vcd_vapp.my-vapp.vm_names }
Vyhodnocení konfigurace (terraform plan) - načtení a zobrazení dat
Když máme připravenou konfiguraci (ať načítání zdrojů dat nebo vytváření prostředků), tak je další krok použít Terraform CLI příkaz terraform plan. Ten vyhodnotí konfiguraci a určí požadovaný stav všech deklarovaných prostředků. Poté porovná tento stav se skutečnými objekty infrastruktury. A zobrazí popis změn k dosažení požadovaného stavu. Neprovádí žádné změny infrastruktury, pouze předkládá plán změn.
Pokud existují výstupní hodnoty (blok output), tak se díky terraform plan zobrazí (reportují).
PS D:\VCD-terraform> terraform plan
data.vcd_vapp.my-vapp: Reading...
data.vcd_vapp.my-vapp: Read complete after 3s [id=urn:vcloud:vapp:8855943a-e16a-416e-bae5-0fd1dfc251e3]
Changes to Outputs:
+ vApp-details = [
+ "Demo-VM",
]
You can apply this plan to save these new output values to the Terraform state, without changing any real infrastructure.
-------------------------------------------------------------------------------------------------------------------------
Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run
"terraform apply" now.
Můžeme také použít příkaz terraform apply. Pokud v konfiguraci nemáme nové prostředky (blok resource), tak se pouze uloží tyto hodnoty (načtené a výstupy) do stavu (State). Nedochází ke změně infrastruktury.
PS D:\VCD-terraform> terraform apply
data.vcd_vapp.my-vapp: Reading...
data.vcd_vapp.my-vapp: Read complete after 2s [id=urn:vcloud:vapp:8855943a-e16a-416e-bae5-0fd1dfc251e3]
Changes to Outputs:
+ vApp-details = [
+ "Demo-VM",
]
You can apply this plan to save these new output values to the Terraform state, without changing any real infrastructure.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
vApp-details = tolist([
"Demo-VM",
])
Uložené výstupy (do State) můžeme zobrazit pomocí terraform output.
PS D:\VCD-terraform> terraform output vApp-details = tolist([ "Demo-VM", ])
Vytvoření nových objektů (provisioning infrastructure)
Pro konfiguraci prostředků se využívá blok resource <TYPE> <LABEL>. Musíme určit typ prostředku (Type) od našeho poskytovatele. A unikátní jméno prostředku - štítek objektu (Label), který se používá ke sledování prostředku ve stavovém souboru. V konfiguraci můžeme odkazovat na prostředek pomocí <type>.<label>.<attribute>. Uvnitř bloku resource konfigurujeme argumenty daného prostředku.
V našem projektu vytvoříme soubor main.tf, do kterého vložíme různé konfigurační bloky pro různé objekty.
Vytvoření nové vApp
Nakonfigurujeme novou vApp Demo-vApp.
# create vApp
resource "vcd_vapp" "Demo" {
name = "Demo-vApp"
}
Připojení sítě
Do vApp připojíme existující síť organizace Demo_net. Nastavujeme závislost, že se nejprve musí dokončit vApp, než Terraform začne pracovat na síti.
# add vApp network attached to existing Org network
resource "vcd_vapp_org_network" "vappOrgNet" {
vapp_name = vcd_vapp.Demo.name
org_network_name = "Demo_net"
depends_on = [ vcd_vapp.Demo ]
}
Načtení šablony
Zjistíme informace o našem katalogu a v něm nalezneme určitou šablonu, z které budeme vytvářet VM.
# read Catalog data "vcd_catalog" "my-catalog" { name = var.vcd_catalog_name } # read Catalog Template data "vcd_catalog_vapp_template" "my-vapp-template" { catalog_id = data.vcd_catalog.my-catalog.id name = var.vcd_template_name }
Vytvoření VM ze šablony
Vytvoříme VM z předem určené šablony. Definujeme jeho parametry (po vytvoření dojde k aktualizaci). Přiřazujeme síť s manuálně zadanou IP adresou (musí spadat do daného rozsahu). Po vytvoření VM automaticky nastartuje (můžeme změnit argumentem power_on).
# create VM from template wtih manual IP assignment
resource "vcd_vapp_vm" "DemoVM" {
vapp_name = vcd_vapp.Demo.name
name = "Demo-VM"
computer_name = "Demo-VM"
vapp_template_id = data.vcd_catalog_vapp_template.my-vapp-template.id
memory = 2048
cpus = 2
cpu_cores = 1
depends_on = [ vcd_vapp_org_network.vappOrgNet ]
network {
type = "org"
name = vcd_vapp_org_network.vappOrgNet.org_network_name
ip_allocation_mode = "MANUAL"
ip = "172.30.21.100"
is_primary = true
}
}
Aplikace změn konfigurace (terraform apply)
Poslední krok je (provedení) aplikace změn dle Terraform plánu, tedy vlastní vytvoření nebo změna objektů (nebo rušení) podle naší konfigurace.
Důležitá jsou oprávnění uživatele, kterým se připojujeme do Cloud Director (VCD). Když třeba nechceme použít roli Organization Administrator. Zkoušel jsem vApp Author, který mohl vytvořit vApp, ale nedokázal načíst katalog (i když ta práva by měl mít). Zobrazovala se chyba
Error: [catalog read DS] error retrieving catalog Firma_catalog: [ENF] entity not found - no records found for catalog 'Firma_catalog' in org 'Firma'
Pozn.: Před aplikací můžeme nejprve použít Terraform CLI příkaz terraform plan a zkontrolovat výstup.
Pro provedení operací navržených Terraform plánem se používá Terraform CLI příkaz terraform apply. Příkaz vytvoří plán provedení, vyzve nás k odsouhlasení tohoto plánu (zadáme yes) a provede uvedené operace.

PS D:\VCD-terraform> terraform apply
data.vcd_catalog.my-catalog: Reading...
data.vcd_catalog.my-catalog: Read complete after 3s [id=urn:vcloud:catalog:e9e5c417-cfbc-4d4d-8136-6623b8615d6d]
data.vcd_catalog_vapp_template.my-vapp-template: Reading...
data.vcd_catalog_vapp_template.my-vapp-template: Read complete after 3s [id=urn:vcloud:vapptemplate:22ad75a3-bb77-4c36-8cee-8faf7
8b60a03]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following
symbols:
+ create
Terraform will perform the following actions:
# vcd_vapp.Demo will be created
+ resource "vcd_vapp" "Demo" {
+ href = (known after apply)
+ id = (known after apply)
+ inherited_metadata = (known after apply)
+ metadata = (known after apply)
+ name = "Demo-vApp"
+ power_on = false
+ status = (known after apply)
+ status_text = (known after apply)
+ vapp_network_names = (known after apply)
+ vapp_org_network_names = (known after apply)
+ vm_names = (known after apply)
+ lease (known after apply)
+ metadata_entry (known after apply)
}
# vcd_vapp_org_network.vappOrgNet will be created
+ resource "vcd_vapp_org_network" "vappOrgNet" {
+ id = (known after apply)
+ is_fenced = false
+ org_network_name = "Demo_net"
+ reboot_vapp_on_removal = false
+ retain_ip_mac_enabled = false
+ vapp_name = "Demo-vApp"
}
# vcd_vapp_vm.DemoAS will be created
+ resource "vcd_vapp_vm" "DemoVM" {
+ accept_all_eulas = true
+ computer_name = "DemoVM"
+ consolidate_disks_on_create = false
+ cpu_cores = 1
+ cpu_hot_add_enabled = false
+ cpu_limit = (known after apply)
+ cpu_priority = (known after apply)
+ cpu_reservation = (known after apply)
+ cpu_shares = (known after apply)
+ cpus = 2
+ description = (known after apply)
+ expose_hardware_virtualization = false
+ extra_config = (known after apply)
+ firmware = (known after apply)
+ hardware_version = (known after apply)
+ href = (known after apply)
+ id = (known after apply)
+ imported = (known after apply)
+ inherited_metadata = (known after apply)
+ internal_disk = (known after apply)
+ memory = 2048
+ memory_hot_add_enabled = false
+ memory_limit = (known after apply)
+ memory_priority = (known after apply)
+ memory_reservation = (known after apply)
+ memory_shares = (known after apply)
+ metadata = (known after apply)
+ name = "DemoVM"
+ os_type = (known after apply)
+ placement_policy_id = (known after apply)
+ power_on = true
+ prevent_update_power_off = false
+ security_tags = (known after apply)
+ sizing_policy_id = (known after apply)
+ status = (known after apply)
+ status_text = (known after apply)
+ storage_profile = (known after apply)
+ vapp_id = (known after apply)
+ vapp_name = "Demo-vApp"
+ vapp_template_id = "urn:vcloud:vapptemplate:22ad75a3-bb77-4c36-8cee-8faf78b60a03"
+ vm_type = (known after apply)
+ boot_options (known after apply)
+ customization (known after apply)
+ metadata_entry (known after apply)
+ network {
+ adapter_type = (known after apply)
+ connected = true
+ ip = "172.30.21.100"
+ ip_allocation_mode = "MANUAL"
+ is_primary = true
+ mac = (known after apply)
+ name = "Demo_net"
+ secondary_ip = (known after apply)
+ secondary_ip_allocation_mode = (known after apply)
+ type = "org"
}
}
Plan: 3 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
vcd_vapp.Demo: Creating...
vcd_vapp.Demo: Creation complete after 6s [id=urn:vcloud:vapp:8855943a-e16a-416e-bae5-0fd1dfc251e3]
vcd_vapp_org_network.vappOrgNet: Creating...
vcd_vapp_org_network.vappOrgNet: Creation complete after 5s [id=urn:vcloud:network:3be9573d-b435-4f73-ad36-734aa010e910]
vcd_vapp_vm.DemoAS: Creating...
vcd_vapp_vm.DemoAS: Still creating... [00m10s elapsed]
vcd_vapp_vm.DemoAS: Still creating... [00m20s elapsed]
vcd_vapp_vm.DemoAS: Still creating... [00m30s elapsed]
vcd_vapp_vm.DemoAS: Still creating... [00m40s elapsed]
vcd_vapp_vm.DemoAS: Still creating... [00m50s elapsed]
vcd_vapp_vm.DemoAS: Still creating... [01m00s elapsed]
vcd_vapp_vm.DemoAS: Still creating... [01m10s elapsed]
vcd_vapp_vm.DemoAS: Still creating... [01m20s elapsed]
vcd_vapp_vm.DemoAS: Still creating... [01m30s elapsed]
vcd_vapp_vm.DemoAS: Still creating... [01m40s elapsed]
vcd_vapp_vm.DemoAS: Creation complete after 1m46s [id=urn:vcloud:vm:c33102c0-77d0-4455-a220-df52dcf19658]
Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

Pro terraform apply a terraform plan můžeme použít řadu parametrů, které ovlivní jeho chování. Třeba přeskočit automatické obnovení stavu.
terraform apply -refresh=false
Nebo omezit počet souběžných operací (výchozí hodnota je 10).
terraform apply -parallelism=1
Zrušení objektů (terraform destroy)
Pokud provádíme testování či vývoj, tak můžeme chtít vytvořené objekty zase zrušit (deprovision). V Terraform CLI máme k dispozici příkaz terraform destroy (reálně se použije terraform apply -destroy), který smaže všechny objekty spravované Terraform konfigurací.
Pozn.: Můžeme použít také terraform plan -destroy.
Standardně se nepovede odebrání vApp sítě z vApp, pokud vApp běží, a pak ani nedojde ke smazání vApp. V konfiguraci sítě (vcd_vapp_org_network) můžeme povolit vypnutí nadřazené vApp pro odstranění sítě pomocí:
reboot_vapp_on_removal = true
Zatím zde nejsou žádné komentáře.