Introducción
Small Frame Studio necesita que Ava y Noah trabajen en dos hosts preparados mientras Maya conserva su acceso y sus notas. Crearás cuentas de personal dentro del alcance con Ansible, usarás sus identidades SSH reales y convertirás una declaración individual en una lista reutilizable.
Necesitas navegación básica en terminal y práctica leyendo un inventario y un playbook pequeños de Ansible. Este laboratorio explica antes de usarlos los conceptos necesarios de cuentas Linux, claves SSH, permisos, lookup y bucles. Todas las claves de formación, las identidades de host confiables y la colección independiente están preparadas.
Da a Ava un acceso funcional
En este paso crearás una cuenta del curso en dos hosts del estudio, autorizarás su clave de formación y usarás esa identidad para guardar un archivo real de trabajo.
Small Frame Studio guarda notas editoriales diferentes en web1 y web2. Maya ya trabaja en ambos; Ava necesita acceso sin perder el trabajo de Maya. Los destinos preparados son dos contenedores SSH que comparten el kernel de la VM de formación, no VMs independientes. Ansible se ejecuta en el controlador y conecta como la cuenta automation preparada. Las cuentas del personal solo existen dentro de estos destinos del curso.
Abre Controller. Comienza en el directorio del proyecto. Este comando también te devuelve allí si entras en un directorio equivocado:
cd /home/labex/project
Lee el inventario y los datos aprobados del personal con cat, que muestra archivos sin modificarlos:
cat inventory.ini
cat approved-staff.json
La lista final contiene studio_ava y studio_noah para ambos hosts. Empezaremos por Ava y después ampliaremos el mismo trabajo a una lista. Conserva estas entradas aprobadas, el inventario y los ajustes SSH preparados.
SSH autentica a un usuario en un host remoto. Una clave pública puede instalarse en el destino; la privada correspondiente permanece en el cliente y demuestra su posesión. Aquí, training-keys/ contiene claves nuevas y desechables para formación, nunca credenciales personales reales. Los archivos terminados en .pub son públicos; el nombre correspondiente sin ese sufijo es privado. No copies claves privadas a los destinos ni imprimas su contenido.
Lee la configuración preparada del cliente:
cat clients.conf
Cada alias, como web1-maya, selecciona destino, usuario del curso y clave privada. -F clients.conf indica a ssh que use esta configuración del proyecto. Fija las claves de host confiables, desactiva las solicitudes de contraseña y la reutilización de conexiones, y ofrece únicamente la identidad seleccionada. La clave del host identifica al servidor; la pública del usuario autoriza a la persona. Resuelven problemas diferentes. No desactives ninguna comprobación de confianza.
Primero observa una identidad de personal que funciona. El texto entre comillas simples es un comando ejecutado en el host remoto. El punto y coma separa allí dos comandos: identificar al usuario y leer después el archivo local de trabajo.
ssh -F clients.conf web1-maya 'id -un; cat work/briefing.txt'
Imprime studio_maya y las notas del estudio Riverside. Lee el otro host con una conexión nueva:
ssh -F clients.conf web2-maya 'id -un; cat work/briefing.txt'
Imprime la misma identidad, pero notas diferentes del estudio Hill. Conserva ambos archivos. Ahora se espera que falle la conexión de Ava porque su cuenta y autorización todavía no existen:
ssh -F clients.conf web1-ava 'id -un'
Espera Permission denied (publickey) y estado de salida 255, no una solicitud de contraseña. Un tiempo de espera de conexión o una advertencia de clave de host es otro problema: vuelve a este directorio y revisa el inventario/configuración sin modificar, en vez de debilitar la confianza SSH.
Un usuario Linux tiene directorio personal, shell de inicio y grupo principal. El módulo user crea la cuenta y, en estos destinos preparados, su grupo principal del mismo nombre. create_home: true crea el directorio personal. become: true utiliza la elevación de privilegios autorizada de la cuenta automation preparada en los destinos; no cambia el inicio de sesión de LabEx.
Escribe un playbook completo. En este here-document, > sustituye el archivo indicado del controlador y el delimitador YAML entre comillas evita la expansión del shell. Coloca el delimitador final solo al comienzo de una línea. Si escribes mal un bloque, repítelo entero para sustituir ese archivo. Si el shell sigue esperando un delimitador final que falta, pulsa Ctrl+C para cancelar la entrada incompleta y vuelve a ejecutar el bloque completo desde el prompt normal. YAML usa espacios para anidar y - para los elementos de lista.
cat > access.yml <<'YAML'
- name: Give Ava access to the studio hosts
hosts: all
become: true
gather_facts: false
tasks:
- name: Create Ava's course account
ansible.builtin.user:
name: studio_ava
shell: /bin/bash
create_home: true
- name: Keep Ava's home private
ansible.builtin.file:
path: /home/studio_ava
state: directory
owner: studio_ava
group: studio_ava
mode: '0750'
- name: Create Ava's work directory
ansible.builtin.file:
path: /home/studio_ava/work
state: directory
owner: studio_ava
group: studio_ava
mode: '0750'
- name: Authorize Ava's public key
ansible.posix.authorized_key:
user: studio_ava
key: "{{ lookup('file', 'training-keys/ava.pub') }}"
state: present
YAML
El módulo file gestiona propiedad y permisos de directorios, no el contenido de archivos de trabajo existentes. El modo 0750 da acceso completo al propietario, lectura/recorrido al grupo principal y ninguno a otros usuarios; las cifras entre comillas evitan su interpretación numérica en YAML. lookup lee una clave pública del controlador. Las llaves dobles evalúan esa expresión. state: present añade esa clave y conserva las demás; no sustituye todo el archivo de claves de la cuenta.
Los módulos que empiezan por ansible.builtin vienen con Core. ansible.posix.authorized_key pertenece a una colección independiente, instalada sin conexión para este proyecto. Crea el directorio .ssh con modo 0700 y authorized_keys con modo 0600, propiedad del usuario y su grupo principal. No necesitas instalar una colección ni editar ajustes del servidor SSH.
Comprueba primero la sintaxis YAML/playbook:
ansible-playbook access.yml --syntax-check
Ante un error de sintaxis, lee el archivo/línea indicado, compara espacios y comillas con el bloque completo, reescríbelo y repite. No hace falta reiniciar la VM. La vista previa en modo de comprobación no es fiable para esta creación inicial: una tarea posterior de claves no puede usar una cuenta cuya creación solo fue prevista por una tarea anterior. Aplica la creación declarada y usa check mode cuando las cuentas ya existan:
ansible-playbook access.yml
Ambos hosts deben terminar sin tareas fallidas ni destinos inaccesibles. Ahora entra como Ava y guarda su identidad real. Dentro de las comillas remotas, umask 027 limita los archivos nuevos como máximo a 0640; > escribe la salida de id en el archivo de llegada; cat vuelve a leerlo. El ajuste solo afecta al shell de este comando remoto.
ssh -F clients.conf web1-ava 'umask 027; id -un > work/arrival.txt; cat work/arrival.txt'
ssh -F clients.conf web2-ava 'umask 027; id -un > work/arrival.txt; cat work/arrival.txt'
Ambos imprimen studio_ava. Usaste un acceso real de personal y una escritura de archivo, no solo un resumen correcto de Ansible. Los archivos independientes y el acceso de Maya deben seguir funcionando.
Reutiliza la declaración con una lista de personal
En este paso sustituirás detalles repetidos de cuentas por datos estructurados y un bucle, añadirás a Noah y confirmarás la convergencia sin cambiar el trabajo existente.
Permanece en Controller, en /home/labex/project. Cada entrada necesita un usuario del curso y la ruta de su clave pública en el controlador. El directorio preparado group_vars está vacío. Un archivo llamado group_vars/all.yml proporciona variables a todos los hosts del inventario. Escribe la lista aprobada de dos personas:
cat > group_vars/all.yml <<'YAML'
staff:
- name: studio_ava
key_file: training-keys/ava.pub
- name: studio_noah
key_file: training-keys/noah.pub
YAML
Un host_vars/web1.yml correspondiente también puede proporcionar una lista solo para web1; los valores del host prevalecen sobre los valores compartidos del grupo. Esta unidad necesita la misma lista en ambos hosts, mientras que el challenge proporciona listas aprobadas diferentes. Las tareas reutilizables no tienen que cambiar.
Un bucle repite una tarea para cada entrada de staff. item.name lee el nombre de la entrada actual y item.key_file su ruta de clave pública. La misma lista dirige la creación de cuentas, directorios y autorizaciones. Sustituye el playbook individual por la versión reutilizable:
cat > access.yml <<'YAML'
- name: Manage the approved studio staff
hosts: all
become: true
gather_facts: false
tasks:
- name: Create each course account
ansible.builtin.user:
name: "{{ item.name }}"
shell: /bin/bash
create_home: true
loop: "{{ staff }}"
- name: Keep each home private
ansible.builtin.file:
path: "/home/{{ item.name }}"
state: directory
owner: "{{ item.name }}"
group: "{{ item.name }}"
mode: '0750'
loop: "{{ staff }}"
- name: Create each work directory
ansible.builtin.file:
path: "/home/{{ item.name }}/work"
state: directory
owner: "{{ item.name }}"
group: "{{ item.name }}"
mode: '0750'
loop: "{{ staff }}"
- name: Add each approved public key
ansible.posix.authorized_key:
user: "{{ item.name }}"
key: "{{ lookup('file', item.key_file) }}"
state: present
loop: "{{ staff }}"
YAML
Mantén el comportamiento no exclusivo predeterminado. Una operación exclusiva de claves dentro de un bucle puede retirar otra clave legítima de una iteración anterior. Este proyecto añade claves concretas y después retira una clave antigua concreta; no sustituye el conjunto completo de claves de todos.
Comprueba la sintaxis y aplica. Noah todavía no existe, por lo que sigue siendo válida la limitación de check mode para la creación inicial.
ansible-playbook access.yml --syntax-check
ansible-playbook access.yml
Ava no debería necesitar cambios nuevos, mientras Noah se crea en ambos destinos. Lee los resultados por elemento y confirma unreachable=0 y failed=0 en ambos resúmenes. Usa la identidad real de Noah para crear su propio archivo de trabajo:
ssh -F clients.conf web1-noah 'umask 027; id -un > work/arrival.txt; cat work/arrival.txt'
ssh -F clients.conf web2-noah 'umask 027; id -un > work/arrival.txt; cat work/arrival.txt'
Ambos imprimen studio_noah. Los archivos de llegada de Ava siguen siendo suyos; las notas de Maya permanecen intactas. Léelos mediante las identidades originales:
ssh -F clients.conf web1-ava 'cat work/arrival.txt'
ssh -F clients.conf web2-ava 'cat work/arrival.txt'
ssh -F clients.conf web1-maya 'cat work/briefing.txt'
ssh -F clients.conf web2-maya 'cat work/briefing.txt'
Ahora existen todos los usuarios necesarios. --check predice cambios compatibles sin aplicarlos:
ansible-playbook access.yml --check
Ambos resúmenes deben mostrar changed=0, unreachable=0 y failed=0. Repite la declaración real:
ansible-playbook access.yml
También debe informar que no hay cambios. Es idempotencia para las cuentas, directorios y autorizaciones declarados; el acceso SSH normal puede seguir escribiendo registros de inicio de sesión. El mismo bucle puede consumir otra lista aprobada sin reescribir su implementación.
Si falla un acceso, revisa el alias y la identidad seleccionados, y compara la ruta de clave pública y el usuario con los datos aprobados. Corrige la declaración en el controlador y aplícala otra vez. No repares una autorización ausente copiando una clave privada al destino, haciendo que todos puedan escribir en el directorio personal o desactivando la confianza del servidor.
Resumen
Creaste cuentas del curso, directorios privados de trabajo y autorizaciones de claves públicas; usaste identidades SSH reales para guardar trabajo; sustituiste la repetición individual por un bucle estructurado de personal; y confirmaste la convergencia conservando el acceso y las notas del personal existente.



