Mi az a Terraform?
A Terraform nyílt forráskódú, platformfüggetlen infrastruktúra-automatizálási eszköz. Segítségével egy konfigurációs fájl alapján gyorsan és automatikusan telepíthető lehet egy komplex infrastruktúra minden eleme. forrás
Mire jó ez nekünk?
- segítségével menedzselhetjük a fizikai/virtuális/felhős szervereinket
- mindezt néhány fájl segítségével, kódként tudjuk definiálni
- amit git repóban tárolhatunk, hogy nyomon követhető legyen a változás
Mi a helyzet a Terraform BSL licencével?
Pontosan két éve jelentették be, hogy licencet váltanak, és az új BSL licenc rendelkezik néhány korlátozással, ami miatt bizonyos körülmények esetén már nem használhatod ingyen a terméket. Én nem vagyok licenc szakértő, épp ezért (is) használok nyílt forráskódú szoftvereket.
A közösség felháborodását tettek követték, ezért forkolták a Terraformot, ebből lett az OpenTofu. Ez a szoftver az ígéretek szerint örökké nyílt forráskódú marad! Majdnem tökéletesen megegyezik a két szoftver.
Mire lesz szükségünk a kipróbáláshoz?
- legalább egy Proxmox szerverre (én a 8.4.x-es verzión fogok demózni, a bemutatott provider még nem ismeri a 9.0-t!)
- biztonsági okokból egy dedikált felhasználóra a Proxmoxon
- vagy a terraform vagy az opentofu binárisokra (én az opentofut fogom bemutatni a fentebb említett licence problémák miatt)
Hogy néz ki a labor környezetem?
- adott a munkaállomásom, ha külön nem jelzem, minden parancsot itt fogok kiadni
- van egy pveteszt nevű Proxmox szerverem, az IP címe: 192.168.122.122
- készítek egy Debian12 templétet
- készítek egy Debian13 templétet
- létre fogunk hozni egy tf-dci12-vm1 nevű virtuális szervert, 1 VCPU, 1 GB RAM, 4 GB HDD, 1 GB swap, Debian12 alapon, az IP címe: 192.168.122.12
- létre fogunk hozni egy tf-dci13-vm2 nevű virtuális szervert, 2 VCPU, 1 GB RAM, 5 GB HDD, 1 GB swap, Debian13 alapon, az IP címe: 192.168.122.13
Telepítsük az OpenTofut a munkaállomásunkra
Szokás szerint nálam ez egy Fedora Linux lesz.
$ sudo dnf install opentofu -y
Ha Te más disztrót használsz, nagy eséllyel ugyanezen néven fogod megtalálni, ha mégsem, itt a telepítési leírás.
Hozzunk létre egy dedikált felhasználót a Proxmox szerverünkön
Lépjünk be a webes felületre, és keressük meg a shell menüpontot, vagy lépjünk be ssh-n, a parancsok ugyanúgy fognak működni mindkét módszerrel…
Ha bizonytalan vagy a másolásokkal, ne aggódj, ezeket a parancsokat betettem egy scriptbe (useradd.sh), amit megtalálsz a git repó proxmox mappájában.
root@pveteszt:~# pveum role add TerraformRole -privs "Datastore.AllocateSpace Datastore.Audit Pool.Allocate Sys.Audit Sys.Console Sys.Modify VM.Allocate VM.Audit VM.Clone VM.Config.CDROM VM.Config.Cloudinit VM.Config.CPU VM.Config.Disk VM.Config.HWType VM.Config.Memory VM.Config.Network VM.Config.Options VM.Migrate VM.Monitor VM.PowerMgmt SDN.Use"
root@pveteszt:~# pveum user add terraform@pve
root@pveteszt:~# pveum aclmod / -user terraform@pve -role TerraformRole
root@pveteszt:~# pveum user token add terraform@pve tf --privsep 0
┌──────────────┬──────────────────────────────────────┐
│ key │ value │
╞══════════════╪══════════════════════════════════════╡
│ full-tokenid │ terraform@pve!tf │
├──────────────┼──────────────────────────────────────┤
│ info │ {"privsep":"0"} │
├──────────────┼──────────────────────────────────────┤
│ value │ ae4bf754-670d-48e0-b799-420fe79c0d77 │
└──────────────┴──────────────────────────────────────┘
A value értékét tedd félre, később szükség lesz rá! Az általam bemutatott nálad nem fog működni :-), csak azért mutattam meg, hogy tudd, mit kell később bemásolni.
Egyéb előkészület a Proxmox szerveren
A webes felületen keressük meg a Datacenter/Storage menüpontot, szerkesszük a local storage-ot, kattintsuk be a Disk image és Snippets lehetőségeket.

Az OpenTofu használat közben
Hogy ne kelljen minden fájlt másolgatnod, mindent felraktam a git szerveremre, amit így tudsz letölteni parancssorból:
$ git clone https://git.msandor.hu/demo/terraform.git
Lépj be a letöltött mappába:
$ cd terraform
Ezeket a fájlokat/mappákat fogod benne találni:
.
├── LICENSE
├── main.tf
├── proxmox
│ ├── cloud12.sh
│ ├── cloud13.sh
│ ├── setup-vm.yml
│ └── useradd.sh
├── README.md
├── terraform.tfvars
├── variables.tf
├── vm1.tf
└── vm2.tf
Mik ezek a fájlok?
A proxmox mappában 4 fájl van, ezeket másoljuk át a proxmox szerverre:
$ scp proxmox/cloud1*.sh proxmox/useradd.sh root@192.168.122.122:
$ scp proxmox/setup-vm.yml root@192.168.122.122:/var/lib/vz/snippets/
Lépjünk be a proxmox szerverünkre webshellel, vagy ssh-n, és adjuk ki ezeket a parancsokat:
root@pveteszt:~# ./cloud12.sh; ./cloud13.sh
Mit csinálnak ezek a scriptek?
- letöltik a debian12(13) cloud-init fájlokat
- létrehoznak 1-1 virtuális szervert
- beállítják templét típusúnak

Végeztünk is a proxmox szerverrel, nincs más teendőnk, térjünk vissza a munkaállomásunk konzoljára.
Láthatjátok, hogy a két templét azonosítója (ID) 912, és 913, nagy eséllyel nincs ilyen azonosítójú vm/lxc a szervereden, ha mégis, módosítsd a cloud12(13).sh tartalmát egy biztosan használaton kívüli számra!
A többi fájlt az OpenTofu fogja használni. Ez akár egyetlen fájl is lehetne, de szebb így, hogy logikailag különválasztottam őket.
Rövid bemutató:
- main.tf: ez a fő fájlunk, ebben definiáltam a providert
- README.md: rövid leírás a git repó tartalmáról
- terraform.tfvars: normál esetben csak ezt kell módosítanod!
- variables.tf: ez hozza létre az előző fájl változóit
- vm1.tf: az 1. virtuális szerverünk definíciója
- vm2.tf: a 2. virtuális szerverünk definíciója
Az OpenTofuval 3+1 parancsot fogunk kiadni (többet is tud 🙂 , de ezzel lefedjünk az igényeinket):
Első alkalommal:
$ tofu init
Ha idővel frissül a provider, akkor a verzió szám módosítása után adjuk ki az alábbi parancsot:
$ tofu init -upgrade
Most nyisd meg szerkesztésre a terraform.tfvars fájlt, és a saját környezetednek megfelelően módosítsd a tartalmát. Ha mindent úgy csináltál, ahogy írtam, akkor az első sikeres telepítéshez ezeket a változókat kell módosítanod:
- pm_api_url: az proxmoxod IP címe
- pm_api_token_secret: az a bizonyos value érték amit felírtál (ugye?)
- pm_target_node: a proxmox szervered neve
- nameserver: a hálózatod DNS szervere (ha több is van, szóközzel válaszd el őket)
- searchdomain: ha rövid névre keresel, ezt a domain nevet teszi mögé
- netmask: ha esetleg nem /24 nálad
- gateway: a hálózatod átjárója
- ciuser: ezzel fogsz tudni belépni a szerverekre, neki lesz sudo joga is
- ssh_keys: a munkaállomásod publikus kulcsa
- vm1_state|vm2_state: started vagy running vagy stopped. A runnig/stopped egyértelmű, minden futtatáskor erre állítja be a VM-ek állapotát. A started esetén nem változtat rajta!
- a többi már gép specifikus, pl: vm1_ip-t állítsd be kedvedre
Ha jól dolgoztál, akkor kérjük le a „tervet”:
$ tofu plan
Szerencsés esetben nem kapsz hibaüzenetet, hanem egy ehhez hasonló kimenetet:
OpenTofu used the selected providers to generate the following execution plan. Resource actions are indicated with the following
symbols:
+ create
OpenTofu will perform the following actions:
# proxmox_vm_qemu.vm1 will be created
+ resource "proxmox_vm_qemu" "vm1" {
+ additional_wait = 5
+ agent = 1
+ agent_timeout = 90
+ automatic_reboot = true
+ balloon = 0
+ bios = "seabios"
+ boot = "order=scsi0"
+ bootdisk = "scsi0"
+ cicustom = "vendor=local:snippets/setup-vm.yml"
+ ciupgrade = true
+ ciuser = "msandor"
+ clone = "debian12-cloudinit"
+ clone_wait = 10
+ current_node = (known after apply)
+ default_ipv4_address = (known after apply)
+ default_ipv6_address = (known after apply)
+ define_connection_info = true
+ description = (known after apply)
+ force_create = false
+ full_clone = true
+ hotplug = "network,disk,usb"
+ id = (known after apply)
+ ipconfig0 = "ip=192.168.122.12/24,gw=192.168.122.1"
+ kvm = true
+ linked_vmid = (known after apply)
+ memory = 1024
+ name = "tf-dci12-vm1"
+ nameserver = "192.168.122.1"
+ onboot = false
+ os_type = "cloud-init"
+ protection = false
+ reboot_required = (known after apply)
+ scsihw = "virtio-scsi-single"
+ searchdomain = "msandor.hu"
+ skip_ipv4 = false
+ skip_ipv6 = true
+ ssh_host = (known after apply)
+ ssh_port = (known after apply)
+ sshkeys = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBVFPVAc9OUBdfvCFsXt8SRZ9eJ890fbCzjjckR1mvvn+ddOdvL8jRtaX1zgO1aVplJahMhVl2bY7u4Moa5hPybZiufDV+3nPLo8I4cY8MA09ztzA4ScBzD4sNZqhf6g/hjmvUkONfHCMwNQTgXUlJeIZ02NTpi1wL+m3ndWmwWL3Cx3ISuMa72l251CThUVyErU8rhBxWD7FIOm4P1IgRXgoLOf/NiL2lW9PLUEX7nHzMaakOL8bx1vAuCd2OR9KFH4dXuGk70D/GxbeklhVtV9NgrPRkJhPew3aEt0Qlq51SKYA9Vx/1RPc3E3gPR6smVB7FE4dochZCweK+U3QH msandor"
+ tablet = true
+ tags = "terraform"
+ target_node = "pveteszt"
+ unused_disk = (known after apply)
+ vmid = (known after apply)
+ cpu {
+ cores = 1
+ limit = 0
+ numa = false
+ sockets = 1
+ type = "host"
+ units = 0
+ vcores = 0
}
+ disks {
+ ide {
+ ide0 {
+ cloudinit {
+ storage = "local"
}
}
}
+ scsi {
+ scsi0 {
+ disk {
+ backup = true
+ cache = "none"
+ discard = false
+ format = "raw"
+ id = (known after apply)
+ iops_r_burst = 0
+ iops_r_burst_length = 0
+ iops_r_concurrent = 0
+ iops_wr_burst = 0
+ iops_wr_burst_length = 0
+ iops_wr_concurrent = 0
+ iothread = true
+ linked_disk_id = (known after apply)
+ mbps_r_burst = 0
+ mbps_r_concurrent = 0
+ mbps_wr_burst = 0
+ mbps_wr_concurrent = 0
+ size = "4"
+ storage = "local"
}
}
+ scsi1 {
+ disk {
+ backup = true
+ cache = "none"
+ discard = false
+ format = "raw"
+ id = (known after apply)
+ iops_r_burst = 0
+ iops_r_burst_length = 0
+ iops_r_concurrent = 0
+ iops_wr_burst = 0
+ iops_wr_burst_length = 0
+ iops_wr_concurrent = 0
+ iothread = true
+ linked_disk_id = (known after apply)
+ mbps_r_burst = 0
+ mbps_r_concurrent = 0
+ mbps_wr_burst = 0
+ mbps_wr_concurrent = 0
+ size = "1"
+ storage = "local"
}
}
}
}
+ network {
+ bridge = "vmbr0"
+ firewall = false
+ id = 0
+ link_down = false
+ macaddr = (known after apply)
+ model = "Virtio"
}
+ serial {
+ id = 0
+ type = "socket"
}
+ smbios (known after apply)
}
# proxmox_vm_qemu.vm2 will be created
+ resource "proxmox_vm_qemu" "vm2" {
+ additional_wait = 5
+ agent = 1
+ agent_timeout = 90
+ automatic_reboot = true
+ balloon = 0
+ bios = "seabios"
+ boot = "order=scsi0"
+ bootdisk = "scsi0"
+ cicustom = "vendor=local:snippets/qemu-guest-agent.yml,vendor=local:snippets/setup-swap.yml"
+ ciupgrade = true
+ ciuser = "msandor"
+ clone = "debian13-cloudinit"
+ clone_wait = 10
+ current_node = (known after apply)
+ default_ipv4_address = (known after apply)
+ default_ipv6_address = (known after apply)
+ define_connection_info = true
+ description = (known after apply)
+ force_create = false
+ full_clone = true
+ hotplug = "network,disk,usb"
+ id = (known after apply)
+ ipconfig0 = "ip=192.168.122.13/24,gw=192.168.122.1"
+ kvm = true
+ linked_vmid = (known after apply)
+ memory = 1024
+ name = "tf-dci13-vm2"
+ nameserver = "192.168.122.1"
+ onboot = false
+ os_type = "cloud-init"
+ protection = false
+ reboot_required = (known after apply)
+ scsihw = "virtio-scsi-single"
+ searchdomain = "msandor.hu"
+ skip_ipv4 = false
+ skip_ipv6 = true
+ ssh_host = (known after apply)
+ ssh_port = (known after apply)
+ sshkeys = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBVFPVAc9OUBdfvCFsXt8SRZ9eJ890fbCzjjckR1mvvn+ddOdvL8jRtaX1zgO1aVplJahMhVl2bY7u4Moa5hPybZiufDV+3nPLo8I4cY8MA09ztzA4ScBzD4sNZqhf6g/hjmvUkONfHCMwNQTgXUlJeIZ02NTpi1wL+m3ndWmwWL3Cx3ISuMa72l251CThUVyErU8rhBxWD7FIOm4P1IgRXgoLOf/NiL2lW9PLUEX7nHzMaakOL8bx1vAuCd2OR9KFH4dXuGk70D/GxbeklhVtV9NgrPRkJhPew3aEt0Qlq51SKYA9Vx/1RPc3E3gPR6smVB7FE4dochZCweK+U3QH msandor"
+ tablet = true
+ tags = "terraform"
+ target_node = "pveteszt"
+ unused_disk = (known after apply)
+ vmid = (known after apply)
+ cpu {
+ cores = 2
+ limit = 0
+ numa = false
+ sockets = 1
+ type = "host"
+ units = 0
+ vcores = 0
}
+ disks {
+ ide {
+ ide0 {
+ cloudinit {
+ storage = "local"
}
}
}
+ scsi {
+ scsi0 {
+ disk {
+ backup = true
+ cache = "none"
+ discard = false
+ format = "raw"
+ id = (known after apply)
+ iops_r_burst = 0
+ iops_r_burst_length = 0
+ iops_r_concurrent = 0
+ iops_wr_burst = 0
+ iops_wr_burst_length = 0
+ iops_wr_concurrent = 0
+ iothread = true
+ linked_disk_id = (known after apply)
+ mbps_r_burst = 0
+ mbps_r_concurrent = 0
+ mbps_wr_burst = 0
+ mbps_wr_concurrent = 0
+ size = "5"
+ storage = "local"
}
}
+ scsi1 {
+ disk {
+ backup = true
+ cache = "none"
+ discard = false
+ format = "raw"
+ id = (known after apply)
+ iops_r_burst = 0
+ iops_r_burst_length = 0
+ iops_r_concurrent = 0
+ iops_wr_burst = 0
+ iops_wr_burst_length = 0
+ iops_wr_concurrent = 0
+ iothread = true
+ linked_disk_id = (known after apply)
+ mbps_r_burst = 0
+ mbps_r_concurrent = 0
+ mbps_wr_burst = 0
+ mbps_wr_concurrent = 0
+ size = "1"
+ storage = "local"
}
}
}
}
+ network {
+ bridge = "vmbr0"
+ firewall = false
+ id = 0
+ link_down = false
+ macaddr = (known after apply)
+ model = "Virtio"
}
+ serial {
+ id = 0
+ type = "socket"
}
+ smbios (known after apply)
}
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Note: You didn't use the -out option to save this plan, so OpenTofu can't guarantee to take exactly these actions if you run "tofu
apply" now.
Végül jöhet az utolsó, és egyben legfontosabb parancs:
$ tofu apply
Nem másolom ide a kimenetét, mert 99%-ban a „tofu apply” kimenetét fogod látni. Ez a 4 sor az új információ a legalján:
Do you want to perform these actions?
OpenTofu will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
Csak a yes beírásával tudod elindítani, és természetesen az ENTER lenyomásával 😉
Mit fogsz látni a konzolon?
proxmox_vm_qemu.vm1: Creating...
proxmox_vm_qemu.vm2: Creating...
proxmox_vm_qemu.vm1: Still creating... [10s elapsed]
proxmox_vm_qemu.vm2: Still creating... [10s elapsed]
proxmox_vm_qemu.vm1: Still creating... [20s elapsed]
proxmox_vm_qemu.vm2: Still creating... [20s elapsed]
proxmox_vm_qemu.vm1: Creation complete after 29s [id=pveteszt/qemu/100]
proxmox_vm_qemu.vm2: Still creating... [30s elapsed]
proxmox_vm_qemu.vm2: Still creating... [40s elapsed]
proxmox_vm_qemu.vm2: Still creating... [50s elapsed]
proxmox_vm_qemu.vm2: Creation complete after 55s [id=pveteszt/qemu/101]
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Létrehozott (hozzáadott) két virtuális szervert a proxmoxteszt szerveren, 0 változott, 0 semmisült meg. Ez tök jó, ezt szerettük volna! Az egész 55 másodpercig tartott egy 6 éves laptopon.
És mit fogsz látni a Proxmox szervereden?

Mi történik, ha ismét kiadom a ‘tofu apply’ parancsot?
Ha nem változtattál se a fájlokon, se a virtuális szerver beállításain, akkor semmi. Az OpenTofu minden egyes tofu plan vagy tofu apply parancs kiadásakor összehasonlítja a fájlokat a valósággal, és ha eltérést tapasztal, akkor el fogja végezni a változtatásokat! Mondok erre néhány példát:
- ha törlöd a vm2.tf fájlt, meg fogja semmisíteni a tf-dci13-vm2 nevű virtuális szervered!
- ha törlöd a tf-dci13-vm2 nevű virtuális szervered, akkor újra létre fogja hozni
- ha több memóriát, cput, diszket adsz a tf-dci13-vm2 nevű virtuális szerverednek, következő futtatáskor vissza fogja állítani az eredeti állapotot
Íme egy példa, módosítom a tf-dci13-vm2 nevű virtuális szerver memória és cpu beállításait, valamint több apróságot is. Az újra kiadott tofu apply parancs kimenete most így fog kinézni:
proxmox_vm_qemu.vm2: Refreshing state... [id=pveteszt/qemu/101]
proxmox_vm_qemu.vm1: Refreshing state... [id=pveteszt/qemu/100]
OpenTofu used the selected providers to generate the following execution plan. Resource actions are indicated with the following
symbols:
~ update in-place
OpenTofu will perform the following actions:
# proxmox_vm_qemu.vm1 will be updated in-place
~ resource "proxmox_vm_qemu" "vm1" {
+ default_ipv4_address = (known after apply)
id = "pveteszt/qemu/100"
name = "tf-dci12-vm1"
+ ssh_host = (known after apply)
+ ssh_port = (known after apply)
tags = "terraform"
# (42 unchanged attributes hidden)
# (5 unchanged blocks hidden)
}
# proxmox_vm_qemu.vm2 will be updated in-place
~ resource "proxmox_vm_qemu" "vm2" {
~ agent = 0 -> 1
~ boot = "order=net0" -> "order=scsi0"
+ default_ipv4_address = (known after apply)
id = "pveteszt/qemu/101"
~ memory = 2048 -> 1024
name = "tf-dci13-vm2"
~ scsihw = "lsi" -> "virtio-scsi-single"
+ ssh_host = (known after apply)
+ ssh_port = (known after apply)
tags = "terraform"
# (39 unchanged attributes hidden)
~ cpu {
~ cores = 1 -> 2
# (6 unchanged attributes hidden)
}
~ disks {
+ ide {
+ ide0 {
+ cloudinit {
+ storage = "local"
}
}
}
# (1 unchanged block hidden)
}
# (3 unchanged blocks hidden)
}
Plan: 0 to add, 2 to change, 0 to destroy.
Do you want to perform these actions?
OpenTofu will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
proxmox_vm_qemu.vm1: Modifying... [id=pveteszt/qemu/100]
proxmox_vm_qemu.vm2: Modifying... [id=pveteszt/qemu/101]
proxmox_vm_qemu.vm2: Modifications complete after 1s [id=pveteszt/qemu/101]
proxmox_vm_qemu.vm1: Modifications complete after 1s [id=pveteszt/qemu/100]
Apply complete! Resources: 0 added, 2 changed, 0 destroyed.
Ahogy várható volt, mindent visszaállított a vm2.tf fájlban definiált értékek szerint.
Néhány érdekesség a végére
Van egy spéci blokk a vm1|2.tf fájlok végén:
lifecycle {
ignore_changes = [network,description,bootdisk]
}
Ezt arra használja az OpenTofu, hogy az 1. futtatást kivéve milyen beállításokat hagyjon ki. Ebben az esetben nem változtatja meg a hálózatot, a boot diszket, illetve a vm notes-ben szereplő információkat, mivel az benne lévő időbélyeg értelemszerűen állandóan változik. Ez a lista szabadon változtatható, nyugodtan próbálgasd.
Mi van akkor, ha mégis Terraformot szeretnék használni?
Tökéletesen fog működni a git repóban található terraform definíció. Csak telepítsd a terraformot, ami nálam: $ sudo dnf install terraform -y
A fenti 3 parancs itt így fog kinézni:
- terraform init
- terraform plan
- terraform apply
Ha már inicializáltad az OpenTofut, akkor ide is kell az upgrade kapcsoló:
- terraform init -upgrade
Ha tofu-ról terraformra váltasz, vagy vissza, törlődni fognak a terraform.tfstate fájlok, azaz a plan/apply újra lefuttat mindent, mintha első alkalommal használtad volna.
Mit kell csinálnom, ha több vagy kevesebb vm-et szeretnék menedzselni?
Ha csak 1 vm-et szeretnél, nevezd át a vm2.tf fájlt mondjuk vm2.tf.bak-ra, vagy töröld le.
Ha többet szeretnél, akkor másold le pl a vm1.tf fájlt annyi példányban, ahány vm-et szeretnél létrehozni. A fájlok tetszőleges nevűek lehetnek, de a kiterjesztése .tf legyen! Majd nyisd meg szerkesztésre az új fájlokat, és a kedvenc szövegszerkesztőddel cseréld le a vm1 szavakat az általad kitaláltra. Mentsd el az összes új fájlt. Nyisd meg szerkesztésre a variables.tf fájlt, és csinálj az összes vm1-hez kapcsolódó változóról annyi másolatot, ahány új géped lesz. Ne felejtsd el a másolatokat átnevezni. Végül nyisd meg szerkesztésre a terraform.tfvars fájlt is, és ugyanúgy másold le a vm1 géphez tartozó sorokat a szükséges mennyiségben, itt se felejtsd el módosítani a másolatok neveit. Ez bonyolultnak hangzik, de nem az 🙂
Direkt ezért terveztem 2 vm-el, hogy lássátok a fájlok logikáját.
Sanyikám!
A cikked, mint mindig most is alapos és hasznos, érdekes, ráadásul nekem is kell IaC-t, konkrétan Terraformot is tanulnom, mivel a megcélzott álláslehetőségek között is előny, illetve eladható a munkaerőpiacon, szóval aktuális is. 😉
Ahogy ki tudtam próbálni a gyakorlatban, arról is referálok.