Objetivo: Configurar un entorno de aula virtualizado utilizando Linux Mint en máquinas virtuales y Ansible para la gestión centralizada de las configuraciones. El objetivo principal es restringir la instalación de software por parte de los usuarios normales (alumnos), permitiendo únicamente la instalación y gestión a través de Ansible desde una máquina de control. Se proporcionará un ejemplo de cómo instalar software (Google Chrome) utilizando un playbook de Ansible.
Paso 1: Requisitos Previos
Antes de comenzar, asegúrate de tener lo siguiente:
- Máquina de Control: 1 x Máquina (física o virtual) con Linux Mint instalado. Aquí es donde se instalará Ansible.
- Nodos Gestionados (Aulas): 2 x Máquinas Virtuales con Linux Mint instalado (llamadas aula01 y aula02 en este ejemplo).
- Red: Todas las máquinas deben estar en la misma red y poder comunicarse entre sí. Necesitarás conocer las direcciones IP de aula01 y aula02.
- Usuario con privilegios sudo: Un usuario con permisos sudo debe existir en aula01 y aula02 para la configuración inicial de SSH y para que Ansible pueda realizar tareas administrativas (become: yes). En este ejemplo, asumiremos que existe un usuario (p. ej., mintuser) con sudo en ambas VMs de aula. Posteriormente crearemos usuarios administradores específicos.
Paso 2: Configuración de la Máquina de Control
En tu máquina designada como “Máquina de Control”:
1.Actualizar el sistema
sudo apt update && sudo apt upgrade -y
2.Instalar Ansible
sudo apt install ansible -y
3.Verificar la Instalación
ansible --version
Paso 3: Configurar Acceso SSH sin Contraseña (Desde Control a Aulas)
Ansible utiliza SSH para conectarse a los nodos gestionados. Configurar claves SSH evita tener que introducir contraseñas constantemente.
1. Generar claves SSH en la máquina de control
ssh-keygen -t rsa -b 4096
Copiar la clave pública a aula01 y aula02:
Reemplaza USUARIO_EN_AULA con el nombre del usuario con privilegios sudo que existe en las máquinas virtuales (p. ej., mintuser) y IP_AULA01 / IP_AULA02 con las direcciones IP correspondientes. Te pedirá la contraseña de USUARIO_EN_AULA para cada máquina.
ssh-copy-id USUARIO_EN_AULA@IP_AULA01
ssh-copy-id USUARIO_EN_AULA@IP_AULA02
Probar la conexión SSH (Opcional pero recomendado): Verifica que puedes conectarte sin contraseña.
ssh USUARIO_EN_AULA@IP_AULA01
exit
ssh USUARIO_EN_AULA@IP_AULA02
exit
Paso 4: Configurar el Inventario de Ansible
El inventario es un archivo donde Ansible encuentra la información sobre los nodos que gestiona.
- Editar el archivo de hosts de Ansible:
Usaremos el archivo de inventario por defecto. Necesitarás permisos de superusuario para editarlo.sudo nano /etc/ansible/hosts
(Nota: Para proyectos más grandes, es común usar un archivo inventory o hosts dentro del propio directorio del proyecto).
Agregar las máquinas virtuales al inventario:
Añade las siguientes líneas al final del archivo. Reemplaza IP_AULA01 e IP_AULA02 con las IPs reales. ansible_user debe ser el usuario para el que copiaste la clave SSH en el paso anterior.
[aula]
aula01 ansible_host=IP_AULA01 ansible_user=USUARIO_EN_AULA
aula02 ansible_host=IP_AULA02 ansible_user=USUARIO_EN_AULA
- [aula] define un grupo llamado aula.
- aula01, aula02 son los nombres que usaremos en Ansible para referirnos a estas máquinas.
- ansible_host especifica la IP o nombre DNS.
- ansible_user especifica el usuario SSH a usar.
Probar la conexión con Ansible: Usa el módulo ping de Ansible para verificar que puede conectar con las máquinas del grupo aula.
ansible -m ping aula
Deberías ver una respuesta SUCCESS con “ping”: “pong” para cada máquina (aula01 y aula02).
Paso 5: Crear Usuarios Administradores y Alumnos con Ansible
Ahora usaremos un playbook para crear los usuarios necesarios en las máquinas de aula.
- Crear un archivo de playbook:
Crea un archivo llamado crear_usuarios.yml (puedes usar nano o tu editor preferido).nano crear_usuarios.yml
Agregar el siguiente contenido al playbook:
Este playbook define dos tareas: una para crear administradores (con sudo) y otra para crear alumnos (sin sudo).
- name: Crear usuarios administradores y alumnos en las máquinas de aula
hosts: aula # Ejecutar en todas las máquinas del grupo [aula]
become: yes # Ejecutar tareas como root (necesario para crear usuarios)
tasks:
- name: Crear usuarios administradores
ansible.builtin.user:
name: "{{ item }}" # Nombre del usuario tomado del loop
# ¡Importante! Usar contraseñas más seguras en un entorno real
# Considera usar Ansible Vault para cifrar las contraseñas hash
password: "{{ 'admin123' | password_hash('sha512') }}" # Contraseña hasheada
groups: sudo # Añadir al grupo sudo para privilegios de administrador
shell: /bin/bash
state: present # Asegura que el usuario exista
loop:
- administrador01
- administrador02
- name: Crear usuarios alumnos sin privilegios sudo
ansible.builtin.user:
name: "{{ item }}"
password: "{{ 'alumno123' | password_hash('sha512') }}"
shell: /bin/bash
state: present # No se especifica 'groups: sudo', por lo que no tendrán privilegios
loop:
- alumno01
- alumno02
Ejecutar el playbook:
Desde la Máquina de Control, ejecuta el playbook.
ansible-playbook crear_usuarios.yml
- Ansible se conectará a aula01 y aula02 y ejecutará las tareas para crear los usuarios.(Nota: A partir de ahora, podrías cambiar ansible_user en tu inventario a administrador01 o administrador02 si prefieres que Ansible use estas cuentas para futuras conexiones, pero asegúrate de copiar también la clave SSH a estas nuevas cuentas si lo haces).
Paso 6: Restringir Permisos de Instalación a los Alumnos
Usaremos polkit (PolicyKit) para definir una regla que impida a los usuarios alumno01 y alumno02 usar apt.
- Crear un playbook para restringir la instalación:
nano restringir_instalacion.yml
Agregar el siguiente contenido al playbook:
Este playbook copia un archivo de reglas de polkit.
---
- name: Restringir instalación de software (apt) a los alumnos
hosts: aula
become: yes
tasks:
- name: Bloquear acciones de apt para alumnos específicos con polkit
ansible.builtin.copy:
dest: /etc/polkit-1/localauthority/50-local.d/10-restrict-apt.pkla # Ubicación estándar para reglas locales
content: |
[Denegar gestión de paquetes APT a alumnos]
Identity=unix-user:alumno01;unix-user:alumno02
Action=org.debian.apt.*;org.freedesktop.packagekit.package-install;org.freedesktop.packagekit.package-remove
ResultAny=no
ResultInactive=no
ResultActive=no
La regla especifica las identidades (alumno01, alumno02).
Define las acciones relacionadas con apt y packagekit (usado por algunas herramientas gráficas) que se van a bloquear.
Result*=no deniega el permiso para estas acciones a los usuarios especificados.
Ejecutar el playbook:
ansible-playbook restringir_instalacion.yml
Paso 7: Instalar Google Chrome con Ansible (Ejemplo de Gestión Centralizada)
Ahora, como administradores, instalaremos software en todas las máquinas de aula usando Ansible.
- Crear el playbook de instalación:
nano instalar_chrome.yml
Agregar el siguiente contenido al playbook:
Este playbook descarga el paquete .deb de Google Chrome y luego usa el módulo apt para instalarlo, gestionando las dependencias.
- name: Instalar Google Chrome en las máquinas de aula
hosts: aula
become: yes
tasks:
- name: Descargar el paquete .deb de Google Chrome Stable
ansible.builtin.get_url:
url: https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
dest: /tmp/google-chrome-stable_current_amd64.deb # Descargar a un directorio temporal
mode: '0644' # Permisos del archivo descargado
- name: Instalar Google Chrome desde el archivo .deb descargado
ansible.builtin.apt:
deb: /tmp/google-chrome-stable_current_amd64.deb
state: present # Asegura que esté instalado
# El módulo apt con 'deb:' maneja la instalación y dependencias
- name: Limpiar el archivo .deb descargado (opcional)
ansible.builtin.file:
path: /tmp/google-chrome-stable_current_amd64.deb
state: absent
Ejecutar el playbook:
ansible-playbook instalar_chrome.yml
Paso 8: Verificación
Comprueba que todo funciona como se espera.
- Acceso SSH: Asegúrate de que todavía puedes acceder vía SSH (si no cambiaste ansible_user, usa ese; si lo cambiaste, usa el nuevo usuario administrador). Reemplaza IP_AULA… y el usuario si es necesario.
ssh USUARIO_CONFIGURADO_EN_INVENTARIO@IP_AULA01
exit
ssh USUARIO_CONFIGURADO_EN_INVENTARIO@IP_AULA02
exit
Usuarios Creados: Conéctate a una de las máquinas de aula (p. ej., aula01) y verifica que los usuarios existen.
ssh USUARIO_CONFIGURADO_EN_INVENTARIO@IP_AULA01
getent passwd | grep -E '(alumno|administrador)' # Busca líneas con alumno o administrador
exit
Deberías ver las entradas para administrador01, administrador02, alumno01 y alumno02.
Restricción de Instalación: Conéctate a una máquina de aula y intenta instalar algo como un usuario alumno.
ssh USUARIO_CONFIGURADO_EN_INVENTARIO@IP_AULA01
su - alumno01 # Cambiar al usuario alumno01 (pedirá la contraseña 'alumno123')
sudo apt update # Intentar actualizar lista de paquetes
# Debería fallar con un error de autenticación o permisos de polkit
sudo apt install vim # Intentar instalar un paquete
# Debería fallar igualmente
exit # Salir de la sesión de alumno01
exit # Salir de la sesión SSH
Repite para alumno02 si quieres estar seguro. El comando sudo debería fallar indicando que el usuario no tiene permiso o pidiendo una contraseña que el alumno no debería tener (la de administrador).
Google Chrome Instalado: Conéctate a una máquina de aula y verifica que Chrome está instalado.
ssh USUARIO_CONFIGURADO_EN_INVENTARIO@IP_AULA01
google-chrome --version
# O alternativamente:
# which google-chrome
# dpkg -l | grep google-chrome
exit
- Deberías ver la versión de Google Chrome instalada o la ruta al ejecutable.
Conclusión
Siguiendo esta guía, has logrado:
- Instalar y configurar Ansible en la máquina de control.
- Configurar acceso SSH sin contraseña desde la máquina de control a las máquinas de aula.
- Definir un inventario de Ansible para gestionar las máquinas de aula.
- Crear usuarios administradores y alumnos de forma centralizada usando un playbook de Ansible.
- Restringir los permisos de instalación de software (apt) para los usuarios alumnos mediante polkit.
- Instalar una aplicación (Google Chrome) en todas las máquinas de aula de manera automatizada y centralizada utilizando Ansible.