Compare commits

...

3 Commits

12 changed files with 36 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 https://headscale.huizinga.dev
- 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,4 @@ 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
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,7 @@ 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 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 +41,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 +53,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 +140,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:
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):