Curso de PowerShell
Aprende a utilizar PowerShell desde cero con este curso de PowerShell para principiantes y saca todo el potencial...
Aprende cómo crear recursos en Azure utilizando PowerShell, aprovechando la gran integración que tienen estos dos productos desarrollados por Microsoft.
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.
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.
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"}
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"
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.
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.
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.
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.
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.
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.
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
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.
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.
También te puede interesar
Aprende a utilizar PowerShell desde cero con este curso de PowerShell para principiantes y saca todo el potencial...
Este curso es esencial para aquellos que buscan profundizar en el mundo del almacenamiento y la administración de...
Te mostramos de una forma práctica cómo utilizar los comandos de PowerShell más importantes, esos comandos que todo administrador de sistemas Windows...