provisioning-code/templates/workspace/nickel/servers.ncl

159 lines
4.4 KiB
Text

# 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,
],
}),
],
}