En este tutorial, aprenderemos a usar un archivo de configuración para los scripts bash (lenguaje de script de Linux).
Usar un archivo de configuración significa que un archivo externo al script contendrá las variables que se utilizarán en el script.
En este contexto, los scripts bash no tendrán la declaración de las variables principales y usarán un archivo de configuración para recuperar el contenido de estas variables. Hay muchas ventajas en hacerlo:
- Clarificación de la construcción y el uso de los scripts: tendremos el script por un lado y las variables por otro. Si nuestro script es voluminoso, no tendremos que buscar entre las muchas líneas y funciones el lugar donde se encuentra una variable para modificarla.
- Posibilidad de usar varias configuraciones diferentes sin necesidad de modificar el script: será fácil utilizar el mismo script en diferentes entornos (producción, pre-producción, desarrollo) sin tener que modificar su contenido. Solo necesitaremos apuntar al archivo de configuración correcto para cambiar las variables que utiliza el script.
- Limpieza del script para una mejor seguridad: en esta configuración, es posible realizar una verificación de integridad (a través de la huella digital) de un script antes de ejecutarlo, por ejemplo, porque independientemente del entorno de ejecución del script, su contenido no habrá cambiado. Esto también nos permitirá modificar los permisos del script para que no se pueda modificar.
- Reducción del riesgo de errores manuales al actualizar los parámetros: esto ayuda a mantener la coherencia e integridad de los scripts, evitando problemas de seguridad relacionados con configuraciones o modificaciones incorrectas.
En resumen, los beneficios de este modelo son muchos, tanto en términos de uso como de seguridad. ¡Pasemos a la acción!
Si aún no te sientes cómodo con bash, te recomiendo nuestro artículo al respecto:
Ver aquí: Introducción a los Scripts Bash en Linux: ¡Crea tu Primer Script!
Funcionamiento Global
En realidad, el uso de un archivo de configuración requiere tener dos archivos en lugar de uno: un script bash y un archivo de configuración (que contendrá nuestras variables).
Al estar en Linux, la nomenclatura del archivo de configuración no importa mucho. Sin embargo, puede ser útil normalizarla para una mayor claridad. Esto se puede hacer usando nombres como “config.txt
“, “config.ini
” o “SETTINGS.txt
“.
Además, también es útil tener varios archivos de configuración para un mismo script, pero con valores diferentes que son específicos de cada entorno o servidor. Así, la nomenclatura puede adaptarse:
- “config-dev.txt” y “config-prod.txt”;
- “dev.config” y “prod.config”;
- “serv1-settings.config” y “serv2-settings.config”;
Y así sucesivamente!
Imaginemos ahora un escenario para contextualizar el uso de un archivo de configuración. Queremos crear un script que haga una copia de seguridad de un directorio en un archivo comprimido y cambie el propietario de este archivo comprimido. Tenemos dos entornos:
- Desarrollo (dev): copia de seguridad de “/opt/tomcat” a “/home/mateo/tomcat.zip” y asignar “mateo” como propietario de este archivo comprimido;
- Producción (prod): copia de seguridad de “/srv/tomcat” a “/home/emily/tomcat.zip” y asignar “emily” como propietario de este archivo comprimido.
En cualquier caso, tendremos 3 informaciones:
- Ruta/directorio fuente del archivo comprimido: “$fuente”
- El destino de la creación del archivo comprimido: “$dest”
- El nombre del nuevo propietario: “$owner”
Recuerda que el objetivo de usar un archivo de configuración es que una vez que nuestro script esté diseñado, su contenido no cambie, independientemente del entorno en el que se use. Sin embargo, cuando ejecutemos nuestro script, le indicaremos qué archivo de configuración usar y, según el archivo, realizará las acciones relativas al entorno de producción o desarrollo.
Espero que este contexto esté claro. Ahora veremos cómo se realiza técnicamente esto.
Construir tu Archivo de Configuración
El archivo de configuración no es más que un script bash que declara variables. Aquí tienes un ejemplo de archivo de configuración:
# Contenido de un archivo de configuración típico
fuente="Ruta del directorio a guardar"
dest="Ruta al destino"
owner="usuario"
En nuestro contexto, tendremos dos archivos de configuración. El primero llamado “prod.conf
“:
# Archivo de configuración del entorno de producción
fuente="/srv/tomcat"
dest="/home/emily/tomcat.zip"*
newOwner="emily"
El segundo “dev.conf
“:
# Archivo de configuración del entorno de desarrollo
fuente="/opt/tomcat"
dest="/home/mateo/tomcat.zip"
newOwner="mateo"
¡Listo! Ahora que nuestros diferentes archivos de configuración están listos, ¡podemos usarlos!
Importar en el Script Bash y Usar
Simplemente, aquí tienes el script bash usado para nuestra operación. Para importar un archivo de configuración, usaremos el comando “source
” en nuestro script:
# Script bash que usa un archivo de configuración
#!/bin/bash
source config-prod.txt
# Archivar el directorio
zip -r $dest $fuente
# Cambiar el propietario
chown $newOwner:$newOwner $dest
Dependiendo del uso, este archivo puede escribirse en el script, como se muestra arriba, o ponerse en un parámetro, lo que nos evitará tener que modificar el script. La única variable que hay que pasar a nuestro script será el nombre del archivo de configuración que se va a usar:
# Script bash que usa un archivo de configuración a través de una opción
#!/bin/bash
source $1
# Archivar el directorio
zip -r $dest $fuente
# Cambiar el propietario
chown $newOwner:$newOwner $dest
Aquí, “$1” será reemplazado por el primer parámetro que pasemos a nuestro script. Para usar nuestro archivo de configuración de forma dinámica, usaremos el siguiente comando:
# Usar el script con la configuración de producción
./script.sh prod.config
Así, si especificamos el archivo “prod.config”, el directorio “/srv/tomcat” será guardado en “/home/emily/tomcat.zip“. Y si especificamos el archivo “dev.config”, el directorio “/opt/tomcat” será guardado en “/home/mateo/tomcat.zip“. ¡Todo esto sin cambiar el contenido de nuestro script!
También es posible hacer que si no se especifica ningún archivo de configuración como parámetro, se cargue un archivo de configuración “por defecto“. Esto permite un uso rápido:
# Usar el script con una configuración por defecto
#!/bin/bash
if [ -z "$1" ]
then
source prod.config
else
source $1
# Archivar el directorio
zip -r $dest $fuente
# Cambiar el propietario
chown $newOwner:$newOwner $dest
Aquí, si no se pasa ningún archivo de configuración como parámetro, se usará el archivo “prod.config” por defecto. Si se pasa un archivo de configuración como parámetro (“$1”), ¡se usará!
Ahora vamos a aclarar el comando “source” que se usa aquí, que es nativo en Linux.
El comando source
permite cargar un archivo bash en el shell actual. Las operaciones, y en particular nuestros famosos archivos de configuración, no son más que archivos bash que definen variables. El comando source se suele comparar con el “.” que se usa para ejecutar un script normalmente, por ejemplo:
# Ejecutar un script con "."
. miscript.sh
La principal diferencia entre “.” y “source” es que “.
” crea un nuevo shell (proceso hijo), mientras que “source
” ejecuta el bash en el shell actual. ¡Por lo tanto, podemos usarlo en un script para importar variables o funciones! 🙂
Conclusión
En este tutorial, hemos visto cómo usar archivos de configuración para facilitar el uso de scripts en diferentes contextos. Ahora somos capaces de usar el mismo script con diferentes variables, sin modificar el código o transmitir una gran cantidad de parámetros en la línea de comandos.
El ejemplo presentado aquí solo contiene unas pocas variables y líneas. Para scripts más complejos en los que las variables se declaran en varios lugares, un archivo de configuración de este tipo será de gran ayuda.
¿Qué te parece?
Es bueno conocer tu opinión. Deja un comentario.