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
secrets.yaml filter=git-crypt diff=git-crypt

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,10 +1,10 @@
machine: machine:
network: network:
interfaces: interfaces:
- interface: {{interface}} - interface: {{node.interface}}
dhcp: false dhcp: false
addresses: addresses:
- {{ip}} - {{node.ip}}
routes: routes:
- network: 0.0.0.0/0 - 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: machine:
network: network:
interfaces: interfaces:
- interface: {{interface}} - interface: {{node.interface}}
vip: vip:
ip: {{cluster.controlPlaneIp}} ip: {{node.cluster.controlPlaneIp}}

View File

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

View File

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

BIN
secrets.yaml Normal file

Binary file not shown.

View File

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