Refactor and add deployment support
This commit is contained in:
85
services/terraform.libsonnet
Normal file
85
services/terraform.libsonnet
Normal file
@@ -0,0 +1,85 @@
|
||||
local domains = import "../config/domains.libsonnet";
|
||||
local servers = import "../config/servers.libsonnet";
|
||||
local credentials = import "../credentials.libsonnet";
|
||||
local terraform = import "../lib/terraform.libsonnet";
|
||||
local defaults = import "../config/defaults.libsonnet";
|
||||
|
||||
local domainToName (domain) = std.strReplace(domain, '.', '_');
|
||||
local splitDomainName (domain, subdomaine = []) =
|
||||
local found = std.find(domain, domains);
|
||||
local split = std.split(domain, '.');
|
||||
if std.length(found) > 0
|
||||
then { subdomain: std.join('.', subdomaine), zone: domainToName(domains[found[0]]) }
|
||||
else splitDomainName(std.join('.', split[1:]), subdomaine + [split[0]]);
|
||||
|
||||
local domainEntries(domain, server) =
|
||||
local split = splitDomainName(domain);
|
||||
local record = terraform.HdnsRecord { zone_id: "${hetznerdns_zone." + split.zone + ".id}", name: "" };
|
||||
local hostAttr (attr) = "${hcloud_server." + server.name + "." + attr + "}";
|
||||
if split.subdomain == ""
|
||||
then {
|
||||
["deployment_" + domainToName(domain) + "_A"]: record { value: hostAttr('ipv4_address'), type: "A" },
|
||||
["deployment_" + domainToName(domain) + "_AAAA"]: record { value: hostAttr('ipv6_address'), type: "AAAA" }
|
||||
}
|
||||
else { ["deployment_" + domainToName(domain) + "_CNAME"]: record { name: split.subdomain, value: server.networking.publicDomain, type: 'CNAME' } };
|
||||
|
||||
{
|
||||
terraform: {
|
||||
required_providers: {
|
||||
hcloud: {
|
||||
source: "hetznercloud/hcloud",
|
||||
version: "1.30.0"
|
||||
},
|
||||
hetznerdns: {
|
||||
source: "timohirt/hetznerdns",
|
||||
version: "1.1.1"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
provider: {
|
||||
hcloud: {
|
||||
token: credentials.hcloudToken
|
||||
},
|
||||
hetznerdns: {
|
||||
apitoken: credentials.hdnsToken
|
||||
}
|
||||
},
|
||||
|
||||
resource: {
|
||||
hcloud_ssh_key: {
|
||||
[k]: terraform.HcloudSSHKey { name: k, public_key: defaults.defaultSshKeys[k] }
|
||||
for k in std.objectFields(defaults.defaultSshKeys)
|
||||
},
|
||||
|
||||
hcloud_server: {
|
||||
[s]: servers[s].instance
|
||||
for s in std.objectFields(servers)
|
||||
},
|
||||
|
||||
hetznerdns_zone: {
|
||||
infra: { name: defaults.infraDomain, ttl: defaults.defaultZoneTTL },
|
||||
} + {
|
||||
[domainToName(domain)]: { name: domain, ttl: defaults.defaultZoneTTL }
|
||||
for domain in domains
|
||||
},
|
||||
|
||||
# Default records for every host (v4, v6, VPN)
|
||||
local hostRecords = std.foldl(function (a, b) a + b, [
|
||||
terraform.serverDnsRecords(servers[s])
|
||||
for s in std.objectFields(servers)
|
||||
], {}),
|
||||
|
||||
# DNS records for deployed apps
|
||||
local appRecords = std.foldl(
|
||||
function (records, server)
|
||||
records + std.foldl(
|
||||
function (entries, domain) entries + domainEntries(domain, servers[server]),
|
||||
servers[server].deployment_vars.domains, {}
|
||||
),
|
||||
std.objectFields(servers), {}
|
||||
),
|
||||
|
||||
hetznerdns_record: hostRecords + appRecords
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user