OpenWebinars

Cloud Computing

Crear recursos en Azure con PowerShell

Aprende cómo crear recursos en Azure utilizando PowerShell, aprovechando la gran integración que tienen estos dos productos desarrollados por Microsoft.

Frankier Flores

Frankier Flores

Lectura 11 minutos

Publicado el 26 de febrero de 2021

Compartir

Hablar de administración de sistemas Windows, es hablar de PowerShell. No puedes pretender automatizar tareas, sin tener en cuenta la programación de Scripts en PowerShell. Desde su aparición en 2006 no ha parado de evolucionar, y actualmente, es con diferencia, la herramienta más potente para administrar sistemas operativos Windows.

Por otra parte, Azure es una plataforma que ofrece productos y servicios en la nube. Puedes implementar soluciones usando el modelo que mejor se adapte a las necesidades de tu empresa, ya sea, infraestructura como servicio, plataforma como servicio, software como servicio o funciones sin servidor. Para tener una noción más clara sobre Azure, te invito a leer Qué es Azure.

Ciertamente, es necesario gestionar todos los recursos de la forma más óptima posible. Azure y PowerShell son productos desarrollados por Microsoft, se puede decir que son familia, por ende, la integración es formidable, y es lo que hace posible administrar soluciones completas en Azure desde PowerShell.

Preparación del entorno

Para gestionar recursos en Azure, es necesario tener como mínimo PowerShell 5.1. Puedes consultar la versión ejecutando el cmdlet Get-Host. Si eres usuario de GNU/Linux o MacOS, también hay una versión multiplataforma que puedes descargar e instalar. Disponer de una versión actualizada de PowerShell, no es suficiente para trabajar con Azure, pero tampoco es una tarea compleja preparar el entorno. Dado que los comandos están organizados por módulos, solo debes instalar el módulo requerido. El módulo Az se usa para administrar recursos en Azure desde la línea de comandos de PowerShell o a través de Scripts. A continuación, muestro como instalarlo.

Instalar módulo Az para un solo usuario

Install-Module -Name Az -AllowClobber -Scope CurrentUser -Force

Instalar módulo Az para todos los usuarios

Install-Module -Name Az -AllowClobber -Scope AllUsers -Force

Recuerda, si quieres hacer la instalación para todos los usuarios, debes ejecutar el comando como administrador.

Obtener los comandos del módulo Az
Puedes ver todos los comandos disponibles para administrar Azure, ejecutando la siguiente instrucción:

Get-Command -Module Az*

Obtener ayuda en PowerShell

La ayuda en PowerShell es muy completa, fácil de consultar y proporciona gran variedad de ejemplos de uso para cada comando. Realmente es importante tenerla en cuenta, por ello, es recomendable realizar una actualización antes de escribir código. Para actualizar la ayuda, ejecuta:

Update-Help

¿Cómo consultar ayuda? Sencillo, anteponiendo Get-Help al comando que necesitas consultar, adicionalmente puedes pasar el parámetro -Examples para ver ejemplos.

Get-Help New-AzResourceGroup -Examples

Para buscar ayuda en línea, ejecuta:

Get-Help New-AzResourceGroup -Online

Conectar con Azure

Con el módulo Az instalado, solo queda conectarse a Azure con una cuenta autenticada para el uso con los cmdlets del módulo de PowerShell. Para ello, ejecuta el siguiente comando:

Connect-AzAccount

Bien, es momento de pasar a la acción, a todos nos gusta la práctica y ese es el objetivo, mostrar ejemplos prácticos. Si quieres aprender PowerShell desde cero, te recomiendo Curso de PowerShell para principiantes, un profesional en la materia te enseñará paso a paso.

Crear grupo de recursos en Azure

A modo de resumen, te describiré que es un grupo de recursos en Azure. Es un contenedor lógico donde se crean todos los recursos que conforman las soluciones implementadas en Azure. Cabe mencionar que el propio grupo, es un recurso como tal. Es lo primero que vamos a crear, para luego ir creando los demás recursos dentro de este grupo.

New-AzResourceGroup -Name Testing -Location EastUS -Tag @{Department="IT"}

La instrucción crea un grupo de recursos llamado Testing, en la región este de EE. UU., asignando una etiqueta con nombre: Department y valor: IT.

También se pueden pedir datos por teclado para construir Scripts más completos, cuando la situación lo amerita. Por ejemplo, puede ser útil pedir el nombre del grupo de recursos, guardarlo en una variable y reutilizarlo. Sería de la siguiente forma:

$RGroupName = Read-Host -Prompt "Escribe el nombre del grupo de recursos"
New-AzResourceGroup -Name $RGroupName -Location EastUS -Tag @{Department="IT"}

Implementar un servidor web en Azure

Un uso común de infraestructura como servicio, es la implementación de servidores web para alojar las aplicaciones de la empresa. Es probable que tengas sitios privados que serán accesibles únicamente por el personal de la institución, no obstante, también tendrás al menos una página web pública que tendrá que ser accesible desde Internet. En cualquier caso, debes preparar un servidor web, con más o menos restricciones de acuerdo con el escenario.

En el modelo de infraestructura como servicio, tenemos que hacernos cargo de todo lo que hay encima de la capa de virtualización de Azure. Como clientes, tenemos que preparar una máquina virtual con las características que demande la aplicación (tamaño, sistema operativo, etc.). Además, es necesario crear otros recursos imprescindibles para desplegar una máquina, me refiero a: una red virtual, una cuenta de almacenamiento, un disco virtual, una dirección IP pública, una interfaz de red virtual y un grupo de seguridad de red con las reglas primordiales.

Como puedes apreciar, es un reto interesante, ya que se exige la creación de varios recursos, además, es un escenario que sin duda te encontrarás en algún momento. En un solo Script se crearán todos los recursos, sin embargo, mostraré por bloques de código para ir explicando cada uno.

Antes de desarrollar el Script, es importante crear un par de claves para la conexión por SSH al servidor. Utilizando la herramienta ssh-keygen, se especifica el algoritmo a utilizar en el parámetro -t.

ssh-keygen -t rsa

Esta instrucción crea dos ficheros: id_rsa (clave privada) e id_rsa.pub (clave pública). La clave pública es la que necesitamos copiar en el servidor.

Ahora sí, manos a la obra para crear el Script. Primeramente, definimos algunas variables para guardar valores que serán proporcionales en todos los recursos. Estos valores corresponden al nombre del grupo de recursos, la región y la etiqueta que compartirán.

$RGroupName = "Testing"
$Location = "EastUS"
$TagName = "Department"
$TagValue = "IT"

Crear red virtual y subred en Azure

Igual que un host físico debe estar conectado a una red, una máquina virtual en Azure estará conectada a una red virtual. Procedemos a crear este recurso.

$VNet = New-AzVirtualNetwork `
    -Name "testing-vnet" `
    -ResourceGroupName $RGroupName `
    -Location $Location `
    -AddressPrefix 10.0.0.0/16 `
    -Tag @{$TagName="$TagValue"}

$PublicSubnet = Add-AzVirtualNetworkSubnetConfig `
    -Name "public" `
    -VirtualNetwork $VNet `
    -AddressPrefix 10.0.1.0/24

$SubnetId = $PublicSubnet | Set-AzVirtualNetwork

El cmdlet New-AzVirtualNetwork sirve para crear una red virtual de Azure. En el ejemplo se crea con nombre testing-vnet, dentro del grupo de recurso Testing, en la región este de EE. UU., definiendo CIDR 10.0.0.0/16 como prefijo de direcciones, y la etiqueta con clave: Department y valor: IT. El objeto se guarda en una variable porque será utilizado más adelante.

Para este ejemplo solo necesitamos una subred. El comando Add-AzVirtualNetworkSubnetConfig agrega una configuración de subred a una red virtual, en este caso, a la red creada previamente. Se le asigna el nombre public y 10.0.1.0/24 como intervalo de direcciones.

Finalmente, con el comando Set-AzVirtualNetwork se actualiza la red virtual, asociando la subred creada. De igual forma, el resultado se guarda en una variable que será utilizada después.

Crear una dirección IP pública en Azure

El servidor web estará expuesto a Internet, debe de tener una dirección IP pública y fija, por lo tanto, es necesario crear dicho recurso.

$PublicIp = New-AzPublicIpAddress `
    -Name "webserver-ip" `
    -ResourceGroupName $RGroupName  `
    -Location $Location `
    -AllocationMethod Static `
    -Tag @{$TagName="$TagValue"}

Con el commando New-AzPublicIpAddress se crea un nuevo recurso de dirección IP pública, con nombre webserver-ip, en el grupo de recursos Testing, en la región este de Estados Unidos, se le asigna la misma etiqueta de nombre: Department y valor: IT.

Crear un grupo de seguridad de red en Azure

Evidentemente, en un servidor web se debe configurar un firewall para permitir las solicitudes dirigidas al puerto 80 (HTTP) y 443 (HTTPS). En Azure hay un recurso llamado grupo de seguridad de red, donde se pueden crear reglas que permitan o denieguen el trafico entrante y saliente. También, debes tener presente que el servidor lo tendrás que administrar remotamente a través de una conexión segura, por lo cual, es preciso abrir el puerto 22 (SSH).

$RuleSSH = New-AzNetworkSecurityRuleConfig `
    -Name "SSH" `
    -Description "Permitir el acceso por SSH" `
    -Priority 300 `
    -Protocol Tcp `
    -SourceAddressPrefix * `
    -SourcePortRange * `
    -DestinationAddressPrefix * `
    -DestinationPortRange 22 `
    -Direction Inbound `
    -Access Allow

$RuleHTTP = New-AzNetworkSecurityRuleConfig `
    -Name "HTTP" `
    -Description "Permitir el acceso por HTTP" `
    -Priority 301 `
    -Protocol Tcp `
    -SourceAddressPrefix * `
    -SourcePortRange * `
    -DestinationAddressPrefix * `
    -DestinationPortRange 80 `
    -Direction Inbound `
    -Access Allow

$RuleHTTPS = New-AzNetworkSecurityRuleConfig `
    -Name "HTTPS" `
    -Description "Permitir el acceso por HTTPS" `
    -Priority 302 `
    -Protocol Tcp `
    -SourceAddressPrefix * `
    -SourcePortRange * `
    -DestinationAddressPrefix * `
    -DestinationPortRange 443 `
    -Direction Inbound `
    -Access Allow

$SecurityGroup = New-AzNetworkSecurityGroup `
    -Name "WebServerSG" `
    -ResourceGroupName $RGroupName `
    -Location $Location `
    -SecurityRules $RuleSSH,$RuleHTTP,$RuleHTTPS `
    -Tag @{$TagName="$TagValue"}

Como puedes observar, hay un bloque de código para cada regla de seguridad. Con el comando New-AzNetworkSecurityRuleConfig creas una configuración de regla de seguridad para un grupo de seguridad de red. En este ejemplo, las tres reglas poseen una configuración similar, varía el puerto de cada protocolo que se está permitiendo, el nombre y la breve descripción, y un valor importante, la prioridad. Las reglas se procesan en orden de prioridad, los números más bajos tienen mayor prioridad. Como Con la instrucción se está permitiendo tráfico TCP desde cualquier dirección, es decir, desde Internet.

Usando el cmdlet New-AzNetworkSecurityGroup, se crea el grupo de seguridad de red, con nombre WebServerSG, en el grupo de recursos Testing, en la región este de Estados Unidos, se le asocian las tres reglas creadas previamente y la misma etiqueta utilizada en los recursos anteriores. Igualmente, se guarda en una variable para reutilizar valores.

Crear interfaz de red virtual en Azure

La máquina virtual se debe conectar a la red virtual, también recibirá la dirección IP pública, pero no será posible sin tener una interfaz de red virtual (NIC). Una máquina virtual puede tener una o más interfaces de red, para este ejemplo nos basta con una. A continuación, crearemos este nuevo recurso.

$Nic = New-AzNetworkInterface `
    -Name "WebServerNic" `
    -ResourceGroupName $RGroupName `
    -Location $Location `
    -SubnetId $SubnetId.Subnets[0].Id `
    -PublicIpAddressId $PublicIp.Id `
    -NetworkSecurityGroupId $SecurityGroup.Id `
    -Tag @{$TagName="$TagValue"}

La instrucción crea una interfaz de red llamada WebServerNic, en el grupo de recursos Testing, en la región este de Estados Unidos, con una dirección IP asignada dinámicamente desde la subred public en la red virtual testing-vnet. Además, con el parámetro PublicIpAddressId, se asocia la dirección IP pública creada previamente, indicando el objeto que contiene el identificador del recurso. De igual forma, se integra el grupo de seguridad de red.

Crear cuenta de almacenamiento en Azure

Es recomendable habilitar el diagnóstico de arranque en la máquina virtual, sirve para solucionar errores de arranque de imágenes personalizadas o de plataforma. La salida de diagnóstico tendrá que guardarse en algún lugar, por lo que es necesario crear un recurso de almacenamiento.

$StorageAccountName = "webserversa$(Get-Random)"
$SkuName = "Standard_LRS"
$StorageAccount = New-AzStorageAccount `
    -ResourceGroupName $RGroupName `
    -Location $Location `
    -Name $StorageAccountName `
    -Type $SkuName `
    -Tag @{$TagName="$TagValue"}

El nombre de la cuenta de almacenamiento debe ser único, solo puede tener minúsculas y números, no puede exceder de 24 caracteres. Es por ello que uso el comando Get-Random para obtener un número aleatorio y agregarlo al final del nombre, completando así, un nombre único para la cuenta de almacenamiento.

El cmdlet New-AzStorageAccount crea una cuenta de almacenamiento. La instrucción crea el recurso de tipo general v2 (StorageV2), con redundancia local (LRS), en el grupo de recursos Testing y región este de Estados Unidos.

Crear máquina virtual en Azure

Hasta ahora hemos creado los recursos relacionados a la red y almacenamiento. Ha llegado el momento de crear la máquina virtual, utilizando los recursos previamente creados.

Primeramente, preparamos las credenciales (usuario y contraseña) y los guardamos en variables.

$User = "devops"
$Pass = ConvertTo-SecureString ' ' -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential  ($User,  $Pass)
$VMConfig = New-AzVMConfig `
    -VMName "WebServer" `
    -VMSize "Standard_B1s" | `
Set-AzVMOperatingSystem `
    -Linux `
    -ComputerName "WebServer" `
    -Credential $Cred `
    -DisablePasswordAuthentication | `
Set-AzVMSourceImage `
    -PublisherName "Canonical" `
    -Offer "UbuntuServer" `
    -Skus "18.04-LTS" `
    -Version "latest" | `
Set-AzVMOSDisk `
    -Name "WebServerDisk" `
    -CreateOption FromImage `
    -StorageAccountType Standard_LRS `
    -DiskSizeInGB 30 | `
Set-AzVMBootDiagnostic `
    -Enable `
    -ResourceGroupName $RGroupName `
    -StorageAccountName $StorageAccountName |`
    Add-AzVMNetworkInterface `
    -Id $Nic.Id

$PublicKey = Get-Content "$HOME/.ssh/id_rsa.pub"
Add-AzVMSshPublicKey `
    -VM $VMConfig `
    -KeyData $PublicKey  `
    -Path  "/home/$User/.ssh/authorized_keys"

New-AzVM `
    -ResourceGroupName $RGroupName `
    -Location $Location `
    -VM $VMConfig `
    -Tag @{$TagName="$TagValue"}

El comando ConvertTo-SecureString convierte un texto en una cadena cifrada. En este caso, se usa para cifrar la contraseña. Posteriormente se crea un objeto con el usuario y contraseña, y se guarda en la variable $cred.

El comando New-AzVMConfig crea un objeto de máquina virtual configurable para Azure. Le damos un nombre y le indicamos el sku o tamaño de la máquina (de esto depende el tamaño de memoria, CPU, etc.). Seguidamente, con el comando Set-AzVMOperationSystem se establecen las propiedades del sistema operativo, el tipo de sistema, el nombre del host, se instauran las credenciales y al mismo tiempo deshabilitamos la autenticación con contraseña, dado que accederemos con par de claves. Luego, agregamos las características de la imagen del sistema, usaremos Ubuntu Server 18.04, la última versión. El cmdlet Set-AzVMOSDisk, establece las propiedades del disco del sistema operativo, el disco se nombrará WebServerDisk, de tipo HDD estándar y 30 GB de almacenamiento. Con Set-AzVMBootDiagnostic, se están habilitando los diagnósticos de arranque para la máquina virtual, y se indica el grupo de recursos y la cuenta de almacenamiento en la que se guardarán los datos de diagnóstico. Finalmente, se agrega la interfaz de red, pasándole el id del objeto. Todo esto, es ejecutado en una sola instrucción aprovechando la utilidad de tuberías y se guarda en una variable, la cual, es usada en el siguiente bloque.

En la siguiente instrucción se usa el comando Get-Content para obtener el contenido del fichero de clave pública y se guarda en una variable, que posteriormente se pasa en la configuración de la máquina virtual. En el parámetro KeyData se agrega la llave pública y con path se establece la dirección del fichero donde se copiará en el servidor remoto.

¡Estupendo! Con la configuración lista, solo falta crear la máquina virtual de una vez por todas. Eso lo hacemos con el comando New-AzVM, se está lanzando en el grupo de recursos Testing, en la región este de Estados Unidos, y la misma etiqueta que hemos usando en todos los recursos.

Obtener dirección IP

La máquina virtual ya está creada, lo siguiente sería conectarse por SSH instalar los paquetes necesarios y administrar el servidor. Si vas al portal web y te diriges la máquina virtual, encontrarás la dirección IP pública, pero ya que tenemos PowerShell, no hace falta dar tanta vuelta. Te dejo el comando para obtener la dirección IP del servidor.

(Get-AzPublicIpAddress -Name webserver-ip).IpAddress

Una vez que has obtenido la dirección IP pública, ya puedes establecer conexión por SSH con el servidor. Ejemplo:

ssh devops@52.188.122.53

Eliminar recursos en Azure

Es importante conocer como remover los recursos creados en Azure desde la línea de comandos. Básicamente, es usar el verbo Remove, en lugar de New, el resto del nombre de los cmdlets es igual. Cuando estás haciendo pruebas como ahora, te recomiendo eliminar todos los recursos creados para evitar gastos innecesarios. Una opción es eliminarlos uno por uno, pero la mejor alternativa es eliminar el grupo de recursos totalmente, de esta forma, puedes estar seguro que no quedarán recursos sin eliminar.

Remove-AzResourceGroup -Name Testing -Force

El comando elimina el grupo de recursos Testing y todos los recursos que hayan sido creados dentro del grupo.

¿Qué sigue?

Crear recursos en Azure es un tema extenso, incluso si escribes la infraestructura en una plantilla Azure Resource Manager (ARM), necesitarás la línea de comandos para hacer el despliegue. Evidentemente, no da para describirlo en un artículo, he querido mostrarte un ejemplo útil para que le vayas tomando importancia. Si has llegado hasta el final, seguramente quieres experimentar más. Por supuesto, en la red encontraras bastante documentación para continuar tu aprendizaje. De nuestra parte, en la plataforma tenemos preparado un curso interesante para ayudarte en este camino, el Curso de administración de Azure.

Compartir este post

También te puede interesar

Icono de la tecnología
Curso

Curso de PowerShell

Principiante
1 h. y 46 min.

Aprende a utilizar PowerShell desde cero con este curso de PowerShell para principiantes y saca todo el potencial...

Manuel Fco Domínguez Tienda
4.4
Icono de la tecnología
Empresas

Curso de administración de Azure

Avanzado
1 h. y 32 min.

Este curso es esencial para aquellos que buscan profundizar en el mundo del almacenamiento y la administración de...

Alejandro Almeida
4.3