🏋️ Ejercicios — Clase 01: Linux + Deploy
Practicá todo lo que viste en la Clase 01. Cada ejercicio tiene pistas y solución. Intentá resolverlo solo antes de mirar.
👉 Usá el Playground ROXS en KillerCoda para practicar.
Ejercicio 1 — Explorador de archivos
Nivel: 🟢 Fácil
Creá la siguiente estructura de carpetas y archivos:
/root/bootcamp/
├── clase-01/
│ ├── notas.txt (con el texto "Hoy aprendí Linux")
│ └── comandos.txt (con el texto "pwd, ls, cd, mkdir")
├── clase-02/
│ └── pendiente.txt (vacío)
└── README.txt (con el texto "DevOps Bootcamp by ROXS")
Después:
- Listá todo el contenido de
/root/bootcamp/de forma recursiva - Copiá
notas.txtaclase-02/ - Renombrá
pendiente.txtacompletado.txt - Mostrá el contenido de todos los
.txtcon un solo comando
💡 Pistas
mkdir -pcrea carpetas intermediasecho "texto" > archivoescribe en un archivols -Rlista recursivamentecatacepta múltiples archivosmvsirve para renombrar
✅ Solución
# Crear estructura
mkdir -p /root/bootcamp/clase-01
mkdir -p /root/bootcamp/clase-02
echo "Hoy aprendí Linux" > /root/bootcamp/clase-01/notas.txt
echo "pwd, ls, cd, mkdir" > /root/bootcamp/clase-01/comandos.txt
touch /root/bootcamp/clase-02/pendiente.txt
echo "DevOps Bootcamp by ROXS" > /root/bootcamp/README.txt
# 1. Listar recursivo
ls -R /root/bootcamp/
# 2. Copiar
cp /root/bootcamp/clase-01/notas.txt /root/bootcamp/clase-02/
# 3. Renombrar
mv /root/bootcamp/clase-02/pendiente.txt /root/bootcamp/clase-02/completado.txt
# 4. Mostrar todos los .txt
cat /root/bootcamp/clase-01/*.txt /root/bootcamp/clase-02/*.txt /root/bootcamp/README.txt
Ejercicio 2 — Detective de sistema
Nivel: 🟢 Fácil
Creá un archivo llamado info-sistema.txt en tu home que contenga:
- El nombre del sistema operativo (pista:
/etc/os-release) - El usuario actual
- El directorio actual
- La fecha y hora
- El espacio en disco disponible
- La memoria RAM disponible
Todo con un solo bloque de comandos redirigidos al archivo.
💡 Pistas
>>agrega al final del archivo (no sobreescribe)df -hmuestra espacio en discofree -hmuestra memoria RAMdatemuestra fecha y hora
✅ Solución
echo "=== INFO DEL SISTEMA ===" > ~/info-sistema.txt
echo "SO:" >> ~/info-sistema.txt
cat /etc/os-release >> ~/info-sistema.txt
echo "" >> ~/info-sistema.txt
echo "Usuario: $(whoami)" >> ~/info-sistema.txt
echo "Directorio: $(pwd)" >> ~/info-sistema.txt
echo "Fecha: $(date)" >> ~/info-sistema.txt
echo "" >> ~/info-sistema.txt
echo "=== DISCO ===" >> ~/info-sistema.txt
df -h >> ~/info-sistema.txt
echo "" >> ~/info-sistema.txt
echo "=== MEMORIA ===" >> ~/info-sistema.txt
free -h >> ~/info-sistema.txt
cat ~/info-sistema.txt
Ejercicio 3 — Multi-sitio con Nginx
Nivel: 🟡 Intermedio
Configurá Nginx para servir dos sitios diferentes en el mismo servidor:
- Sitio A:
/var/www/sitio-a/→ una página con fondo azul que diga "Sitio A" - Sitio B:
/var/www/sitio-b/→ una página con fondo verde que diga "Sitio B"
Sitio A debe responder en el puerto 80 y Sitio B en el puerto 8080.
Verificá ambos con curl.
💡 Pistas
- Cada sitio necesita su propio archivo en
/etc/nginx/sites-available/ - Cambiá
listen 80porlisten 8080en el segundo - Ambos necesitan un symlink en
sites-enabled curl http://localhostycurl http://localhost:8080
✅ Solución
# Instalar Nginx
apt update && apt install nginx -y
# Crear directorios
mkdir -p /var/www/sitio-a /var/www/sitio-b
# Sitio A - HTML
cat > /var/www/sitio-a/index.html << 'EOF'
<!DOCTYPE html>
<html><head><title>Sitio A</title>
<style>body{background:#1e3a5f;color:white;display:flex;
align-items:center;justify-content:center;min-height:100vh;
font-family:sans-serif;font-size:3rem}</style></head>
<body><h1>🔵 Sitio A — Puerto 80</h1></body></html>
EOF
# Sitio B - HTML
cat > /var/www/sitio-b/index.html << 'EOF'
<!DOCTYPE html>
<html><head><title>Sitio B</title>
<style>body{background:#1a5f3a;color:white;display:flex;
align-items:center;justify-content:center;min-height:100vh;
font-family:sans-serif;font-size:3rem}</style></head>
<body><h1>🟢 Sitio B — Puerto 8080</h1></body></html>
EOF
# Config Nginx - Sitio A
cat > /etc/nginx/sites-available/sitio-a << 'EOF'
server {
listen 80;
server_name _;
root /var/www/sitio-a;
index index.html;
location / { try_files $uri $uri/ =404; }
}
EOF
# Config Nginx - Sitio B
cat > /etc/nginx/sites-available/sitio-b << 'EOF'
server {
listen 8080;
server_name _;
root /var/www/sitio-b;
index index.html;
location / { try_files $uri $uri/ =404; }
}
EOF
# Activar
rm -f /etc/nginx/sites-enabled/default
ln -sf /etc/nginx/sites-available/sitio-a /etc/nginx/sites-enabled/
ln -sf /etc/nginx/sites-available/sitio-b /etc/nginx/sites-enabled/
# Permisos
chown -R www-data:www-data /var/www/sitio-a /var/www/sitio-b
# Verificar y reiniciar
nginx -t && systemctl restart nginx
# Probar
curl http://localhost
curl http://localhost:8080
Ejercicio 4 — Deploy desde GitHub
Nivel: 🟡 Intermedio
Hacé un deploy de un sitio web real desde un repositorio de GitHub:
- Instalá
git - Cloná este repo de ejemplo:
https://github.com/roxsross/static-website-example.git - Mové los archivos a
/var/www/github-site/ - Configurá Nginx para servirlo en el puerto 80
- Verificá con
curl
Si el repo no existe, creá vos un HTML simple y simulá el flujo completo.
💡 Pistas
apt install git -ygit clone URL directorio- Podés clonar directo a
/var/www/github-site - No te olvides de los permisos:
chown -R www-data:www-data
✅ Solución
apt update && apt install git nginx -y
# Clonar (o crear si no existe)
git clone https://github.com/roxsross/static-website-example.git /var/www/github-site 2>/dev/null || {
mkdir -p /var/www/github-site
cat > /var/www/github-site/index.html << 'EOF'
<!DOCTYPE html>
<html><head><title>Deploy desde Git</title>
<style>body{background:#1a1a2e;color:#eee;display:flex;
align-items:center;justify-content:center;min-height:100vh;
font-family:sans-serif;text-align:center}
h1{font-size:2.5rem}p{opacity:.7}</style></head>
<body><div><h1>🐙 Deploy desde GitHub</h1>
<p>Sitio desplegado con git clone + Nginx</p></div></body></html>
EOF
}
# Config Nginx
cat > /etc/nginx/sites-available/github-site << 'EOF'
server {
listen 80;
server_name _;
root /var/www/github-site;
index index.html;
location / { try_files $uri $uri/ =404; }
}
EOF
rm -f /etc/nginx/sites-enabled/default
ln -sf /etc/nginx/sites-available/github-site /etc/nginx/sites-enabled/
chown -R www-data:www-data /var/www/github-site
nginx -t && systemctl restart nginx
curl http://localhost
Ejercicio 5 — Troubleshooting
Nivel: 🔴 Avanzado
Alguien configuró un servidor y no funciona. Ejecutá estos comandos para "romper" el servidor y después arreglalo:
# Ejecutá esto para crear el problema
apt update && apt install nginx -y
mkdir -p /var/www/roto
echo "<h1>Sitio roto</h1>" > /var/www/roto/index.html
cat > /etc/nginx/sites-available/roto << 'EOF'
server {
listen 80;
server_name _;
root /var/www/rotoo;
index index.htm;
location / { try_files $uri $uri/ =404; }
}
EOF
rm -f /etc/nginx/sites-enabled/default
ln -sf /etc/nginx/sites-available/roto /etc/nginx/sites-enabled/
chmod 000 /var/www/roto/index.html
systemctl restart nginx
Hay 3 errores. Encontralos y arreglalos.
💡 Pistas
- Mirá bien el
rooten la config de Nginx - El
indexapunta a un archivo que no existe con ese nombre - Los permisos del archivo están en
000
✅ Solución
Los 3 errores:
root /var/www/rotoo→ debería serroot /var/www/roto(typo: doble "o")index index.htm→ debería serindex index.html(falta la "l")chmod 000→ el archivo no tiene permisos de lectura
# Arreglar config
sed -i 's|/var/www/rotoo|/var/www/roto|' /etc/nginx/sites-available/roto
sed -i 's|index.htm;|index.html;|' /etc/nginx/sites-available/roto
# Arreglar permisos
chmod 644 /var/www/roto/index.html
chown www-data:www-data /var/www/roto/index.html
# Verificar y reiniciar
nginx -t && systemctl restart nginx
curl http://localhost
🏆 Desafío extra
Creá una página web que muestre información del servidor en tiempo real. La página debe mostrar:
- Hostname del servidor
- IP del servidor
- Uptime
- Uso de disco
- Fecha de generación
Podés generar el HTML con un script que use $(comando) para insertar datos reales del sistema.