# Configuración Automatizada de DNS en Linux con Ansible

- Link: https://binariocero.com/ansible/configuracion-automatizada-de-dns-en-linux-con-ansible
- Published: 2025-07-26T14:42:41+02:00
- Author: Juan José Fernández Durán

![Loading](https://binariocero.com/wp-content/plugins/page-views-count/ajax-loader-
2x.gif)

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`

    ```wp-block-preformatted
    ---- 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`

    ```wp-block-preformatted
    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`

    ```wp-block-preformatted
    ---- 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:

    ```wp-block-preformatted
    ansible-playbook /root/ansible_playbooks/debian/debian_configure_dns.yml -e "target_hosts=grupo_debian"
    ```

### Para RHEL/CentOS:

    ```wp-block-preformatted
    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:

    ```wp-block-preformatted
    cat /etc/netplan/01-dns.yamlresolvectl status
    ```

### En RHEL/CentOS:

    ```wp-block-preformatted
    cat /etc/resolv.confnmcli 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.
