mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2025-09-20 17:26:04 +02:00
Refactor DNS handling and add solo record support
- Added 'solo' flag support for A/AAAA, CNAME/MX/TXT, and SRV records in sys-dns-cloudflare-records. - Simplified sys-svc-dns: removed NS management tasks and CLOUDFLARE_NAMESERVERS default. - Renamed 03_apex.yml back to 02_apex.yml, adjusted AAAA task name. - Updated web-app-bluesky DNS tasks: marked critical records with 'solo'. - Updated web-app-mailu DNS tasks: removed cleanup block, enforced 'solo' on all records. - Adjusted constructor stage to call domain_mappings with AUTO_BUILD_ALIASES parameter. Conversation: https://chatgpt.com/share/68cd20d8-9ba8-800f-b070-f7294f072c40
This commit is contained in:
@@ -1 +0,0 @@
|
||||
CLOUDFLARE_NAMESERVERS: [] # Cloudflare Nameservers for NS records
|
@@ -5,15 +5,8 @@
|
||||
The variable "CLOUDFLARE_API_TOKEN" must be defined and cannot be empty!
|
||||
when: (CLOUDFLARE_API_TOKEN | default('') | trim) == ''
|
||||
|
||||
- name: "Setup Nameservers"
|
||||
include_tasks: 02_nameservers.yml
|
||||
loop: "{{ SYS_SVC_DNS_BASE_DOMAINS | list }}"
|
||||
loop_control:
|
||||
loop_var: base_domain
|
||||
label: "{{ base_domain }}"
|
||||
|
||||
- name: "Apply apex A/AAAA for base domains"
|
||||
include_tasks: 03_apex.yml
|
||||
include_tasks: 02_apex.yml
|
||||
loop: "{{ SYS_SVC_DNS_BASE_DOMAINS | list }}"
|
||||
loop_control:
|
||||
loop_var: base_domain
|
||||
|
@@ -12,7 +12,7 @@
|
||||
async: "{{ ASYNC_TIME if ASYNC_ENABLED | bool else omit }}"
|
||||
poll: "{{ ASYNC_POLL if ASYNC_ENABLED | bool else omit }}"
|
||||
|
||||
- name: "Ensure AAAA @ for {{ base_domain }} (if IPv6 is global)"
|
||||
- name: "Ensure AAAA @ for {{ base_domain }} with '{{ networks.internet.ip6 | default('None') }}"
|
||||
community.general.cloudflare_dns:
|
||||
api_token: "{{ CLOUDFLARE_API_TOKEN }}"
|
||||
zone: "{{ base_domain }}"
|
@@ -1,60 +0,0 @@
|
||||
# Ensure CLOUDFLARE_NAMESERVERS is provided
|
||||
- name: "Assert CLOUDFLARE_NAMESERVERS is not empty"
|
||||
ansible.builtin.fail:
|
||||
msg: >
|
||||
CLOUDFLARE_NAMESERVERS must be a non-empty list of nameserver hostnames,
|
||||
e.g. ['bob.ns.cloudflare.com', 'dina.ns.cloudflare.com'].
|
||||
when: (CLOUDFLARE_NAMESERVERS | length) == 0
|
||||
|
||||
- block:
|
||||
# Gather current NS records for this base domain
|
||||
- name: "NS | Fetch existing NS records for {{ base_domain }}"
|
||||
community.general.cloudflare_dns_info:
|
||||
api_token: "{{ CLOUDFLARE_API_TOKEN }}"
|
||||
zone: "{{ base_domain }}"
|
||||
register: _cf_ns_info
|
||||
no_log: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"
|
||||
|
||||
# Build a list with ONLY the NS records (Cloudflare returns a mixed list)
|
||||
- name: "NS | Build deletion list (all NS at apex and subdomains)"
|
||||
set_fact:
|
||||
_cf_ns_to_delete: >-
|
||||
{{
|
||||
_cf_ns_info.records
|
||||
| selectattr('type', 'equalto', 'NS')
|
||||
| list
|
||||
}}
|
||||
|
||||
# Delete all existing NS records (exact matches)
|
||||
- name: "NS | Delete existing NS records"
|
||||
community.general.cloudflare_dns:
|
||||
api_token: "{{ CLOUDFLARE_API_TOKEN }}"
|
||||
zone: "{{ base_domain }}"
|
||||
type: NS
|
||||
name: "{{ item.name }}"
|
||||
value: "{{ item.value | default(item.content) }}"
|
||||
state: absent
|
||||
ttl: 1
|
||||
loop: "{{ _cf_ns_to_delete }}"
|
||||
loop_control:
|
||||
label: "NS {{ item.name }} -> {{ item.value | default(item.content) }}"
|
||||
no_log: "{{ MASK_CREDENTIALS_IN_LOGS | bool }}"
|
||||
async: "{{ ASYNC_TIME if ASYNC_ENABLED | bool else omit }}"
|
||||
poll: "{{ ASYNC_POLL if ASYNC_ENABLED | bool else omit }}"
|
||||
when: MODE_CLEANUP | bool
|
||||
|
||||
# Create enforced NS set at the zone apex (@)
|
||||
- name: "NS | Create NS apex set for {{ base_domain }}"
|
||||
community.general.cloudflare_dns:
|
||||
api_token: "{{ CLOUDFLARE_API_TOKEN }}"
|
||||
zone: "{{ base_domain }}"
|
||||
type: NS
|
||||
name: "@"
|
||||
value: "{{ item }}"
|
||||
ttl: 1
|
||||
state: present
|
||||
loop: "{{ CLOUDFLARE_NAMESERVERS }}"
|
||||
loop_control:
|
||||
label: "@ -> {{ item }}"
|
||||
async: "{{ ASYNC_TIME if ASYNC_ENABLED | bool else omit }}"
|
||||
poll: "{{ ASYNC_POLL if ASYNC_ENABLED | bool else omit }}"
|
Reference in New Issue
Block a user