Starting out simple. Small.
This commit is contained in:
parent
cde6ba8905
commit
96cc5e9501
5 changed files with 47 additions and 62 deletions
32
README.md
32
README.md
|
|
@ -1,22 +1,28 @@
|
|||
# Metanix
|
||||
*Declare your infrastructure!*
|
||||
|
||||
_Declare your infrastructure!_
|
||||
|
||||
**THIS IS STILL IN DESIGN AND EXPERIMENTATION PHASE**
|
||||
|
||||
## Description
|
||||
|
||||
Metanix is a nix library designed to allow a central, no-nonsense nix file to be written to allow for a Source of Truth leading to deterministic configuration identifiers like IP addresses, UIDs, GIDs, and enable quickly establishing frameworks for NixOS systems existing within an ecosystem.
|
||||
As such, I am trying to design this system to enable a would-be admin to answer very simple one-word questions. Sort of.
|
||||
|
||||
## What?
|
||||
|
||||
Or, in other words, what systems do you want Metanix to manage or at least be aware of?
|
||||
|
||||
## Where?
|
||||
|
||||
Or, in other words, what networks and subnets do you have and where do your systems/users belong?
|
||||
|
||||
## Who?
|
||||
|
||||
Or, in other words, who are your users?
|
||||
|
||||
## How?
|
||||
|
||||
Or, in other words, what kind of access control groups do you want or need to best control how everything is used.
|
||||
|
||||
## Enter: THINGS
|
||||
|
|
@ -119,28 +125,32 @@ More on each of these categories of things later.
|
|||
role = "infrastructure";
|
||||
tags = [ "router" "linode" ];
|
||||
services = [ "nginx-proxy" "headscale" ];
|
||||
config = {...}: { # NixOS config here, or use a path to one. };
|
||||
config = {...}: { # NixOS config here, or use a path to one.
|
||||
};
|
||||
};
|
||||
metatron = {
|
||||
owner = "yaro";
|
||||
nixOS = true;
|
||||
role = "server";
|
||||
tags = ["server" "linode" "upstream"];
|
||||
config = {...}: { # NixOS config here, or use a path to one. };
|
||||
config = {...}: { # NixOS config here, or use a path to one.
|
||||
};
|
||||
};
|
||||
io = {
|
||||
owner = "yaro";
|
||||
nixOS = true;
|
||||
role = "infrastructure";
|
||||
tags = ["router" "downstream"];
|
||||
config = {...}: { # NixOS config here, or use a path to one. };
|
||||
config = {...}: { # NixOS config here, or use a path to one.
|
||||
};
|
||||
};
|
||||
europa = {
|
||||
owner = "yaro";
|
||||
nixOS = true;
|
||||
role = "infrastructure";
|
||||
tags = ["router" "downstream"];
|
||||
config = {...}: { # NixOS config here, or use a path to one. };
|
||||
config = {...}: { # NixOS config here, or use a path to one.
|
||||
};
|
||||
};
|
||||
deimos = {
|
||||
owner = "yaro";
|
||||
|
|
@ -157,7 +167,8 @@ More on each of these categories of things later.
|
|||
"forgejo"
|
||||
"headscale"
|
||||
];
|
||||
config = {...}: { # NixOS config here, or use a path to one. };
|
||||
config = {...}: { # NixOS config here, or use a path to one.
|
||||
};
|
||||
};
|
||||
phobos = {
|
||||
owner = "yaro";
|
||||
|
|
@ -171,7 +182,8 @@ More on each of these categories of things later.
|
|||
"sandbox"
|
||||
"node-red"
|
||||
];
|
||||
config = {...}: { # NixOS config here, or use a path to one. };
|
||||
config = {...}: { # NixOS config here, or use a path to one.
|
||||
};
|
||||
};
|
||||
terra = {
|
||||
owner = "yaro";
|
||||
|
|
@ -189,7 +201,8 @@ More on each of these categories of things later.
|
|||
group = {
|
||||
userGroups = {
|
||||
programmers = {
|
||||
config = { ... }: { # Home-manager config here, or use a path to one. };
|
||||
config = { ... }: { # Home-manager config here, or use a path to one.
|
||||
};
|
||||
};
|
||||
};
|
||||
systemGroups = {
|
||||
|
|
@ -198,7 +211,8 @@ More on each of these categories of things later.
|
|||
"nfs"
|
||||
"isci"
|
||||
];
|
||||
config = { ... }: { # Home-manager config here, or use a path to one. };
|
||||
config = { ... }: { # Home-manager config here, or use a path to one.
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
|||
16
flake.lock
generated
16
flake.lock
generated
|
|
@ -2,18 +2,14 @@
|
|||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1752950548,
|
||||
"narHash": "sha256-NS6BLD0lxOrnCiEOcvQCDVPXafX1/ek1dfJHX1nUIzc=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "c87b95e25065c028d31a94f06a62927d18763fdf",
|
||||
"type": "github"
|
||||
"lastModified": 0,
|
||||
"narHash": "sha256-NV4S2Lf2hYmZQ3Qf4t/YyyBaJNuxLPyjzvDma0zPp/M=",
|
||||
"path": "/nix/store/4878dzkl1bdxv6wqavzy7bdracvl9q16-source",
|
||||
"type": "path"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
"id": "nixpkgs",
|
||||
"type": "indirect"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
|
|
|
|||
1
lib/functions/buildLocationList.nix
Normal file
1
lib/functions/buildLocationList.nix
Normal file
|
|
@ -0,0 +1 @@
|
|||
locations: builtins.attrNames locations
|
||||
|
|
@ -1,45 +1,12 @@
|
|||
# lib/metanix.nix
|
||||
{ data, lib }:
|
||||
|
||||
let
|
||||
buildSystemIndex =
|
||||
indexOf = name: names:
|
||||
let
|
||||
flattenSystems = locationName: subnetName: systems:
|
||||
lib.mapAttrsToList
|
||||
(systemName: systemCfg: {
|
||||
inherit systemName locationName subnetName;
|
||||
primary = systemCfg.primary or false;
|
||||
macs = systemCfg.macAddresses or [ ];
|
||||
})
|
||||
systems;
|
||||
|
||||
allSystems =
|
||||
builtins.concatLists (
|
||||
lib.mapAttrsToList
|
||||
(locationName: location:
|
||||
builtins.concatLists (
|
||||
lib.mapAttrsToList
|
||||
(subnetName: subnet:
|
||||
flattenSystems locationName subnetName (subnet.systems or { })
|
||||
)
|
||||
(location.subnets or { })
|
||||
)
|
||||
)
|
||||
data.locations
|
||||
);
|
||||
indexed = builtins.imap0 (i: v: { inherit i v; }) names;
|
||||
matches = builtins.filter (x: x.v == name) indexed;
|
||||
in
|
||||
builtins.foldl'
|
||||
(acc: entry:
|
||||
let
|
||||
existing = acc.${entry.systemName} or [ ];
|
||||
in
|
||||
acc // {
|
||||
${entry.systemName} = existing ++ [ builtins.removeAttrs entry [ "systemName" ] ];
|
||||
}
|
||||
)
|
||||
{ }
|
||||
allSystems;
|
||||
if matches == [ ] then null else (builtins.head matches).i;
|
||||
|
||||
in
|
||||
{
|
||||
inherit buildSystemIndex;
|
||||
}
|
||||
{ indexOf = indexOf; }
|
||||
|
|
|
|||
7
test/test-buildLocationList.nix
Normal file
7
test/test-buildLocationList.nix
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
let
|
||||
buildLocationList = import ../lib/functions/buildLocationList.nix;
|
||||
sampleData = import ./meta.nix;
|
||||
in
|
||||
{
|
||||
result = buildLocationList sampleData.locations;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue