Virtual Machine
2 minute read
Wirtualna maszyna (VM, Virtual Machine) to programowe odwzorowanie fizycznego komputera, które działa w ramach istniejącego systemu lub bezpośrednio na hyperwizorze. Posiada własny system operacyjny, przydzielone zasoby (CPU, pamięć RAM, dysk, sieć) i jest odizolowana od innych maszyn działających na tym samym hoście. Dzięki wirtualizacji możliwe jest uruchamianie wielu niezależnych środowisk na jednej fizycznej infrastrukturze, co zwiększa efektywność wykorzystania zasobów, ułatwia zarządzanie oraz podnosi bezpieczeństwo i elastyczność środowisk IT.
1. Struktura katalogów dla kontenerów
Definicje vm znajdują się w katalogu:
./machines/
Każdy vm posiada osobny plik:
vmXXXXX.tf
Przykład:
vm01011.tf
✅ Zapewnia to:
- czytelność,
- pełną niezależność kontenerów,
- łatwą kontrolę zmian w Git.
2. Tworzenie VM
module "vm01017" {
source = "git@gitlab.rachuna-net.pl:pl.rachuna-net/infrastructure/opentofu/modules/proxmox-vm.git?ref=v1.0.0"
hostname = "vm01017.rachuna-net.pl"
description = "Kubernetes master w4"
node_name = "pve-s1"
vm_id = 1017
pool_id = "kubernetes"
protection = true
tags = ["kubernetes", "master", "ubuntu"]
is_dmz = false
mac_address = "BC:24:11:50:5F:83"
datastore_id = "storage.rachuna-net.pl"
template = {
node_name = "pve-s1"
vm_id = 901
full = true
}
cpu = {
cores = 4
sockets = 2
}
memory = {
dedicated = 8192
}
user_account = {
username = data.vault_kv_secret_v2.auth_techuser.data["username"]
password = data.vault_kv_secret_v2.auth_techuser.data["password"]
public_ssh_key = data.vault_kv_secret_v2.auth_techuser.data["public_ssh_key"]
}
vault = {
mount = "kv-gitlab"
path = "pl.rachuna-net/infrastructure/opentofu/iac-proxmox/machine/vm01017"
}
}
source = "git@gitlab.rachuna-net.pl:pl.rachuna-net/infrastructure/opentofu/modules/proxmox-vm.git?ref=v1.0.0"- Źródło modułu.hostname– pełna nazwa FQDN VM.description– krótki opis roli serwera (widzoczny w Proxmox).node_name– węzeł Proxmox, na którym VM ma być tworzona (pve-s1,pve-s2,pve-s3, …).vm_id– unikalny ID VM w klastrze (sprawdź, czy numer nie jest zajęty).pool_id– pula Proxmox (np.kubernetes), ustaw zgodnie z przeznaczeniem.protection– zwykletruedla ochrony przed przypadkowym usunięciem.tags– lista tagów (rola, system, np.["kubernetes", "master", "ubuntu"]).is_dmz–true/falsezależnie od strefy sieci.mac_address– statyczny MAC (zapewnij unikalność w sieci).datastore_id– magazyn na dyski (obecniestorage.rachuna-net.pljak w istniejących VM).
2.1. Sekcje template, cpu, memory
template– wskaż template VM (aktualnie wykorzystywany jestvm_id = 901napve-s1z kopią pełną:full = true).cpu– ustaw liczbę rdzeni (cores) i gniazd (sockets).memory–dedicatedw MB (np.8192).
2.2. Dostępy i sekrety
user_accountpobiera dane użytkownika technicznego z Vault:data.vault_kv_secret_v2.auth_techuser.data[...]– upewnij się, że wpis istnieje (definicja wmachines/_data.tf).vault– ustaw ścieżkę na sekrety specyficzne dla VM, zgodnie z konwencjąpl.rachuna-net/infrastructure/opentofu/iac-proxmox/machine/vmNNNNN(zaktualizuj numer).
3. Integracja z Vault
Jeżeli dane dostępowe pochodzą z Vault, zamiast jawnych wartości:
user_account = {
username = data.vault_kv_secret_v2.ct.data["username"]
password = data.vault_kv_secret_v2.ct.data["password"]
public_ssh_key = data.vault_kv_secret_v2.ct.data["ssh_key"]
}
✅ Pozwala to:
- usunąć hasła z repozytorium,
- rotować dane dostępowe,
- centralnie kontrolować dostęp.