En entornos empresariales, la configuración correcta de los servidores DNS es fundamental para garantizar la resolución de nombres en la red interna y externa. Este artículo presenta una solución automatizada para establecer servidores DNS en sistemas Debian/Ubuntu y RHEL/CentOS usando Ansible. Se explica cómo aplicar estas configuraciones de forma reproducible y escalable.
Requisitos previos
- Ansible instalado en el nodo de control.
- Acceso SSH con privilegios de
sudo
a los nodos de destino. - Inventario de hosts definido (estático o dinámico).
- Variables definidas por grupo o por host (
target_hosts
).
1. Configuración DNS en Debian/Ubuntu
En los sistemas Debian y Ubuntu modernos, Netplan gestiona la configuración de red. Para modificar los DNS, es necesario generar un archivo YAML en /etc/netplan
y aplicar los cambios.
Playbook: debian_configure_dns.yml
---
- name: Configurar DNS en Debian/Ubuntu
hosts: "{{ target_hosts }}"
become: true
vars:
dns_servers:
- "8.8.8.8"
- "1.1.1.1"
tasks:
- name: Crear archivo Netplan con DNS
ansible.builtin.template:
src: dns-netplan.yaml.j2
dest: /etc/netplan/01-dns.yaml
mode: '0644'
- name: Aplicar configuración de Netplan
ansible.builtin.command: netplan apply
Plantilla Jinja2: templates/dns-netplan.yaml.j2
network:
version: 2
ethernets:
{{ ansible_default_ipv4.interface }}:
nameservers:
addresses:{{ dns_servers }}
Esta plantilla genera dinámicamente el archivo 01-dns.yaml
con la interfaz predeterminada detectada por Ansible (ansible_default_ipv4.interface
) y las direcciones DNS especificadas.
2. Configuración DNS en RHEL/CentOS
En estos sistemas, NetworkManager suele gestionar el DNS. Para personalizarlo, se desactiva su control de DNS y se modifica directamente el archivo /etc/resolv.conf
.
Playbook: redhat_configure_dns.yml
---
- name: Configurar DNS en RHEL/CentOS
hosts: "{{ target_hosts }}"
become: true
vars:
dns_servers:
- "8.8.8.8"
- "1.1.1.1"
tasks:
- name: Deshabilitar configuración DNS por NetworkManager
ansible.builtin.lineinfile:
path: /etc/NetworkManager/conf.d/dns.conf
line: "dns=none"
create: yes
- name: Establecer DNS en /etc/resolv.conf
ansible.builtin.copy:
dest: /etc/resolv.conf
content: |
nameserver 8.8.8.8
nameserver 1.1.1.1
mode: '0644'
- name: Reiniciar NetworkManager
ansible.builtin.service:
name: NetworkManager
state: restarted
Ejecución de los Playbooks
Desde el nodo de control de Ansible, puedes ejecutar los playbooks de la siguiente manera:
Para Debian/Ubuntu:
ansible-playbook /root/ansible_playbooks/debian/debian_configure_dns.yml -e "target_hosts=grupo_debian"
Para RHEL/CentOS:
ansible-playbook /root/ansible_playbooks/redhat/redhat_configure_dns.yml -e "target_hosts=grupo_redhat"
Nota: Reemplaza grupo_debian
y grupo_redhat
con los nombres reales de los grupos definidos en tu inventario (hosts.ini
).
Verificación
Después de la ejecución, puedes verificar los cambios en los nodos destino:
En Debian/Ubuntu:
cat /etc/netplan/01-dns.yaml
resolvectl status
En RHEL/CentOS:
cat /etc/resolv.conf
nmcli dev show | grep DNS
Conclusión
El uso de Ansible para configurar DNS proporciona una solución centralizada, auditable y repetible. Esto minimiza errores manuales y asegura uniformidad en los entornos heterogéneos. Adaptar estos playbooks a tus necesidades específicas (por ejemplo, agregar búsqueda de dominios o múltiples interfaces) es sencillo gracias a la modularidad de Ansible y las plantillas Jinja2.