# Unión de sistemas Linux a un dominio Active Directory con Ansible

- Link: https://binariocero.com/ansible/union-de-sistemas-linux-a-un-dominio-active-directory-con-ansible
- Published: 2025-08-03T10:42:42+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 es común requerir la integración de sistemas Linux en 
un dominio Active Directory (AD), permitiendo una gestión centralizada de usuarios
y políticas de seguridad. Esta operación, aunque posible manualmente mediante herramientas
como `realmd`, `sssd` y `adcli`, puede automatizarse de forma eficiente utilizando
Ansible, lo que permite ahorrar tiempo, reducir errores y asegurar la homogeneidad
en múltiples servidores.

Este artículo presenta un _playbook_ de Ansible diseñado para unir sistemas Linux
basados en Debian/Ubuntu o RHEL/CentOS/Rocky a un dominio AD. Incluye detección 
automática del sistema operativo, instalación de los paquetes requeridos, verificación
previa de conectividad DNS, unión condicional al dominio, y la opción de reiniciar
el sistema al finalizar.

### Requisitos

Antes de ejecutar el playbook, se deben cumplir los siguientes requisitos:

 * **Conectividad de red** con el controlador de dominio (puertos DNS, LDAP, Kerberos).
 * El sistema Linux debe tener **configurado el DNS** apuntando al servidor AD.
 * Contar con un **usuario en el dominio con permisos para unir equipos**.
 * Tener configurado **Ansible en un nodo de gestión**, con acceso SSH a los equipos
   objetivo.
 * Opcionalmente, usar **Ansible Vault** para proteger las credenciales sensibles.

### Variables definidas

 * `domain_name`: Nombre FQDN del dominio al que se desea unir el sistema.
 * `organizational_unit`: Ruta LDAP de la OU donde se registrará el equipo (opcional).
 * `ad_user_name` y `ad_password`: Credenciales con permisos para la operación.
 * `force_restart`: Si se establece a `true`, reiniciará el sistema tras unirse.

### Automatización con Ansible

A continuación, se incluye el _playbook_ que automatiza el proceso de unión al dominio:

    ```wp-block-preformatted
    ---- name: Join Linux system to Active Directory domain  hosts: all  become: yes  vars:    domain_name: "yourdomain.local"    organizational_unit: ""            # Opcional: "OU=Servers,DC=yourdomain,DC=local"    ad_user_name: "admin_joiner"    ad_password: "SuperSecretPassword"    force_restart: false  tasks:    - name: Gather OS facts      ansible.builtin.setup:        gather_subset: min    - name: Install required packages (Debian/Ubuntu)      apt:        name:          - realmd          - sssd          - adcli          - oddjob          - oddjob-mkhomedir          - samba-common-bin          - packagekit        state: present        update_cache: yes      when: ansible_facts['os_family'] == "Debian"    - name: Install required packages (RedHat/CentOS/Rocky)      yum:        name:          - realmd          - sssd          - adcli          - oddjob          - oddjob-mkhomedir          - samba-common-tools        state: present      when: ansible_facts['os_family'] == "RedHat"    - name: Check DNS resolution of domain      ansible.builtin.shell: "getent hosts {{ domain_name }}"      register: dns_check      changed_when: false      failed_when: dns_check.rc != 0    - name: Check if already joined to domain      ansible.builtin.shell: "realm list | grep -iq '^realm-name: {{ domain_name }}'"      register: realm_check      changed_when: false      failed_when: false    - name: Join to AD domain      ansible.builtin.shell: |        echo "{{ ad_password }}" | realm join --user="{{ ad_user_name }}" {{ domain_name }} {% if organizational_unit != '' %} --computer-ou="{{ organizational_unit }}" {% endif %}      when: realm_check.rc != 0      register: join_result      changed_when: "'successfully enrolled' in join_result.stdout.lower()"      failed_when: join_result.rc != 0    - name: Reboot if requested      ansible.builtin.reboot:        reboot_timeout: 600      when: force_restart | bool
    ```

### Consideraciones de seguridad

Para evitar exponer credenciales en texto plano, se recomienda el uso de **Ansible
Vault** para cifrar la contraseña de `ad_password`. Esto se puede lograr con:

    ```wp-block-preformatted
    ansible-vault encrypt_string 'SuperSecretPassword' --name 'ad_password'
    ```

También se sugiere restringir la ejecución de este playbook a través de políticas
y roles específicos dentro del equipo de operaciones.

### Conclusión

Automatizar la unión de sistemas Linux a Active Directory es una tarea esencial 
en entornos heterogéneos. Usar Ansible para ello no solo mejora la eficiencia, sino
que garantiza consistencia, trazabilidad y facilita la escalabilidad en la operación.
Este playbook puede ser adaptado y ampliado para incluir más validaciones, configuración
post-unión, o incluso integración con herramientas de monitorización o inventario.
