Capítulo 10: Automatizando con Bash

En el último capítulo, te mostraré algunos scripts de automatización que puedes ampliar más tarde para automatizar cualquier tarea que desees.
Warp Terminal

Ahora puedes usar todas las habilidades de bash que has aprendido en esta serie de Bash para principiantes para crear scripts de bash muy útiles que te ayudarán a automatizar las aburridas tareas administrativas repetitivas.

La automatización debería ser tu objetivo final siempre que escribas un script bash.

En el último capítulo, te mostraré algunos scripts de automatización que puedes ampliar más tarde para automatizar cualquier tarea que desees. Estos scripts utilizarán arrays bash, if-else, bucles y otros conceptos que has aprendido en esta serie.

Automatización de la gestión de usuarios con un script bash

Crear un usuario en múltiples servidores puede ser algo que harías a diario como administrador de sistemas. Es una tarea tediosa, así que vamos a crear un script bash que lo automatice.

Primero, crea un archivo de texto que incluya todos los nombres de host o direcciones IP de los servidores en los que deseas agregar el usuario.

Por ejemplo, aquí he creado el archivo servers.txt que incluye cinco servidores diferentes:

kabary@handbook:~$ cat servers.txt
server1
server2
server3
server4
server5

Ten en cuenta que he utilizado los nombres de host del servidor porque ya he incluido las direcciones IP en mi archivo /etc/hosts. También puedes usar el archivo de configuración SSH aquí.

Ahora echa un vistazo al siguiente script bash adduser.sh:

#!/bin/bash

servers=$(cat servers.txt)

echo -n "Enter the username: "
read name
echo -n "Enter the user id: "
read uid

for i in $servers; do
echo $i
ssh $i "sudo useradd -m -u $uid ansible"
if [ $? -eq 0 ]; then
echo "User $name added on $i"
else
echo "Error on $i"
fi
done

El script adduser.sh te pedirá primero que introduzcas el nombre de usuario y el id del usuario que quieres añadir; entonces, hará un bucle y se conectará a todos los servidores en el archivo servers.txt vía SSH y añadirá el usuario solicitado.

Vamos a ejecutar el script y ver cómo funciona:

El script se ejecutó con éxito y el usuario ansible se añadió en los cinco servidores. Hay un par de puntos importantes que debes entender:

  • Puedes utilizar frases de paso ssh vacías o ejecutar ssh-agent para evitar que se le pida que introduzca una clave (o contraseña) mientras se ejecuta el script.
  • Debes tener una cuenta válida que tenga acceso de superusuario (sin necesidad de contraseña) en todos los servidores.

Imagina que necesitas añadir un usuario en más de 100 servidores Linux diferentes. El script adduser.sh definitivamente puede ahorrarte incontables horas de trabajo.

Automatización de las copias de seguridad con el script bash

Hacer copias de seguridad es algo que todos hacemos regularmente, así que ¿por qué no automatizarlo? Echa un vistazo al siguiente script backup.sh:

#!/bin/bash

backup_dirs=("/etc" "/home" "/boot")
dest_dir="/backup"
dest_server="server1"
backup_date=$(date +%b-%d-%y)

echo "Starting backup of: ${backup_dirs[@]}"

for i in "${backup_dirs[@]}"; do
sudo tar -Pczf /tmp/$i-$backup_date.tar.gz $i
if [ $? -eq 0 ]; then
echo "$i backup succeeded."
else
echo "$i backup failed."
fi
scp /tmp/$i-$backup_date.tar.gz $dest_server:$dest_dir
if [ $? -eq 0 ]; then
echo "$i transfer succeeded."
else
echo "$i transfer failed."
fi
done

sudo rm /tmp/*.gzecho "Backup is done."

Así que, primero creaste un array llamado backup_dirs que almacena todos los nombres de directorios que queremos respaldar. Luego, creaste otras tres variables:

  • dest_dir: Para especificar el directorio de destino de la copia de seguridad.
  • dest_servidor: Para especificar el servidor de destino de la copia de seguridad.
  • backup_time: Para especificar la fecha de la copia de seguridad.

A continuación, para todos los directorios de la matriz backup_dirs, crea un archivo tar comprimido con gzip en /tmp, y luego utiliza el comando scp para enviar/copiar la copia de seguridad al servidor de destino. Finalmente, elimine todos los archivos gzip de /tmp.

Aquí hay un ejemplo de ejecución del script backup.sh:

kabary@handbook:~$ ./backup.sh
Starting backup of: /etc /home /boot
/etc backup succeeded.
etc-Aug-30-20.tar.gz 100% 1288KB 460.1KB/s   00:02
/etc transfer succeeded.
/home backup succeeded.
home-Aug-30-20.tar.gz 100% 2543KB 547.0KB/s   00:04
/home transfer succeeded.
/boot backup succeeded.
boot-Aug-30-20.tar.gz 100%  105MB 520.2KB/s   03:26
/boot transfer succeeded.
Backup is done.

Es posible que desee ejecutar las copias de seguridad todos los días a medianoche. En este caso, puede programar el script para que se ejecute como una tarea cron:

kabary@handbook:~$ crontab -e
0	0	*	*	* /home/kabary/scripts/backup.sh

Supervisión del espacio de disco disponible

Los sistemas de archivos están destinados a quedarse sin espacio, ¡lo único que puedes hacer es actuar rápido antes de que tu sistema se caiga! Puedes utilizar el comando df para ver el espacio restante en cualquier sistema de archivos:

kabary@handbook:~$ df -h / /apps /database
Filesystem Size  Used Avail Use% Mounted on
/dev/sda5 20G  7.9G   11G  44% /
/dev/mapper/vg1-applv 4.9G  2.4G  2.3G  52% /apps
/dev/mapper/vg1-dblv 4.9G  4.5G  180M  97% /database

Mi sistema de archivos /database de datos está casi sin espacio, ya que actualmente está al 97% de uso. Puedo mostrar sólo el uso si uso el comando awk para mostrar sólo el quinto campo.

Ahora eche un vistazo al siguiente script bash disk_space.sh:

#!/bin/bash
filesystems=("/" "/apps" "/database")
for i in ${filesystems[@]}; do
usage=$(df -h $i | tail -n 1 | awk '{print $5}' | cut -d % -f1)
if [ $usage -ge 90 ]; then
alert="Running out of space on $i, Usage is: $usage%"
echo "Sending out a disk space alert email."
echo $alert | mail -s "$i is $usage% full" your_email
fi
done

En primer lugar, has creado una matriz de sistemas de archivos que contiene todos los sistemas de archivos que quieres monitorizar. Luego, para cada sistema de archivos, toma el porcentaje de uso y comprueba si es mayor o igual a 90. Si el uso es superior al 90%, envía un correo electrónico de alerta indicando que el sistema de archivos se está quedando sin espacio.

Note que necesita reemplazar your_email en el script con su correo electrónico real.

He ejecutado el script:

kabary@handbook:~$ ./disk_space.sh
Sending out a disk space alert email.

Y recibí el siguiente correo electrónico en mi bandeja de entrada:

Es posible que desee ejecutar el script disk_space.sh cada seis horas aproximadamente. En este caso, también puedes programar el script para que se ejecute como una tarea cron:

kabary@handbook:~$ crontab -e
0	*/6 *		*		* /home/kabary/scripts/disk_space.sh

¡Impresionante! Esto nos lleva al final de nuestro curso de bash para principiantes. Espero que hayas disfrutado aprendiendo bash scripting. ¡Con bash scripting en tu arsenal de habilidades, puedes automatizar cualquier tarea aburrida y tediosa en Linux!

About the author
Marco Carmona

Marco Carmona

My name is Marco Antonio Carmona, I'm a physics and data science student, a great and passionate reader, and randomly, my favorite hobby is writing about what I learn day by day.

Become a Better Linux User

With the FOSS Weekly Newsletter, you learn useful Linux tips, discover applications, explore new distros and stay updated with the latest from Linux world

It's FOSS

Great! You’ve successfully signed up.

Welcome back! You've successfully signed in.

You've successfully subscribed to It's FOSS.

Success! Check your email for magic link to sign-in.

Success! Your billing info has been updated.

Your billing was not updated.