Add dhall experiments

This commit is contained in:
Correl Roush 2024-11-25 23:03:32 -05:00
parent e7a232daeb
commit fca829329c
8 changed files with 158 additions and 0 deletions

17
dhall/Host.dhall Normal file
View file

@ -0,0 +1,17 @@
let ip = ./ip.dhall
let Address = < ip : ip.Address | dhcp >
let local =
\(suffix : Natural) ->
Address.ip (ip.address "192.168.1.${Natural/show suffix}" 24)
let Host
: Type
= { name : Text, address : Address }
let host
: Text -> Address -> Host
= \(name : Text) -> \(address : Address) -> { name, address }
in {Host, Address, host, local}

6
dhall/Network.dhall Normal file
View file

@ -0,0 +1,6 @@
let IP =
{ Type = { address : Text, prefixLength : Natural }
, default.prefixLength = 24
}
in { Network }

17
dhall/Proxmox.dhall Normal file
View file

@ -0,0 +1,17 @@
let ProxmoxServerConfig = { id : Natural, address : Text }
let Proxmox = < LXC : ProxmoxServerConfig | VM : ProxmoxServerConfig >
let lxc = \(id : Natural) -> \(address : Text) -> Proxmox.LXC { id, address }
let vm = \(id : Natural) -> \(address : Text) -> Proxmox.VM { id, address }
let ipAddress =
\(server : Proxmox) ->
merge
{ LXC = \(config : ProxmoxServerConfig) -> config.address
, VM = \(config : ProxmoxServerConfig) -> config.address
}
server
in { LXC = Proxmox.LXC, VM = Proxmox.VM, lxc, ipAddress }

18
dhall/Server.dhall Normal file
View file

@ -0,0 +1,18 @@
let Simple =
{ Type = { address : Text, hostnames : List Text }
, default.hostnames = [] : List Text
}
let Proxmox = ./Proxmox.dhall
let Server = < Simple : Simple | Proxmox : Proxmox >
let ipAddress =
\(server : Server) ->
merge
{ Simple = \(s : Simple) -> s.address
, Proxmox = \(s : Proxmox.Proxmox) -> Proxmox.ipAddress s
}
server
in { ipAddress }

36
dhall/inventory.dhall Normal file
View file

@ -0,0 +1,36 @@
let ip = ./ip.dhall
let Host = ./Host.dhall
let servers = ./servers.dhall
let render =
\(host : Host.Host) ->
let domain = "sailmaker.fenix.lgbt"
let renderAddress =
\(address : Host.Address) ->
merge
{ ip = \(ip : ip.Address) -> ip.address
, dhcp = "${host.name}.${domain}"
}
address
in { ansible_host = renderAddress host.address }
in { servers.hosts
=
{ reason = render servers.reason, nomadix = render servers.nomadix }
, appliances.hosts.ipowerswitch = render servers.ipowerswitch
, virtual.hosts
=
{ pihole = render servers.pihole
, wireguard = render servers.wireguard
, lldap = render servers.lldap
, traefik = render servers.traefik
, homeassistant = render servers.homeassistant
, mqtt = render servers.mqtt
, heimdall = render servers.heimdall
}
, sailmaker.children = { servers = {}, appliances = {}, virtual = {} }
}

11
dhall/ip.dhall Normal file
View file

@ -0,0 +1,11 @@
let Address
: Type
= { address : Text, prefixLength : Natural }
let address
: Text -> Natural -> Address
= \(address : Text) ->
\(prefixLength : Natural) ->
{ address, prefixLength }
in { Address, address }

22
dhall/servers.dhall Normal file
View file

@ -0,0 +1,22 @@
let Proxmox = ./Proxmox.dhall
let Host = ./Host.dhall
let dhcp = Host.Address.dhcp
let host = Host.host
let local = Host.local
in { router = host "reason" (local 1)
, pihole = host "pihole" (local 2)
, nomadix = host "nomadix" (local 5)
, wireguard = host "wireguard" (local 6)
, lldap = host "lldap" (local 7)
, traefik = host "traefik" (local 8)
, homeassistant = host "home-assistant" (local 13)
, mqtt = host "mqtt" (local 14)
, ipowerswitch = host "ipowerswitch" (local 99)
, reason = host "reason" (local 183)
, heimdall = host "heimdall-dashboard" dhcp
}

31
dhall/services.dhall Normal file
View file

@ -0,0 +1,31 @@
let ProxmoxServer = { id : Natural }
let Protocol = < HTTP | HTTPS >
let Backend =
{ Type = { protocol : Protocol, host : Text, port : Natural }
, default = { protocol = Protocol.HTTP, port = 80 }
}
let Service =
{ Type =
{ name : Text
, hostname : Optional Text
, backends : List Backend.Type
}
, default = { hostname = None Text, backends = [] : List Backend.Type }
}
let domain = "sailmaker.fenix.lgbt"
let hostname
: Text -> Text
= \(name : Text) -> "${name}.${domain}"
let services
: List Service.Type
= [ Service::{ name = "pihole", hostname = Some (hostname "pi-hole") }
, Service::{ name = "heimdall" }
]
in services