Categorías
GNU-Linux Script

Crea y ejecuta tu primer script de Bash Shell

Automatización

Automatización con Bash

Ahora puedes usar todas las habilidades de bash que has aprendido 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 este capítulo, te mostraré algunos scripts de automatización que luego puedes ampliar para automatizar cualquier tarea que desees. Estos scripts utilizarán arrays bash, if-else, bucles y otros conceptos que has aprendido.

Automatizando 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 del sistema. Es una tarea tediosa, así que vamos a crear un script bash que la 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 servidores.txt que incluye cinco servidores diferentes:

$ cat cat servidores.txt
servidor1
servidor2
servidor3
servidor4
servidor5

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

Ahora observa el siguiente script bash agregarusuario.sh:

#!/bin/bash

servidores=$(cat servidores.txt)

echo -n "Ingresa el nombre de usuario: "
read nombre
echo -n "Ingresa el id de usuario: "
read idu

for i in $servidores; do
echo $i
ssh $i "sudo useradd -m -u $idu ansible"
if [ $? -eq 0 ]; then
echo "Se ha agregado el $nombre en $i"
else
echo "Error en $i"
fi
done

El script agregarusuario.sh primero te pedirá 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 servidores.txt vía SSH y añadirá el usuario solicitado.

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

./agregarusuario.sh
Ingresa el nombre de usuario: liberaforms
Ingresa el id de usuario: 1010
servidor1
Se ha agregado a liberaforms en servidor1
servidor2
Se ha agregado a liberaforms en servidor2
servidor3
Se ha agregado a liberaforms en servidor3
servidor4
Se ha agregado a liberaforms en servidor4
servidor5
Se ha agregado a liberaforms en servidor5

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

  • Puede 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 agregarusuario.sh definitivamente puede ahorrarte incontables horas de trabajo.

Automatización de copias de seguridad con un script bash

Hacer copias de seguridad es algo que todos hacemos regularmente, así que ¿por qué no automatizarlo? Mira el script respaldo.sh:

#!/bin/bash

dirs_respaldo=("/etc" "/home" "/boot")
dir_dest="/respaldo"
serv_dest="servidor1"
fecha_respaldo=$(date +%b-%d-%y)

echo "Inicio de la copia de seguridad de: ${dirs_respaldo[@]}"

for i in "${dirs_respaldo[@]}"; do
sudo tar -Pczf /tmp/$i-$fecha_respaldo.tar.gz $i
if [ $? -eq 0 ]; then
echo "$i - Copia de seguridad completa."
else
echo "$i - La copia de seguridad ha fallado."
fi
scp /tmp/$i-$fecha_respaldo.tar.gz $serv_dest:$dir_dest
if [ $? -eq 0 ]; then
echo "$i - Transferencia completa."
else
echo "$i - La transferencia ha fallado."
fi
done

sudo rm /tmp/*.gz
echo "El proceso de copia de seguridad ha concluido."

Así que, primero creamos un array llamado dirs_respaldo que almacena los nombres de los directorios que queremos respaldar. Luego, creamos otras tres variables

  • dir_dest: Para especificar el directorio de destino.
  • serv_dest: Para especificar el servidor de destino.
  • fecha_respaldo: Para especificar la fecha del respaldo.

A continuación, para todos los directorios del array dirs_respaldo, creamos un archivo tar comprimido con gzip en /tmp, y luego utilizamos el comando scp para enviar/copiar el archivo de copia de seguridad al servidor de destino. Finalmente, eliminamos todos los archivos gzip de /tmp.

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

./respaldo.sh
Inicio de la copia de seguridad de: /etc /home /boot
/etc - Copia de seguridad completa.
etc-oct-12-22.tar.gz 100% 2388KB 460.1KB/s   00:02
/etc - Transferencia completa.
/home - Copia de seguridad completa.
home-oct-12-22.tar.gz 100% 12543KB 547.0KB/s   00:04
/home - Transferencia completa.
/boot - Copia de seguridad completa.
boot-oct-12-22.tar.gz 100%  157MB 520.2KB/s   03:26
/boot - Transferencia completa.
El proceso de copia de seguridad ha concluido.

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

$ crontab -e
0	0	*	*	* /home/administrador/scripts/respaldo.sh

Monitoreo del espacio disponible en  disco

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 colapse. Puedes usar el comando df para ver el espacio restante en cualquier sistema de archivos:

# df -ah / /apps /base
S.ficheros Tamaño Usados Disp Uso% Montado en
/dev/mapper/vmdata-vm--186--disk--0 24G 3,4G 19G 15% /
/dev/mapper/vmdata-vm--186--disk--0 4.9G  2.4G  2.3G  52% /apps
/dev/mapper/vmdata-vm--186--disk--0 4.9G  4.5G  180M  97% /base

Mi sistema de archivos /base está casi sin espacio ya que actualmente está al 97% de uso. Para mostrar sólo el quinto campo, y ver el uso, es necesario usar el comando awk.

Ahora echa mira el script bash espacio_disco.sh:

#!/bin/bash
sist_archivos=("/" "/apps" "/database")
for i in ${sist_archivos[@]}; do
uso=$(df -h $i | tail -n 1 | awk '{print $5}' | cut -d % -f1)
if [ $uso -ge 90 ]; then
alerta="Se está agotando el espacio en $i, El uso es: $uso%"
echo "Envío de un correo electrónico de alerta de espacio en disco."
echo $alerta | mail -s "$i está al $uso% de uso" tu_correo
fi
done

En primer lugar, creamos el array sist_archivos que contiene todos los sistemas de archivos a monitorear. 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.

Nota que debes sustituir tu_correo en el script por tu correo electrónico real.

Ejecutamos el script:

$ ./disk_space.sh
Envío de un correo electrónico de alerta de espacio en disco.

Y recibiremos esto en nuestra bandeja de entrada:

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

$ crontab -e
0	*/6 *		*		* /home/administrador/scripts/espacio_disco.sh

 

Traducido y adaptado a partir de https://linuxhandbook.com/tag/bash-beginner/