# Configuración de DNS en Linux sin Netplan usando Ansible

- Link: https://binariocero.com/ansible/configuracion-de-dns-en-linux-sin-netplan-usando-ansible
- Published: 2025-07-27T11:18:47+02:00
- Author: Juan José Fernández Durán

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

En muchos entornos Linux, especialmente en servidores minimalistas o contenedores,
no se utiliza **Netplan** ni gestores de red avanzados como `NetworkManager`. En
estos casos, la configuración del sistema DNS se gestiona directamente mediante 
el archivo `/etc/resolv.conf`.

Este artículo describe cómo automatizar esta configuración mediante **Ansible**,
utilizando un playbook que:

 1. Elimina el symlink predeterminado (si existe).
 2. Crea un nuevo archivo `/etc/resolv.conf` con los servidores DNS deseados.
 3. Verifica que el contenido del archivo sea el esperado.

### Contexto

Sistemas como Ubuntu y Debian modernos pueden gestionar automáticamente `/etc/resolv.
conf` mediante `systemd-resolved`, `resolvconf` o `Netplan`, creando un **symlink**
hacia `/run/systemd/resolve/stub-resolv.conf` u otros destinos. Sin embargo, en 
algunos casos se necesita sobrescribirlo manualmente —por ejemplo, en entornos personalizados,
chroots, contenedores o servidores donde se requiere una configuración estrictamente
controlada.

### Playbook de ejemplo

A continuación, se muestra un playbook funcional de Ansible que permite gestionar
directamente `/etc/resolv.conf` sin depender de Netplan ni otras herramientas de
red:

    ```wp-block-preformatted
    - name: Configurar DNS sin Netplan en Linux  hosts: all  become: yes  vars:    dns_servers:      - 1.1.1.1      - 8.8.8.8  tasks:    - name: Eliminar symlink de /etc/resolv.conf si existe      ansible.builtin.file:        path: /etc/resolv.conf        state: absent    - name: Crear nuevo archivo /etc/resolv.conf con DNS personalizados      ansible.builtin.copy:        dest: /etc/resolv.conf        content: |          {% for dns in dns_servers %}          nameserver {{ dns }}          {% endfor %}        mode: '0644'    - name: Verificar que /etc/resolv.conf contiene los servidores DNS esperados      ansible.builtin.command: cat /etc/resolv.conf      register: resolv_output      changed_when: false    - name: Mostrar contenido actual de /etc/resolv.conf      ansible.builtin.debug:        var: resolv_output.stdout
    ```

### Detalles técnicos

#### Eliminación del symlink

El archivo `/etc/resolv.conf` puede ser un enlace simbólico gestionado por el sistema.
Para sobrescribirlo correctamente, primero se elimina, sin importar si es un archivo
regular o un symlink.

    ```wp-block-preformatted
    - name: Eliminar symlink de /etc/resolv.conf si existe  ansible.builtin.file:    path: /etc/resolv.conf    state: absent
    ```

#### Creación del archivo con DNS personalizados

Se construye el contenido dinámicamente desde la variable `dns_servers`, lo que 
permite reutilizar el playbook en distintos entornos con diferentes configuraciones.

    ```wp-block-preformatted
    - name: Crear nuevo archivo /etc/resolv.conf con DNS personalizados  ansible.builtin.copy:    dest: /etc/resolv.conf    content: |      {% for dns in dns_servers %}      nameserver {{ dns }}      {% endfor %}    mode: '0644'
    ```

#### Verificación y depuración

Estas tareas permiten confirmar que el archivo se ha escrito correctamente y ayudan
en la depuración del despliegue.

### Consideraciones finales

 * Este enfoque **no es persistente** si el sistema tiene servicios como `systemd-
   resolved` activos. Puede ser necesario deshabilitar dichos servicios para evitar
   que sobrescriban `/etc/resolv.conf`.
 * En entornos controlados, como contenedores o entornos sin gestores de red, este
   método es simple, directo y eficaz.
 * Puede complementarse con tareas adicionales para comprobar conectividad DNS o
   reiniciar servicios si es necesario.
