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:
- Elimina el symlink predeterminado (si existe).
- Crea un nuevo archivo
/etc/resolv.conf
con los servidores DNS deseados. - 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:
- 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.
- 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.
- 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.