Saltar al contenido principal

Automatización con Bash

No contexto da informática, a automatización permite a reducción da interacción humana cos sistemas co obxectivo de optimizar determinados procesos. Emprégase o software para replicar unha serie de tarefas repetitivas.

Moitas das configuracións que realizamos ata agora consisten nunha serie de pasos repetitivos, polo que son claros obxectivos de automatización. Ubuntu ofrece a posibilidade de crear un ficheiro de texto que recolla todas esas instrucións que repetimos continuamente e poder executalas todas dunha vez cun único comando.

Que é Bash?

Bash é unha linguaxe e intérprete de comandos (shell) disponible na gran maioría de sistemas Unix, entre eles Ubuntu. Bash é a ferramenta que empregaremos para automatizar determinadas configuracións en Apache.

Un script é un ficheiro que recolle unha serie de instruccións. Cada vez executemos o ficheiro cun intérprete (como Bash), executaranse todas as instrucións por orde e de forma secuencial.

Os scripts que sexan interpretados por Bash teñen a extensión .sh. Por exemplo, podemos crear un ficheiro test.sh baleiro:

$ touch test.sh

Podemos ver que está correctamente creado:

$ ls
Exemplo de saída do comando
$ ls
Descargas Escritorio Música Público Vídeos
Documentos Imágenes Plantillas test.sh

O comando debería mostrar o ficheiro test.sh entre a lista.

Para poder executar o ficheiro, é necesario modificar os seus permisos:

$ chmod +x test.sh

Realizado isto, podemos executalo da seguinte maneira:

$ ./test.sh

O comando anterior non mostrará nada nin fará ningunha acción porque o ficheiro está baleiro. É necesario introducir instrucións para conseguir algún efecto.

Editamos o ficheiro:

$ nano test.sh

En primeiro lugar, poñemos a seguinte liña:

#!/bin/bash

Todo script que se execute con Bash debe conter na primeira liña a cadea #!/bin/bash. Con esta liña indicámoslle ao sistema que Bash debe ser o intérprete.

De momento, este script segue sen facer nada, polo que podemos engadir algún comando. Por exemplo:

#!/bin/bash
mkdir test
echo "Directorio creado correctamente"
ls

Engadimos tres liñas:

  • mkdir: creamos un novo directorio test.
  • echo "Directorio creado correctamente": mostramos unha mensaxe informativa comunicando que o directorio se creou correctamente.
  • ls: listamos ficheiros e directorios do directorio actual (o directorio onde se execute o script).

Volvemos a executar o script:

$ ./test.sh
Exemplo de saída do comando
$ ./test.sh
Directorio creado correctamente
Descargas Escritorio Música Público test.sh
Documentos Imágenes Plantillas test Vídeos

Coa execución do comando anterior, en primeiro lugar, mostrarase a mensaxe e despois mostrarase a lista dos ficheiros e directorios do directorio actual. Entre eles, debe aparecer o directorio test creado. Por tanto, o script executouse correctamente: creou a carpeta, mostrou o aviso e o contido do directorio actual.

Comentarios

Nos scripts podemos empregar comentarios para maior claridade do código. Para iso, temos que utilizar o símbolo #. O símbolo # podemos empregalo en calquera punto do script. Na liña na cal o usemos, todo o que estea á súa dereita será un comentario e non se terá en conta na execución.

Por exemplo, así sería o script anterior comentado:

#!/bin/bash

# Un script que crea un directorio, mostra unha mensaxe e
# mostra unha lista de ficheiros de directorios.

mkdir test # Crear un directorio
echo "Directorio creado correctamente" # Mostra unha mensaxe

# Mostra a ista de ficheiros e directorios do directorio actual
ls

Crear un ficheiro

Se queremos crear un ficheiro de texto cun contido determinado, a maneira de facelo é a seguinte:

#!/bin/bash
cat > test.txt << EOF
texto de exemplo (ruta relativa)
EOF

O texto que queiramos introducir dentro dun ficheiro test.txt estará encerrando entre os dous EOF.

Para ver o contido do novo ficheiro:

$ cat test.txt
Saída do comando
$ cat test.txt
texto de exemplo (ruta relativa)

Na creación do ficheiro, tamén podemos indicar unha ruta absoluta:

#!/bin/bash
cat > /var/www/test.txt << EOF
texto de exemplo (ruta absoluta)
EOF

Para ver o contido do novo ficheiro:

$ cat /var/www/test.txt
Saída do comando
$ cat /var/www/test.txt
texto de exemplo (ruta absoluta)

Uso de variables

Despois de habilitar un host virtual, debemos sempre reiniciar Apache Server. Son dúas tarefas repetitivas que podemos introducir nun script Bash. Por exemplo, podemos crear un ficheiro chamado habilitar-vhost.sh co seguinte contido:

#!/bin/bash
a2ensite sitio-web # Activar o host virtual 'sitio-web'
systemctl restart apache2 # Reiniciar o servizo de Apache Server
echo "O servidor virtual sitio-web activouse correctamente." # Mostrar mensaxe

No script anterior:

  • Habilitamos o host virtual sitio-web. Estamos supoñendo que temos un ficheiro de configuración en /etc/apache2/sites-available/sitio-web.conf.
  • Reiniciamos o servizo de Apache Server.
  • Móstrase unha mensaxe.

Aínda que os comandos que se utilizaron no ficheiro necesitan permisos de administrador, non é necesario poñerlles sudo antes. O sudo empregarase cando se execute o script.

Para executar este script, temos que introducir o seguinte comando:

$ sudo ./habilitar-vhost.sh
Saída do comando
$ sudo ./habilitar-vhost.sh
Enabling site sitio-web.
To activate the new configuration, you need to run:
systemctl reload apache2
O servidor virtual sitio-web activouse correctamente.

Este script ten un problema e é que só servirá para o host virtual que se chame sitio-web. Se queremos que o script sirva para calquera host virtual, temos que facer uso de variables. Unha variable é un espazo de memoria reservado para gardar un valor determinado. Este espazo de memoria ou variable intentifícase cun nome: o nome de variable.

En Bash, unha variable pódese crear da seguinte maneira:

servidor=sitio-web # Garda o valor 'sitio-web' na variable 'servidor'

A variable anterior recibe o nome de servidor e contén o valor sitio-web. As cadeas de texto, se conteñen espazos en branco, deben ir entre comiñas. Non é necesario que haxa espazos en branco para usar comiñas, polo que a seguinte liña sería equivalente á primeira:

servidor="sitio-web"

É importante que non deixes espazos en branco entre o nome da variable, o signo igual e o valor que lle queiras asignar á variable.

As dúas liñas seguintes non gardan o mesmo valor na variable servidor:

servidor=sitio-web # Garda o valor 'sitio-web' na variable 'servidor'
servidor= sitio-web # Garda o valor ' sitio-web' na variable 'servidor'

No primeiro caso garda "sitio-web" e no segundo caso garda o mesmo pero cun espazo en branco ao inicio.

Para empregar unha variable só basta con poñer o seu nome cun $ antes. Por exemplo:

echo $servidor

Coñecendo o uso das variables, o script orixinal poderíamos modificalo da seguinte forma:

#!/bin/bash
servidor=sitio-web # Asignamos valor
a2ensite $servidor # Usamos valor
systemctl restart apache2
echo "O servidor virtual $servidor activouse correctamente." # Usamos valor

Se executamos o script anterior, obteremos o mesmo resultado de antes.

De momento, estamos igual ca antes, porque teríamos que editar o ficheiro se queremos habilitar outro virtual host diferente a sitio-web. Para solucionar isto, podemos facer uso de parámetros. Por exemplo:

$ sudo ./habilitar-vhost.sh sitio-web

Os parámetros son eses valores que se poñen a continuación do nome do script. Neste caso, só hai un: sitio-web.

Para obter o valor dos parámetros, no script temos que empregar $1, $2, $3, etc. O $1 correspondería ao primeiro parámetro, $2 ao segundo, e así sucesivamente. Neste caso só temos un parámetro, polo tanto, usaremos $1 para obter o valor do mesmo. No exemplo, $1 tomaría o valor de sitio-web.

Vendo que se poden usar os valores dos parámetros, para que poidamos empregar este script para calquera servidor virtual, temos que modificar o valor fixo de sitio-web por un variable: un parámetro. Modificamos o valor de sitio-web por $1. Desta forma, $1 tomará un valor diferente de cada vez: o que lle pasemos pola liña de comandos.

#!/bin/bash
servidor=$1 # Asignamos o valor dun parámetro
a2ensite $servidor
systemctl restart apache2
echo "O servidor virtual $servidor activouse correctamente."

Ou de forma máis simplicificada:

#!/bin/bash
a2ensite $1 # Usamos directamente o valor do parámetro
systemctl restart apache2
echo "O servidor virtual $1 activouse correctamente." # Usamos valor

Unha vez gardados os cambios, executamos:

$ sudo ./habilitar-vhost.sh sitio-web

A saída do comando vai ser idéntica ás das outras ocasións, pero agora poderemos activar máis sitios utilizando o mesmo script. Por exemplo, se temos un host virtual web2 e o queremos activar, executaríamos:

$ sudo ./habilitar-vhost.sh web2
Saída do comando
$ sudo ./habilitar-vhost.sh web2
Enabling site web2.
To activate the new configuration, you need to run:
systemctl reload apache2
O servidor virtual web2 activouse correctamente.

Temos que ter en conta que os comandos vanse executar un detrás doutro, a pesar de se se produce un error ou non.

Por exemplo, se o ficheiro /etc/apache/sites-avaliable/web.conf non existe e executamos o script, o comando de reinicio de Apache executarase de igual maneira. A saída que mostra é a seguinte:

$ sudo ./habilitar-vhost.sh web
ERROR: Site web does not exist!
O servidor virtual web activouse correctamente.