Saltar al contenido principal

🏋️ 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:

  1. Listá todo el contenido de /root/bootcamp/ de forma recursiva
  2. Copiá notas.txt a clase-02/
  3. Renombrá pendiente.txt a completado.txt
  4. Mostrá el contenido de todos los .txt con un solo comando
💡 Pistas
  • mkdir -p crea carpetas intermedias
  • echo "texto" > archivo escribe en un archivo
  • ls -R lista recursivamente
  • cat acepta múltiples archivos
  • mv sirve 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:

  1. El nombre del sistema operativo (pista: /etc/os-release)
  2. El usuario actual
  3. El directorio actual
  4. La fecha y hora
  5. El espacio en disco disponible
  6. La memoria RAM disponible

Todo con un solo bloque de comandos redirigidos al archivo.

💡 Pistas
  • >> agrega al final del archivo (no sobreescribe)
  • df -h muestra espacio en disco
  • free -h muestra memoria RAM
  • date muestra 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 80 por listen 8080 en el segundo
  • Ambos necesitan un symlink en sites-enabled
  • curl http://localhost y curl 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:

  1. Instalá git
  2. Cloná este repo de ejemplo: https://github.com/roxsross/static-website-example.git
  3. Mové los archivos a /var/www/github-site/
  4. Configurá Nginx para servirlo en el puerto 80
  5. Verificá con curl

Si el repo no existe, creá vos un HTML simple y simulá el flujo completo.

💡 Pistas
  • apt install git -y
  • git 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
  1. Mirá bien el root en la config de Nginx
  2. El index apunta a un archivo que no existe con ese nombre
  3. Los permisos del archivo están en 000
✅ Solución

Los 3 errores:

  1. root /var/www/rotoo → debería ser root /var/www/roto (typo: doble "o")
  2. index index.htm → debería ser index index.html (falta la "l")
  3. 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
tip

Podés generar el HTML con un script que use $(comando) para insertar datos reales del sistema.


🔗 Recursos