5.6 KiB
5.6 KiB
DNS Management Refactor - Modular & Repeatable
This document explains the refactoring of DNS management from standalone playbooks to modular, reusable tasks.
🎯 What Changed
Before (Monolithic)
# Standalone playbook: add_technitium_dns_entry.yml
- name: Add entry to Technitium DNS
hosts: all
tasks:
- name: Create DNS entry
effectivelywild.technitium_dns.technitium_dns_add_record:
# ... hardcoded parameters
After (Modular)
# Reusable task: tasks/add_technitium_dns_entry.yml
- name: Create DNS entry for {{ dns_record_name }}
effectivelywild.technitium_dns.technitium_dns_add_record:
# ... parameterized with variables
📁 New Structure
ansible/
├── playbooks/
│ ├── tasks/
│ │ └── add_technitium_dns_entry.yml # ✅ Reusable task file
│ ├── add_dns_entry.yml # ✅ New playbook using task
│ ├── add_technitium_dns_entry.yml.backup # 📦 Backed up old version
│ └── roles/
│ └── dns-manager/ # ✅ Enhanced role
│ ├── tasks/main.yml # Uses task file
│ └── defaults/main.yml # Technitium defaults
└── scripts/
└── migrate-dns-references.sh # ✅ Migration helper
🚀 Usage Examples
1. In Playbooks (Direct Task Include)
- name: Add DNS entry for my server
hosts: my_servers
tasks:
- name: Create DNS entry
ansible.builtin.include_tasks: tasks/add_technitium_dns_entry.yml
vars:
dns_record_name: "{{ inventory_hostname }}"
dns_zone: "{{ base_domain }}"
dns_ip_address: "{{ ansible_default_ipv4.address }}"
2. Using the DNS Manager Role
- name: Setup cluster DNS
hosts: control_plane[0]
roles:
- role: dns-manager
vars:
cluster_endpoint: "my-cluster.local.mk-labs.cloud"
cluster_vip: "10.1.71.100"
3. Using the New Playbook
# Import the new modular playbook
- import_playbook: add_dns_entry.yml
4. In Cluster Network Setup
- name: Setup complete cluster network
ansible.builtin.include_role:
name: cluster-network-setup
vars:
cluster_name: "fastpass"
cluster_endpoint: "fastpass.local.mk-labs.cloud"
cluster_vip: "10.1.71.53"
🔧 Migration Guide
Automatic Migration
# Run the migration script to find references
./scripts/migrate-dns-references.sh
Manual Updates
-
Replace playbook imports:
# OLD - import_playbook: add_technitium_dns_entry.yml # NEW - import_playbook: add_dns_entry.yml -
Use task includes in roles:
- ansible.builtin.include_tasks: tasks/add_technitium_dns_entry.yml vars: dns_record_name: "my-server" dns_ip_address: "10.1.71.100" -
Use the dns-manager role:
- ansible.builtin.include_role: name: dns-manager
📋 Variable Reference
Task Variables (tasks/add_technitium_dns_entry.yml)
| Variable | Default | Description |
|---|---|---|
dns_record_name |
inventory_hostname |
DNS record name |
dns_zone |
base_domain |
DNS zone |
dns_ip_address |
ip_address |
IP address for A record |
dns_record_type |
A |
DNS record type |
dns_ttl |
360 |
TTL in seconds |
dns_create_ptr |
true |
Create PTR record |
dns_debug |
true |
Show debug output |
DNS Manager Role Variables
| Variable | Default | Description |
|---|---|---|
cluster_endpoint |
- | Full cluster FQDN |
cluster_vip |
- | Cluster VIP address |
dns_management_enabled |
true |
Enable DNS management |
use_hosts_file_fallback |
true |
Add to /etc/hosts |
dns_ttl |
360 |
DNS TTL |
create_ptr_record |
true |
Create PTR record |
🎯 Benefits
✅ Modularity
- Single task file used across multiple contexts
- Consistent DNS management approach
- Easy to maintain and update
✅ Flexibility
- Works in playbooks, roles, and standalone
- Parameterized for different use cases
- Supports multiple DNS providers (extensible)
✅ Maintainability
- One place to update DNS logic
- Clear variable interface
- Better error handling and debugging
✅ Integration
- Seamlessly integrates with cluster setup
- Works with existing homelab infrastructure
- Compatible with Traefik load balancer setup
🔄 Integration with Cluster Setup
The DNS management now integrates seamlessly with your cluster deployment:
# In fastpass-first-control-plane role
- name: Setup network infrastructure for FastPass cluster
ansible.builtin.include_role:
name: cluster-network-setup
vars:
cluster_name: "{{ cluster_name }}"
cluster_endpoint: "{{ control_plane_endpoint }}"
cluster_vip: "{{ ansible_default_ipv4.address }}"
control_plane_nodes: "{{ groups['fastpass_control_plane'] }}"
This automatically:
- ✅ Creates DNS entry for
fastpass.local.mk-labs.cloud - ✅ Configures Traefik load balancer
- ✅ Tests connectivity
- ✅ Provides fallback to /etc/hosts
🚀 Next Steps
- Test the refactored approach with your FastPass cluster
- Extend to other clusters (Hub, Internal) using the same pattern
- Add support for other DNS providers if needed
- Create monitoring for DNS health checks
This modular approach makes your homelab's DNS management much more maintainable and repeatable across all your Kubernetes clusters!