Pozn.: Popis v článku vychází z Terraform verze 1.14.4, VMware Cloud Director Provider verze 3.14 a VMware Cloud Director 10.6.
Existující objekty a Terraform
Terraform může pracovat s objekty, které má definované v konfiguraci (blok resource) a uložené ve stavovém (State) souboru. Pokud neexistují ve State, tak se je pokusí vytvořit.
V naší infrastruktuře může existovat řada prostředků, které nebyly vytvořeny pomocí Terraformu. Buď byly vytvořeny dříve, než jsme Terraform začali používat nebo později vznikly jiným způsobem (třeba i klonováním vApp). Pokud nechceme měnit atributy existujících objektů, tak je nepotřebujeme mít spravované Terrafomem.
Pokud chceme nějaké informace pouze načíst, tak můžeme využít datové zdroje (blok data). Načtená data můžeme odkazovat v kódu, ale nemůžeme provádět žádné jejich změny (jsou pouze pro čtení).
Pokud chceme provést změny na existujících objektech, které Terraform nezná, tak je musíme importovat. Potřebujeme získat jejich konfiguraci a data ve State.
Import pomocí Terraform CLI
Nejstarší možnost je využít Terraform CLI příkaz terraform import. Musíme vytvořit konfiguraci prostředku (blok resource) a příkaz následně provede import do State. Je vhodné spíše pro import jednoho objektu. V příkazu musíme použít řadu parametrů. Je to komplikované a málo efektivní.
Import pomocí HCL
Pro import existujících infrastrukturních prostředků do Terraform můžeme ručně vytvořit blok import. K němu potřebujeme také blok resource. Můžeme jej vytvořit ručně nebo alternativně nechat vygenerovat pomocí terraform plan -generate-config-out. Do stavového souboru se ukládají všechny atributy prostředku, ale není nutné je všechny definovat v bloku resource.
Další možnosti popisuje Import existing resources in bulk.
Obecný postup
- definujeme konfiguraci (blok
resource) pro každý prostředek, který chceme importovat - přidáme odpovídající blok
importpro každý prostředek, který chceme importovat - spustíme
terraform plana ověříme importní plán - spustíme
terraform applypro import prostředků a aktualizaci Terraform State (musí docházet pouze k importu, a ne vytváření prostředků) - můžeme odstranit blok
importz konfigurace (i když opakované spuštění neprovádí znovu import)
Blok import
Musíme zadat adresu cílového prostředku (to), která je tvořena typem zdroje a štítkem (jak prostředek odkazujeme v konfiguraci). Stejnou pro kterou máme připravený blok resource. A identitu existujícího prostředku (id), která závisí na poskytovateli. Pro VMware Cloud Director je to jakási cesta tvořená názvy komponent, například pro VM Org.vDC.vApp.VM.
import {
to = TYPE.LABEL
id = "<RESOURCE-ID>"
}
Pro import více objektů (instancí) stejného typu můžeme využít meta-argumenty for_each a count v cílovém resource.
Generování konfigurace
Pozn.: Tato funkce je v Terraformu od verze 1.5, ale stále je označena jako experimentální.
Terraform generuje kód pro prostředky, které definujeme v blocích import, a ještě neexistují v naší konfiguraci. Vytváří se HCL, které obsahuje nejlepší odhad Terraformu ohledně vhodné hodnoty pro každý argument prostředku. Doporučuje se generovaný obsah projít a upravit (odebrat některé argumenty, opravit hodnoty apod).
Pro vygenerování konfigurace se používá Terraform CLI příkaz s parametrem, kde zadáme jméno nového souboru (cestu) kam se konfigurace uloží.
terraform plan -generate-config-out="generated_resources.tf"
Problém se zadáním parametru
Když jsem spouštěl Terraform CLI z terminálu ve Visual Studio Code (což znamená v rámci PowerShell), tak jsem dostával chybu.
PS D:\VCD-terraform> terraform plan -generate-config-out=generated.tf - Error: Too many command line arguments - - To specify a working directory for the plan, use the global -chdir flag. For more help on using this command, run: terraform plan -help
Řešení je zadat parametr s dvěma pomlčkami --.
PS D:\VCD-terraform> terraform plan --generate-config-out=generated.tf
Datový zdroj vcd_resource_list
VMware Cloud Director poskytovatel nabízí speciální datový zdroj (Data Source) vcd_resource_list. Ten umožňuje načíst seznam existujících prostředků určitého typu a reprezentovat je v různých formátech. Jedna z možností je vygenerovat importní soubor.
data "vcd_resource_list" "list_of_nets" {
name = "list_of_nets"
resource_type = "network"
list_mode = "import"
import_file_name = "network-import.tf"
}
Import všech existujících VM z dané vApp
Uvedeme si příklad, který ukazuje co nejvíce automatizované řešení importu všech existujících VM ze zadané vApp.
Jednotlivé kroky
- vytvoříme soubor
import.tfs datovým zdrojemvcd_resource_list - použijeme Terraform CLI příkaz
terraform plana dojde k vygenerování importního souboruimport-vms_from_vapp.tf - použijeme Terraform CLI příkaz
terraform plan --generate-config-out=generated.tfa dojde k vygenerování konfiguračního souborugenerated.tf - použijeme Terraform CLI příkaz
terraform applya dojde k importu do stavového souboru - můžeme odstranit soubor
import.tfaimport-vms_from_vapp.tf - můžeme použít Terraform CLI příkaz
terraform plan, abychom ověřili, že infrastruktura odpovídá konfiguraci, a tedy import proběhl korektně - můžeme upravit konfiguraci a aplikovat změny, pokud chceme provádět operace postupně (ve výchozím stavu se provádí 10 operací souběžně), tak můžeme použít
terraform apply -parallelism=1

Soubor Import.tf
V našem Terraform projektu potřebuje základní konfiguraci pro připojení k poskytovateli VMware Cloud Director. Vytvoříme soubor, který zde pojmenujeme import.tf, do něj zadáme konfiguraci vcd_resource_list. Důležitý je typ prostředku (VM), jméno rodiče (vApp), importní mód a název souboru pro uložení importních bloků.
data "vcd_resource_list" "import_vms_from_vapp" {
name = "import_vms_from_vapp"
resource_type = "vcd_vapp_vm"
parent = "Demo-vApp"
list_mode = "import"
import_file_name = "import-vms_from_vapp.tf"
}
Vygenerování importního souboru
Když máme připravený datový zdroj, tak stačí použít Terraform CLI příkaz pro vygenerování importního souboru.
PS D:\VCD-terraform> terraform plan data.vcd_resource_list.import_vms_from_vapp: Reading... data.vcd_resource_list.import_vms_from_vapp: Read complete after 6s [id=import_vms_from_vapp] No changes. Your infrastructure matches the configuration. Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.
V aktuálním adresáři nalezneme vytvořený soubor import-vms_from_vapp.tf a jeho obsah může vypadat zhruba následně.
import {
to = vcd_vapp_vm.Demo-VM-2537464da65e
id = "Firma.Firma vDC.Demo-vApp.Demo-VM"
}
import {
to = vcd_vapp_vm.Next-VM-36979c7d5244
id = "Firma.Firma vDC.Demo-vApp.Next-VM"
}
Vygenerování konfiguračního souboru
V dalším kroku využijeme importní soubor a necháme vygenerovat konfiguraci k jednotlivým objektům.
PS D:\VCD-terraform> terraform plan --generate-config-out=generated.tf
data.vcd_resource_list.import_vms_from_vapp: Reading...
vcd_vapp_vm.Next-VM-36979c7d5244: Preparing import... [id=Firma.Firma vDC.Demo-vApp.Next-VM]
vcd_vapp_vm.Demo-VM-2537464da65e: Preparing import... [id=Firma.Firma vDC.Demo-vApp.Demo-VM]
vcd_vapp_vm.Demo-VM-2537464da65e: Refreshing state... [id=urn:vcloud:vm:4415c19d-a813-40ca-b2a3-2537464da65e]
vcd_vapp_vm.Next-VM-36979c7d5244: Refreshing state... [id=urn:vcloud:vm:da0d2be9-3117-464e-88ab-36979c7d5244]
data.vcd_resource_list.import_vms_from_vapp: Read complete after 5s [id=import_vms_from_vapp]
Terraform will perform the following actions:
# vcd_vapp_vm.Demo-VM-2537464da65e will be imported
# (config will be generated)
resource "vcd_vapp_vm" "Demo-VM-2537464da65e" {
...
Plan: 2 to import, 0 to add, 0 to change, 0 to destroy.
- Warning: Config generation is experimental
-
- Generating configuration during import is currently experimental, and the generated configuration format may change in future
versions.
----------------------------------------------------------------------------------
Terraform has generated configuration and written it to generated.tf. Please review the configuration and edit it as necessary
before adding it to version control.
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.
V aktuálním adresáři nalezneme vytvořený soubor generated.tf, který obsahuje resource bloky pro jednotlivé VM s kompletními argumenty.
Import do stavového souboru
Na závěr aplikujeme změny, kdy se využijí společné bloky import a resource a dojde k importu prostředků.
PS D:\VCD-terraform> terraform apply
vcd_vapp_vm.Demo-VM-2537464da65e: Preparing import... [id=Firma.Firma vDC.Demo-vApp.Demo-VM]
vcd_vapp_vm.Next-VM-36979c7d5244: Preparing import... [id=Firma.Firma vDC.Demo-vApp.Next-VM]
data.vcd_resource_list.import_vms_from_vapp: Reading...
vcd_vapp_vm.Demo-VM-2537464da65e: Refreshing state... [id=urn:vcloud:vm:4415c19d-a813-40ca-b2a3-2537464da65e]
vcd_vapp_vm.Next-VM-36979c7d5244: Refreshing state... [id=urn:vcloud:vm:da0d2be9-3117-464e-88ab-36979c7d5244]
data.vcd_resource_list.import_vms_from_vapp: Read complete after 5s [id=import_vms_from_vapp]
Terraform will perform the following actions:
# vcd_vapp_vm.Demo-VM-bb229083e6ec will be imported
resource "vcd_vapp_vm" "Demo-VM-bb229083e6ec" {
...
Plan: 2 to import, 0 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_vm.Next-VM-36979c7d5244: Importing... [id=Firma.Firma vDC.Demo-vApp.Next-VM]
vcd_vapp_vm.Next-VM-36979c7d5244: Import complete [id=Firma.Firma vDC.Demo-vApp.Next-VM]
vcd_vapp_vm.Demo-VM-2537464da65e: Importing... [id=Firma.Firma vDC.Demo-vApp.Demo-VM]
vcd_vapp_vm.Demo-VM-2537464da65e: Import complete [id=Firma.Firma vDC.Demo-vApp.Demo-VM]
Apply complete! Resources: 2 imported, 0 added, 0 changed, 0 destroyed.
Zatím zde nejsou žádné komentáře.