Scripting de tareas en la nube
- 12 minutos
El concepto de scripting lleva vigente casi tanto como los ordenadores. Durante décadas, los trabajadores de TI han interactuado con los equipos escribiendo comandos en una consola. Hasta la actualidad, algunos usuarios prefieren una interfaz de la línea de comandos (CLI) a una interfaz gráfica de usuario (GUI). El scripting permite mezclar comandos independientes en uno o varios archivos de texto ("scripts") y ejecutarlos como un grupo. Los lenguajes de scripting, como Bash, permiten que los scripts realicen algo más que ejecutar secuencias de comandos a ciegas; los scripts pueden incluir instrucciones como if y for que ejecutan comandos de forma condicional o repetida, pueden solicitar entradas de los usuarios y pueden incluir variables simbólicas.
La manera más sencilla de automatizar las implementaciones en la nube consiste en ensamblar los comandos necesarios para crear y configurar un conjunto de recursos en un script. Las plataformas en la nube más populares admiten interfaces de la línea de comandos (CLI) y shells en la nube (CLI a las que se accede a través de un explorador) con comandos que se pueden usar en estos scripts. Por ejemplo, Azure ofrece el comando az, mientras que AWS admite el comando aws y Google admite gcloud.
Lenguajes de scripting
Un lenguaje de scripting es un lenguaje de programación que se usa para automatizar la ejecución de tareas. No hay escasez de lenguajes de scripting para elegir. La Wikipedia enumera casi 2001. No todos se aplican a las plataformas en la nube. Desde el punto de vista de un administrador cuyo objetivo es automatizar actividades que impliquen el uso de recursos de nube, los lenguajes de scripting normalmente se dividen en dos categorías:
- Lenguajes de scripting de uso general, como Bash y PowerShell
- Lenguajes de programación completos, como Python, que también se pueden usar para el scripting
Los lenguajes de scripting de uso general ofrecen funciones de bifurcación, bucles y toma de decisiones, pero dependen de comandos del sistema operativo o comandos de complementos como las CLI en la nube para realizar la mayor parte del trabajo. Bash, por ejemplo, no incluye comandos para crear máquinas virtuales en AWS o Azure, pero puede invocar comandos de la CLI que sí lo hacen. Y un solo script de Bash puede incluir cualquier número de comandos de la CLI. Un comando de un script de Bash no es diferente de un comando que un administrador escribiría en la línea de comandos.
Scripting de Bash
Bash se encuentra entre los lenguajes de scripting más populares del mundo. Es una herramienta irreemplazable para los administradores del sistema y de la nube. Disfruta de compatibilidad nativa en Linux y macOS, y también está disponible para Windows. Además, se admite en los shells de la nube, como Azure Cloud Shell.
En el siguiente script de Bash, por ejemplo, se usa el comando az de la CLI de Azure para crear un grupo de recursos en Azure y una máquina virtual Ubuntu dentro del grupo de recursos:
az group create --name cmu-rg --location eastus
az vm create --resource-group cmu-rg \
--name cmu-vm --image Ubuntu2204 \
--admin-username cmu-admin \
--admin-password Micr0s0ft** \
--location eastus
Scripting de PowerShell
Otra herramienta de scripting que es popular entre los administradores de la nube es PowerShell. Microsoft ha desarrollado PowerShell como la última generación de la línea de comandos de Windows y también como una alternativa más segura a Windows Script Host (WSH), que se desarrolló originalmente para Windows Server. Desde entonces, se ha convertido en un proyecto de código abierto y funciona en Windows y Linux.
En lugar de basarse en comandos del sistema operativo, PowerShell proporciona sus propios comandos y su propia terminología. La mayoría de los comandos de PowerShell (pequeños programas en sí mismos), también llamados cmdlets (pronunciado como "command-lets"), están formados por un verbo en inglés unido a un objeto con un guion. Por ejemplo, Get-Location se usa para enumerar el contenido del directorio actual, Copy-Item para copiar un archivo y Start-Process para iniciar un programa. El lenguaje de PowerShell evita el uso de abreviaturas opacas, como sudo de Linux, en favor de frases legibles, aunque un poco largas.
Lo que hace que PowerShell sea único es que un lenguaje diseñado originalmente para su uso con equipos individuales y redes locales se ha ampliado para que funcione con plataformas en la nube. Aunque es posible incluir simplemente instrucciones de la CLI de Azure en un script de PowerShell, Microsoft ofrece un módulo denominado Azure PowerShell, que extiende PowerShell con cmdlets específicos de Azure. Amazon ofrece un módulo similar denominado Herramientas de AWS para PowerShell. Este es un script de PowerShell equivalente al script de Bash anterior:
$VMAdmin = "cmu-admin"
$VMPassword = ConvertTo-SecureString "Micr0s0ft**" -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential `
($VMAdmin, $VMPassword)
New-AzResourceGroup -Name cmu-rg -Location EastUS
New-AzVm -ResourceGroupName "cmu-rg" `
-Name "cmu-vm" `
-Location "East US" `
-image Ubuntu2204 `
-Credential $Cred
Desarrollo de Python
Los administradores también pueden usar lenguajes de programación completos, como Python, para crear y administrar recursos en la nube. Estos lenguajes no incluyen características propias específicas de la nube, pero pueden incorporar bibliotecas y kits de desarrollo de software (SDK) que sí lo hacen. La mayoría de los principales proveedores de servicios en la nube ofrecen SDK gratuitos para interactuar con sus plataformas en varios lenguajes. Microsoft, por ejemplo, ofrece SDK de Azure para C#, Go, Java, Python, Node.js y otros lenguajes de programación populares, como hace AWS. Incluso sin los SDK, los programadores pueden usar las API REST que ofrecen las principales plataformas en la nube para invocar servicios en la nube. Los SDK y las bibliotecas simplemente facilitan la escritura de estos programas.
Por ejemplo, AWS ofrece un SDK de Python denominado Boto que contiene funciones de Python muy similares a las instrucciones de la CLI de AWS. La sintaxis de estos métodos se ha adaptado al estilo nativo de Python. El siguiente script de Python usa Boto para crear una instancia de EC2 en la región Este 1 de Amazon:
import boto3
try:
ec2 = boto3.client('ec2', region_name='us-east-1')
key_pair = ec2.create_key_pair(KeyName='ec2-key-pair')
ec2.run_instances(
ImageId='ami-00b6a8a2bd28daf19',
InstanceType='t2.micro',
KeyName='ec2-key-pair',
Placement='AvailabilityZone=us-east-1d',
MinCount=1,
MaxCount=1)
except ClientError as e:
print(e)
Una de las ventajas de usar un lenguaje de programación para el scripting es contar con una compatibilidad robusta con el control de errores y la depuración. Por supuesto, el inconveniente es que se necesitan programadores con experiencia en el lenguaje elegido y que tengan conocimientos sobre las plataformas y los SDK de la nube.
Extensión del script
Los siguientes comandos de Bash, escritos de forma individual en la CLI de Azure o Cloud Shell, crean un grupo de recursos en la región Este de EE. UU. de Azure y una máquina virtual Ubuntu en su interior. Son idénticos a los comandos az anteriores, excepto el modificador --generate-ssh-keys, que reemplaza las contraseñas de inicio de sesión con pares de claves públicas y privadas para mayor seguridad:
az group create --name cmu-rg --location eastus
az vm create --resource-group cmu-rg \
--name cmu-lamp-vm --image Ubuntu2204 \
--admin-username lamp-admin \
--generate-ssh-keys \
--location eastus
Una vez que se ha creado la máquina virtual, un administrador se puede conectar de forma segura a través de Secure Shell (SSH) con este comando, donde IP_ADDRESS es la dirección IP pública asignada a la máquina virtual y la salida del comando az vm create:
ssh lamp-admin@IP_ADDRESS
Dentro de la sesión de SSH, el administrador puede usar los comandos siguientes para instalar una pila LAMP (Linux, Apache/MySQL/PHP) en la máquina virtual y, después, finalizar la sesión de SSH:
sudo apt update
sudo apt install lamp-server^
exit
Son muchos pasos, especialmente si tiene que ejecutarlos varias veces. Como alternativa a la especificación manual de estos comandos, un administrador podría optar por incluirlos en scripts mediante la creación de un archivo de texto denominado ccvm.sh (abreviatura de "creación y configuración de una máquina virtual"), que contiene las instrucciones de la figura 2.
El script no solo enumera los comandos que un operador escribiría en la consola. Tenga en cuenta la llamada al comando az vm show para obtener la dirección IP pública de la máquina virtual y asignarla a la variable denominada $IP_ADDRESS, el uso de la redirección a (<<) para insertar comandos en la sesión de SSH y la adición de modificadores de la línea de comandos (por ejemplo, -y en sudo apt -y install) para suprimir los mensajes de confirmación, de modo que el script se pueda ejecutar sin intervención humana:
az group create --name cmu-rg --location eastus
az vm create --resource-group cmu-rg \
--name cmu-lamp-vm --image Ubuntu2204 \
--admin-username lamp-admin \
--generate-ssh-keys
IP_ADDRESS=$(az vm show --show-details \
--resource-group cmu-rg --name cmu-lamp-vm \
--query publicIps -o tsv)
ssh -o 'StrictHostKeyChecking no' lamp-admin@$IP_ADDRESS << EOF
sudo apt update
sudo apt -y install lamp-server^
exit
EOF
Figura 2: Script de Bash para crear una máquina virtual de Azure e instalar una pila LAMP.
Con este script a mano, un administrador puede crear una máquina virtual e instalar una pila LAMP con un solo comando:
bash ccvm.sh
La ventaja de este enfoque es que muchos comandos se reducen a uno solo, para eliminar la posibilidad de errores humanos. Pero está lejos de la perfección. Cada vez que se ejecuta, el script intenta crear la misma máquina virtual y el mismo grupo de recursos en la misma región de Azure (Este de EE. UU.). Si el objetivo es poder crear de forma rápida y sencilla máquinas virtuales idénticas en n regiones diferentes, el script tiene que ser más inteligente.
Se podría solucionar si se modifica el script para incluir una variable que especifique la región de Azure y se cambia la variable cada vez que se ejecuta el script para tener como destino otra región. Como alternativa, se podría colocar el nombre de la región en una variable de entorno y hacer referencia a esta en el script o, mejor todavía, pasar el nombre de la región en un parámetro de línea de comandos. Pero se producirían otros problemas de forma inmediata, como el hecho de que no se pueden crear dos máquinas virtuales o dos grupos de recursos con el mismo nombre en dos regiones diferentes. Esto también se puede solucionar. Por ejemplo, se podría anexar el nombre de la región a los de la máquina virtual y el grupo de recursos para generar nombres únicos para cada región.
Desafíos del uso de scripting para automatizar recursos de nube
En resumen, la inclusión en scripts de los comandos de la CLI de la nube ofrecen cierto grado de automatización, pero en la práctica, los scripts pueden complicarse rápidamente y ser más un ejercicio de programación que de administración. Estos son los cuatro motivos por los que el scripting por sí solo no es una solución idónea para automatizar la administración de recursos de nube.
Complejidad
Los scripts son invariablemente más complejos que los comandos equivalentes que se escriben en una consola, principalmente porque deben hacer todo lo que haría un operador humano y prever todas las situaciones que un usuario podría encontrar. Además, los scripts se deben parametrizar para que un script, por ejemplo, pueda implementar la misma solución en regiones diferentes, o bien para que un administrador que ejecute el script pueda especificar nombres de recursos y asegurarse de que sean únicos.
Idempotencia
Los scripts requieren lógica adicional si deben ser idempotentes, lo que significa que la ejecución del mismo script dos veces produce el mismo resultado. ¿Qué ocurrirá, por ejemplo, si un script intenta crear un grupo de recursos pero ese grupo de recursos ya existe? Los scripts pueden (y deberían) ser lo suficientemente sólidos como para tener en cuenta estas circunstancias, pero la robustez implica un aumento de la longitud y la complejidad. La idempotencia es un requisito importante si los scripts van a actualizar recursos de nube existentes y aprovisionar otros nuevos.
Especificidad de la nube
El script que se muestra en la figura 2 requiere una modificación importante (en realidad, una reescritura) para que funcione con otras plataformas de nube, como AWS y GCP. El script se podría escribir para que se ejecute de una manera en Azure, de otra para AWS y de otra distinta para GCP (posiblemente controlado por una variable de entorno o un parámetro de la línea de comandos), pero tendría que ser más complejo.
Control de versiones
Los scripts son programas y se deben someter al control de versiones igual que el código de las aplicaciones. En caso contrario, ¿cómo sabe cuándo se ha modificado un script y por qué, y revertir a una versión anterior si se interrumpe la actual? Esto agrega una capa de complejidad administrativa y un costo.
Interacción con otra automatización
Una complicación adicional es que la utilidad de estos scripts depende de la forma en que se combinan entre sí y de cómo se comportan en un entorno en el que es posible que se ejecuten al mismo tiempo. Cuando los scripts se escriben e implementan de forma ad hoc (como suele ser el caso) sin un planeamiento y una previsión adecuados, a menudo no hay tiempo ni oportunidad de probarlos en un entorno seguro donde no afecten a los servicios que ya están en producción. Aquí es cuando empieza a ser obvio que la coordinación es necesaria a un nivel mucho más alto, lo que implica no solo la infraestructura y las plataformas de TI, sino también las personas que las mantienen y administran.
Por tanto, lo que supuestamente debería proporcionar simplificación suele acabar generando una mayor complejidad. La buena noticia es que este no es el final de la historia. En la lección siguiente, se presenta el concepto de entorno de centro de datos, en el que la coordinación tiene lugar como cuestión de principio, y la infraestructura se aprovisiona y actualiza en función de requisitos definidos de forma explícita.
Referencias
- Wikipedia. Lenguajes de scripting. https://en.wikipedia.org/wiki/Category:Scripting_languages.
Comprobación de conocimientos
Comentarios
¿Le ha resultado útil esta página?
No
¿Necesita ayuda con este tema?
¿Desea intentar usar Ask Learn para aclarar o guiarle a través de este tema?