CZ 
09.03.2026 Františka VÍTEJTE V MÉM SVĚTĚ

An English translation is available for this article. Pro tento článek je dostupný anglický překlad.
Terraform and VMware Cloud Director - Importing Existing Resources (VMs)

Terraform a VMware Cloud Director - import existujících prostředků (VM)

| Petr Bouška - Samuraj |
Princip Terraformu je takový, že vytváří (nebo ničí) definované objekty. Informace si uloží do stavového souboru (State) a díky tomu zjišťuje rozdíl mezi aktuálním a požadovaným stavem. Takto vytvořené prostředky můžeme upravovat nebo rušit změnou konfigurace. Pokud chceme pomocí Terraformu provést úpravu prostředků, které byly vytvořeny jiným způsobem, tak musíme provést jejich import do Terraformu. Což není úplně jednoduché. V příkladu budeme importovat všechna VM z určité vApp.
zobrazeno: 290x (169 CZ, 121 EN) | Komentáře [0]

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 import pro každý prostředek, který chceme importovat
  • spustíme terraform plan a ověříme importní plán
  • spustíme terraform apply pro import prostředků a aktualizaci Terraform State (musí docházet pouze k importu, a ne vytváření prostředků)
  • můžeme odstranit blok import z 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.tf s datovým zdrojem vcd_resource_list
  • použijeme Terraform CLI příkaz terraform plan a dojde k vygenerování importního souboru import-vms_from_vapp.tf
  • použijeme Terraform CLI příkaz terraform plan --generate-config-out=generated.tf a dojde k vygenerování konfiguračního souboru generated.tf
  • použijeme Terraform CLI příkaz terraform apply a dojde k importu do stavového souboru
  • můžeme odstranit soubor import.tf a import-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
Visual Studio Code - Terraform project - import resources

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.

Související články:

Infrastruktura jako kód - Terraform

Nástroje typu Infrastructure as Code (IaC) umožňují definovat, nasazovat a spravovat infrastrukturu deklarativním (nebo imperativním) způsobem pomocí konfiguračních souborů. Prostředky (servery, sítě, úložiště apod.) popíšeme v textovém souboru, který definuje požadovaný stav. Nástroj zajistí, že reálné prostředí odpovídá definici. Zatím se budeme věnovat nástroji Terraform.

Virtualizace

Články z populárních témat o virtualizace serverů a stanic.

Pokud se chcete vyjádřit k tomuto článku, využijte komentáře níže.

Komentáře

Zatím zde nejsou žádné komentáře.

Přidat komentář

Vložit tag: strong em link

Nápověda:
  • maximální délka komentáře je 2000 znaků
  • HTML tagy nejsou povoleny (budou odstraněny), použít se mohou pouze speciální tagy (jsou uvedeny nad vstupním polem)
  • nový řádek (ENTER) ukončí odstavec a začne nový
  • pokud odpovídáte na jiný komentář, vložte na začátek odstavce (řádku) číslo komentáře v hranatých závorkách