Skip to content

Standardize dns_record output across service modules #258

@accuser

Description

@accuser

Summary

Add a standardized dns_record output to all service modules, enabling automatic DNS record collection in environment configurations.

Parent Epic

Part of #255 - Consolidated DNS and TLS Architecture

Current State

  • Some modules have dns_record output but format varies
  • Environment main.tf manually specifies DNS records
  • No automatic collection from module outputs

Desired State

All service modules export a consistent dns_record output:

# modules/grafana/outputs.tf
output "dns_record" {
  description = "DNS record for service discovery"
  value = {
    name    = var.dns_name  # "grafana" 
    type    = "A"
    value   = incus_instance.grafana.ipv4_address
    service = "grafana"
  }
}

Environment collects records automatically:

# environments/iapetus/main.tf
locals {
  service_dns_records = [
    module.grafana01.dns_record,
    module.prometheus01.dns_record,
    module.loki01.dns_record,
    module.atlantis01.dns_record,
    module.step_ca01.dns_record,
  ]
}

module "coredns01" {
  dns_records = local.service_dns_records
}

Modules to Update

iapetus services

  • modules/grafana/outputs.tf
  • modules/prometheus/outputs.tf
  • modules/loki/outputs.tf
  • modules/atlantis/outputs.tf
  • modules/step-ca/outputs.tf
  • modules/caddy/outputs.tf
  • modules/cloudflared/outputs.tf

cluster01 services

  • modules/alertmanager/outputs.tf
  • modules/mosquitto/outputs.tf
  • modules/forgejo/outputs.tf
  • modules/postgresql/outputs.tf
  • modules/alloy/outputs.tf

Shared

  • modules/coredns/outputs.tf

Standard Output Format

output "dns_record" {
  description = "DNS record for service discovery zone"
  value = {
    name    = var.dns_name != "" ? var.dns_name : var.instance_name
    type    = "A"
    value   = incus_instance.<service>.ipv4_address
    service = "<service-name>"
  }
}

New Variable (optional)

variable "dns_name" {
  description = "DNS record name (without domain). Defaults to instance_name."
  type        = string
  default     = ""
}

Acceptance Criteria

  • All service modules have dns_record output
  • Output format is consistent across modules
  • Environment main.tf uses collected records
  • Module READMEs document the output

Dependencies

None - can be implemented incrementally

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestinfrastructureInfrastructure deployment and management

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions