locals { begin-core = <<-EOF .:53 { errors { consolidate 5m ".* i/o timeout$" warning consolidate 30s "^Failed to .+" } health { lameduck 5s } ready EOF end-core = <<-EOF log . {combined} { class denial error } prometheus 0.0.0.0:9153 forward . ${var.forward} cache 30 loop reload loadbalance } EOF soa-ns = <<-EOF @ IN SOA ${var.sub-domain}.${var.domain-name}. ${var.domain-name}. ( ${formatdate("YYYYMMDDhh",timestamp())} ; Serial 4H ; Refresh 1H ; Retry 7D ; Expire 4H ) ; Negative Cache TTL @ IN NS ${var.sub-domain}.${var.domain-name}. EOF files = merge({ "Corefile" = join("\n", concat([local.begin-core],[for z in var.zones: format("file /etc/coredns/%s.db %s", z.name,z.name)],[local.end-core])) },[for z in var.zones: { "${z.name}.db" = join("\n", concat([ "$TTL 60", "$ORIGIN ${z.name}.", local.soa-ns ], z.domain!=""?[format("%s. IN A %s", z.name, z.domain)]:[], z.domain6!=""?[format("%s. IN AAAA %s", z.name, z.domain6)]:[], [for k,v in z.TXT: format("%s IN TXT %s", k, v)], [for k,v in z.hosts: format("%s IN A %s", k, v)], [for k,v in z.hosts6: format("%s IN AAAA %s", k, v)], [for k,v in z.alias: format("%s IN CNAME %s", k, v)], [for mx in z.mx: format("%s IN MX %d %s", mx.name, mx.priority, mx.value)], z.wildcard!=""?[format("*.%s. IN A %s", z.name, z.wildcard)]:[], z.wildcard6!=""?[format("*.%s. IN AAAA %s", z.name, z.wildcard6)]:[], )) }]...) } resource "kubernetes_config_map_v1" "coredns-config" { metadata { name = "${var.component}-${var.instance}" namespace = "${var.namespace}" labels = local.common-labels } data = local.files }