Compare commits

...

3 Commits

Author SHA1 Message Date
3b0a49f12e Added tailscale
Also routes the whole subnet of the cluster over tailscale so it can act
as an entry point to my home network even when not at home.
2025-11-11 04:18:18 +01:00
a75a0c8722 Access node parameters through node instead of directly 2025-11-11 04:17:47 +01:00
2dda3cc465 Also load config settings from secrets.yaml 2025-11-11 04:17:45 +01:00
12 changed files with 38 additions and 9 deletions

1
.gitattributes vendored
View File

@@ -1 +1,2 @@
_secrets.yaml filter=git-crypt diff=git-crypt
secrets.yaml filter=git-crypt diff=git-crypt

View File

@@ -1,3 +1,6 @@
server:
tftpIp: 192.168.1.1
httpUrl: http://192.168.1.1:8000
tailscale:
loginServer: https://headscale.huizinga.dev

View File

@@ -26,5 +26,6 @@ patches:
- !patch install-disk
- !patch network
- !patch vip
- !patch tailscale
patchesControlPlane:
- !patch allow-control-plane-workloads

View File

@@ -1,3 +1,3 @@
machine:
network:
hostname: {{hostname}}
hostname: {{node.hostname}}

View File

@@ -1,3 +1,3 @@
machine:
install:
disk: {{installDisk}}
disk: {{node.installDisk}}

View File

@@ -1,10 +1,10 @@
machine:
network:
interfaces:
- interface: {{interface}}
- interface: {{node.interface}}
dhcp: false
addresses:
- {{ip}}
- {{node.ip}}
routes:
- network: 0.0.0.0/0
gateway: {{gateway}}
gateway: {{node.gateway}}

7
patches/tailscale.yaml Normal file
View File

@@ -0,0 +1,7 @@
apiVersion: v1alpha1
kind: ExtensionServiceConfig
name: tailscale
environment:
- TS_AUTHKEY={{ config.tailscale.authKey }}
- TS_EXTRA_ARGS=--login-server {{ config.tailscale.loginServer }}
- TS_ROUTES={{ helper.tailscale_subnet(node.gateway, node.netmask) }}

View File

@@ -1,6 +1,6 @@
machine:
network:
interfaces:
- interface: {{interface}}
- interface: {{node.interface}}
vip:
ip: {{cluster.controlPlaneIp}}
ip: {{node.cluster.controlPlaneIp}}

View File

@@ -2,3 +2,5 @@ PyYAML==6.0.3
requests==2.32.5
Jinja2==3.1.6
GitPython==3.1.45
mergedeep==1.3.4
netaddr==1.3.0

View File

@@ -5,3 +5,4 @@ customization:
- siderolabs/util-linux-tools
- siderolabs/intel-ucode
- siderolabs/i915
- siderolabs/tailscale

BIN
secrets.yaml Normal file

Binary file not shown.

View File

@@ -11,6 +11,8 @@ import git
import requests
import yaml
from jinja2 import Environment, FileSystemLoader, StrictUndefined, Template
from mergedeep import merge
from netaddr import IPAddress
REPO = git.Repo(sys.path[0], search_parent_directories=True)
assert REPO.working_dir is not None
@@ -40,7 +42,7 @@ def render_templates(node: dict, args: dict):
def default(self, o):
if isinstance(o, Template):
try:
rendered = o.render(args | node)
rendered = o.render(args | {"node": node})
except Exception as e:
e.add_note(f"While rendering for: {node['hostname']}")
raise e
@@ -52,6 +54,11 @@ def render_templates(node: dict, args: dict):
return Inner
def tailscale_subnet(gateway: str, netmask: str):
netmask_bits = IPAddress(netmask).netmask_bits()
return f"{IPAddress(gateway) & IPAddress(netmask)}/{netmask_bits}"
@functools.cache
def get_schematic_id(schematic: str):
"""Lookup the schematic id associated with a given schematic"""
@@ -134,7 +141,14 @@ def main():
with open(ROOT.joinpath("config.yaml")) as fyaml:
config = yaml.safe_load(fyaml)
template_args = {"config": config, "root": ROOT}
with open(ROOT.joinpath("secrets.yaml")) as fyaml:
merge(config, yaml.safe_load(fyaml))
template_args = {
"config": config,
"root": ROOT,
"helper": {"tailscale_subnet": tailscale_subnet},
}
nodes = []
for fullname in walk_files(NODES):