prole/infrastructure/roles/samba_dns/tasks/ensure_a.yml

50 lines
2.1 KiB
YAML

---
- name: Determine zone and record name
ansible.builtin.set_fact:
samba_target_zone: "{{ 'internal.' ~ prole_domain if item.fqdn.endswith('.internal.' ~ prole_domain) or item.fqdn == 'internal.' ~ prole_domain else prole_domain }}"
samba_dns_record_name: >-
{% set fqdn_clean = item.fqdn | regex_replace('\\.?$', '') %}
{% if fqdn_clean == ('internal.' ~ prole_domain if item.fqdn.endswith('.internal.' ~ prole_domain) or item.fqdn == 'internal.' ~ prole_domain else prole_domain) %}
@
{% else %}
{{ fqdn_clean | regex_replace('\\.' ~ (('internal.' ~ prole_domain if item.fqdn.endswith('.internal.' ~ prole_domain) or item.fqdn == 'internal.' ~ prole_domain else prole_domain) | regex_escape) ~ '$', '') }}
{% endif %}
- name: Query existing A records
ansible.builtin.command:
cmd: samba-tool dns query {{ samba_dns_server }} {{ samba_target_zone }} {{ samba_dns_record_name }} A -P
register: a_query
changed_when: false
failed_when: false
- name: Parse existing A record values
ansible.builtin.set_fact:
a_existing_values: >-
{{
(a_query.stdout | default('') |
regex_findall('\\bA\\s+([0-9]{1,3}(?:\\.[0-9]{1,3}){3})\\b') |
list)
}}
- name: Remove stale A records
ansible.builtin.command:
cmd: samba-tool dns delete {{ samba_dns_server }} {{ samba_target_zone }} {{ samba_dns_record_name }} A {{ a_value }} -P
loop: "{{ a_existing_values | difference(item.ipv4s) }}"
loop_control:
loop_var: a_value
when: (a_existing_values | difference(item.ipv4s) | length) > 0
- name: Add missing A records
ansible.builtin.command:
cmd: samba-tool dns add {{ samba_dns_server }} {{ samba_target_zone }} {{ samba_dns_record_name }} A {{ a_target_ip }} -P
register: a_add
changed_when: a_add.rc == 0
failed_when: >
a_add.rc != 0 and
('WERR_DNS_ERROR_RECORD_ALREADY_EXISTS' not in (a_add.stderr | default(''))) and
('Record already exists' not in (a_add.stderr | default('')))
loop: "{{ item.ipv4s | difference(a_existing_values) }}"
loop_control:
loop_var: a_target_ip
when: (item.ipv4s | difference(a_existing_values) | length) > 0