Cómo utilizar un bucle for-loop de script Bash para la administración del sistema en Linux

0
1276

Bash scripting es la navaja suiza de todo administrador de Linux. Aprenda cómo el uso de un bucle for junto con scripts Bash puede producir resultados poderosos.Las secuencias de comandos Bash siguen siendo un elemento básico de mis esfuerzos en Linux como administrador de sistemas, y las uso todos los días para aliviar mi carga de trabajo.

Uno de mis tipos de scripts de shell más utilizados implica un bucle for que procesa y aplica comandos a los servidores en función de un archivo de texto que he creado que contiene los nombres de host de destino.

Estos scripts pueden copiar archivos a servidores o iniciar sesión en estos sistemas a través de ssh para ejecutar varios comandos. Este proceso se utiliza mejor con las claves de host SSH en su lugar para permitir el acceso sin contraseña a los sistemas de destino, de lo contrario, tendrá que escribir una contraseña para cada sistema al que se conectará su script. También debe tener los permisos adecuados para ejecutar estos comandos.

Tenga en cuenta que estos scripts deben contener una extensión .sh y configurarse como ejecutables mediante chmod +x (nombre del script). Si el nombre del archivo que contiene la lista de servidores no está en el mismo directorio desde el que está ejecutando el script, deberá especificar la ruta completa en el script. Normalmente ejecuto mis scripts desde una subcarpeta en “root”.

Aquí hay un ejemplo de uno de mis scripts simples, “besrestart.sh”. Esta secuencia de comandos está destinada a iniciar el servicio besclient (BigFix, utilizado para el parcheo del sistema) en todos los hosts enumerados en un archivo de texto llamado “servidores”:

for l in `cat servers`; do echo $l;ssh -q $l service besclient restart;echo $l; done

El script usa “for l” como en una L minúscula (que no debe confundirse con i o I), lo que significa catalogar el archivo de texto del servidor y devolver uno por uno cada nombre de host para usar para ejecutar los comandos que siguen al semi- colon. “l” simplemente se refiere a cada entrada de nombre de host. Cada punto y coma separa los comandos de la cadena.

Tenga en cuenta que ` no es una comilla simple; es el carácter de “comilla inversa” y comparte la misma tecla que la tilde (~) en la parte superior izquierda de un teclado típico.

“do echo $l” mostrará el nombre del host antes de ejecutar el siguiente comando.

Ahora viene el meollo de la cuestión, donde ssh -q $l le dice al script que envíe ssh al host de destino. Ahora está en la caja remota y puede iniciar el comando “service besclient restart”.

El “echo $ l” muestra el nombre de host involucrado como una forma de confirmar que el comando se ejecutó correctamente.

Finalmente, “hecho” finaliza la cadena de comandos y pasa al siguiente sistema, o termina de ejecutar el script si no hay más sistemas en los que trabajar.

Digamos que el archivo de su servidor contiene estos elementos:

server1
server2
server3
server4
server5

Después de que se ejecute el script, verá un resultado similar al siguiente, asumiendo que el sistema podría conectarse a todos los destinos.

server1
server1
server2
server2
server3
server3
server4
server4
server5
server5

Si ve una sola entrada para un nombre de host, verifique que la conectividad a ese host esté funcionando y vuelva a intentarlo.

Aquí hay otro script de muestra que se conecta a un sistema, detiene un servicio, elimina un archivo, copia un nuevo archivo en el sistema a través de scp y luego inicia el servicio relacionado.

for l in `cat servers`; do echo $l;ssh -q $l service besclient stop;echo $l; done
for l in `cat servers`; do echo $l;ssh -q $l rm -rf /var/opt/BESClient/besclient.config;echo l; done
for l in `cat servers`; do scp besclient.config $l:/var/opt/BESClient/;echo $l; done
for l in `cat servers`; do echo $l;ssh -q $l service besclient start;echo $l; done

Sin ningún orden en particular, estos son los scripts principales en los que confío para las tareas diarias:

Este script puede detener un servicio, eliminar los rpms relacionados y luego eliminar el directorio de la aplicación para limpiar los sistemas de destino:

for l in `cat servers`; do echo $l;ssh -q $l service besclient stop;echo $l; done
for l in `cat servers`; do echo $l;ssh -q $l rpm -e BESAgent-9.5.10.79-rhe6.x86_64;echo $l; done
for l in `cat servers`; do echo $l;ssh -q $l rpm -e BESAgent-9.5.3.211-rhe5.x86_64;echo $l; done
for l in `cat servers`; do echo $l;ssh -q $l rm -rf /etc/opt/BESClient /var/opt/BESClient /opt/BESClient;echo $l; done

Este script recopila algunos detalles de hardware de los hosts de destino que pueden ser útiles para los sistemas de inventario:

 for l in `cat servers`; do echo $l;ssh -q $l dmidecode | grep -i serial;echo $l; done
 for l in `cat servers`; do echo $l;ssh -q $l lscpu | grep "CPU(s):";echo $l; done
 for l in `cat servers`; do echo $l;ssh -q $l lscpu | grep "Core(s) per socket:";echo $l; done
 for l in `cat servers`; do echo $l;ssh -q $l lscpu | grep "Socket(s):";echo $l; done
 for l in `cat servers`; do echo $l;ssh -q $l free -h;echo $l; done

Esta secuencia de comandos copia otra secuencia de comandos en las carpetas /etc/cron.daily de los sistemas de destino, por lo que estas secuencias de comandos se ejecutarán cada 24 horas:

 for l in `cat servers`; do ssh -q $l /etc/cron.daily/update-tools.sh; done

Este script establece que el propietario de un determinado archivo en los sistemas de destino sea “prod1”:

 for l in `cat servers`; do echo $l;ssh -q $l chown prod1:prod /fileData/fileroot/certs/interac.jks;echo $l; done

Este script le dice a todos los hosts de destino que ejecuten una actualización de yum y no soliciten la instalación de paquetes:

 for l in `cat servers`; do ssh -q $l yum -y update; echo $l; done

Este script realiza una copia de seguridad del archivo / etc / shadow en todos los hosts de destino en el directorio raíz:

 for l in `cat servers`; do echo $l;ssh -q $l cp /etc/shadow /root/shadow20210604;echo $l; done

Este script reinicia todos los servidores enumerados en el archivo de servidores:

 for l in `cat servers`; do ssh -q $l shutdown -r now; echo $l; done

Este script puede resultar útil para desmontar un volumen NFS existente, luego actualizar / etc / fstab con un nuevo nombre de montaje NFS y volver a montar todos los volúmenes:

for l in `cat servers`; do echo $l;ssh -q $l umount /clover;echo $l; done
 for l in `cat servers`; do echo $l;ssh -q $l;sed -r -i 's|vnx-corp-nfs1|unity-corp-nfs01|' /etc/fstab;mount -a;echo $l;      done

Este script puede agregar una entrada de archivo de host a los sistemas de destino

 for l in `cat servers`; do ssh -q $l 'echo "10.18.12.33  github.devops.local" >> /etc/hosts'; echo $l; done

Finalmente, este script puede indicarle el tiempo de actividad actual en todos los hosts de destino:

 for l in `cat servers`; do echo $l;ssh -q $l uptime;echo $l; done

Como puede ver, la funcionalidad de estos scripts está limitada solo por su imaginación.

Espero que sean útiles y que alivien su carga de trabajo administrativo. 🙂