# Workspace Servers Definition Template # Pattern: Import defaults → Apply overrides → Validate # # This template shows the standard pattern for defining servers in a workspace. # Each server merges workspace defaults with individual overrides. let provisioning = import "schemas/main.ncl" in let lib = provisioning.lib in # Load workspace-specific defaults (e.g., upcloud_defaults, hetzner_defaults) # Customize path based on your provider: # - For Upcloud: import "../lib/upcloud_defaults.ncl" # - For Hetzner: import "../lib/hetzner_defaults.ncl" # - For OCI: import "../lib/oci_defaults.ncl" let workspace_defaults = import "../lib/provider_defaults.ncl" in { servers = [ # Example: Primary control panel node (workspace_defaults & { hostname = "cp-0", title = "Control Panel 0", # Plan/size: adjust for provider plan = "2xCPU-4GB", not_use = false, extra_hostnames = ["cp-0", "control.local"], labels = "use=control-panel,role=primary", # Storage configuration storages = [ ({ name = "root", size = 50, total = 100, type = "ext4", mount = true, mount_path = "/", fstab = true, parts = [ { name = "root", size = 50, total = 50, type = "ext4", mount = true, mount_path = "/", }, { name = "etcd", size = 50, total = 50, type = "xfs", mount = true, mount_path = "/var/lib/etcd", }, ], } | lib.Storage) ], # Taskservs to deploy on this server taskservs = [ {name = "os", profile = "control-plane"} | lib.TaskServDef, {name = "resolv"} | lib.TaskServDef, {name = "containerd"} | lib.TaskServDef, {name = "kubernetes", role = "master"} | lib.TaskServDef, {name = "etcd", cluster_role = "master"} | lib.TaskServDef, ], }), # Example: Worker node (workspace_defaults & { hostname = "worker-0", title = "Kubernetes Worker 0", plan = "2xCPU-4GB", not_use = false, extra_hostnames = ["worker-0"], labels = "use=worker,role=compute", storages = [ ({ name = "root", size = 100, total = 100, type = "ext4", mount = true, mount_path = "/", fstab = true, parts = [ { name = "root", size = 100, total = 100, type = "ext4", mount = true, mount_path = "/", }, ], } | lib.Storage) ], taskservs = [ {name = "os", profile = "worker"} | lib.TaskServDef, {name = "resolv"} | lib.TaskServDef, {name = "containerd"} | lib.TaskServDef, {name = "kubernetes", role = "worker"} | lib.TaskServDef, ], }), # Example: Storage node (disabled) (workspace_defaults & { hostname = "storage-0", title = "Kubernetes Storage 0", plan = "4xCPU-8GB", not_use = true, # Set to false to enable extra_hostnames = ["storage-0"], labels = "use=storage,role=data", storages = [ ({ name = "root", size = 50, total = 500, type = "ext4", mount = true, mount_path = "/", fstab = true, parts = [ { name = "root", size = 50, total = 50, type = "ext4", mount = true, mount_path = "/", }, { name = "data0", size = 200, total = 200, type = "xfs", mount = true, mount_path = "/data0", }, { name = "data1", size = 250, total = 250, type = "xfs", mount = true, mount_path = "/data1", }, ], } | lib.Storage) ], taskservs = [ {name = "os", profile = "worker"} | lib.TaskServDef, {name = "resolv"} | lib.TaskServDef, {name = "containerd"} | lib.TaskServDef, {name = "kubernetes", role = "worker"} | lib.TaskServDef, {name = "rook-ceph"} | lib.TaskServDef, ], }), ], }