El portal de Microsoft Azure nos proporciona gran agilidad para crear y aprovisionar cualquier servicio que este a nuestra disposición y es genial poder lograr todo a través de nuestro navegador web.
Sin embargo, como ya lo he comentado en anteriores artículos, cuando la gestión de servicios empieza a crecer y se requieren tareas repetitivas, hacerlo de forma manual desde el portal web puede empezar a ser cansado.
Una consola de comandos es por excelencia una de las mejores herramientas para automatizar procesos mediante scripts, para los que manejan ambientes Windows seguramente le ponen mano a «PowerShell» y para los que utilizan ambientes Linux está por demás decir que tienen el preciado «Bash». Aunque comparten sintaxis en algunos comandos, son consolas con objetivos particulares, diseñados para atender necesidades de Sistemas Operativos diferentes.
Azure Cloud Shell
Si la posibilidad de gestionar servicios en la nube desde una consola de comandos es bastante atractivo, más lo es cuando la consola ni siquiera necesita estar instalada como cliente en nuestro equipo. Azure Cloud Shell es una consola de comandos que trabaja directamente en la nube con una interfaz web, para invocarla basta con hacer clic en el símbolo de su propio icono desde la página principal:
De primera impresión podríamos hacernos dos preguntas ¿otra consola? ¿comandos diferentes por aprender? Y la verdad es que el tema no va en esa dirección.
Azure Cloud Shell viene a actuar como un contenedor tipo Docker que encapsula a las dos consolas ya mencionadas: PowerShell y Bash. Por lo que Azure Cloud Shell da a elegir con que consola queremos gestionar nuestros servicios, y si ya conocemos muy bien alguna de estas dos, no tenemos que aprender una nueva lista de comandos.
Ambas no vienen solas, traen consigo cargadas una serie de herramientas populares que seguramente tendremos que usar en algún momento. Dando clic en los enlaces de abajo podremos saber cuáles son:
Azure CLI (Command Line Interface) es un cliente de Microsoft Azure que nos permite también desplegar servicios en la nube como PowerShell. Azure CLI viene cargado tanto en Bash como Azure PowerShell, por lo que desde ambos entornos puede ser lanzado. ¿Diferencias entre PowerShell y CLI? abajo algunos puntos a considerar:
Azure PowerShell | Azure CLI |
Modelo de objeto (Construir y enviar). | Cross Platform (Linux y Windows) |
Extensibilidad con .NET | Acciones atómicas (una a la vez) |
Digamos que escoger entre Azure PowerShell y Azure CLI depende de: la plataforma a usar, preferencias del equipo y habilidades. Siendo que con ambas llegas al mismo resultado que es despliegue de servicios sobre línea de comandos.
Iniciando con Azure Cloud Shell
Los requerimientos para poder usar Azure Cloud Shell como en casi cualquier otro servicio, son los siguientes:
- Grupo de recursos (contenedor).
- Una cuenta de almacenamiento (Blob Storage).
- Recurso compartido (Azure File).
Aspectos a considerar
- Ejecución: Azure Cloud Shell vive dentro un equipo virtual temporal por sesión de usuario, por lo que, al cerrar el portal de Microsoft Azure, este se liberará y requerirá inicializarse la próxima vez.
- Tiempo de espera: La sesión se pierde con más de 20 minutos sin interacción por parte del usuario.
- Recurso compartido: Tanto Bash como Poswer Shell se basan en el mismo recurso compartido (File Storage).
Dicho todo lo anterior se entiende que Azure Cloud Shell actúa como un contenedor que provee dos opciones para gestionar servicios de Microsoft Azure las cuales son: Bash de Linux y PowerShell de Windows. A continuación, listaré 3 scripts completos para desplegar servicios con Azure PowerShell
Web App + Azure PowerShell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# Replace the following URL with a public GitHub repo URL $gitrepo="https://github.com/Azure-Samples/app-service-web-dotnet-get-started.git" $webappname="mywebapp$(Get-Random)" $location="West Europe" # Create a resource group. New-AzureRmResourceGroup -Name myResourceGroup -Location $location # Create an App Service plan in Free tier. New-AzureRmAppServicePlan -Name $webappname -Location $location -ResourceGroupName myResourceGroup -Tier Free # Create a web app. New-AzureRmWebApp -Name $webappname -Location $location -AppServicePlan $webappname -ResourceGroupName myResourceGroup # Configure GitHub deployment from your GitHub repo and deploy once. $PropertiesObject = @{ repoUrl = "$gitrepo"; branch = "master"; isManualIntegration = "true"; } Set-AzureRmResource -PropertyObject $PropertiesObject -ResourceGroupName myResourceGroup -ResourceType Microsoft.Web/sites/sourcecontrols -ResourceName $webappname/web -ApiVersion 2015-08-01 -Force |
SQL Azure + Azure PowerShell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# Login-AzureRmAccount # Set the resource group name and location for your server $resourcegroupname = "myResourceGroup-$(Get-Random)" $location = "southcentralus" # Set an admin login and password for your server $adminlogin = "ServerAdmin" $password = "ChangeYourAdminPassword1" # Set server name - the logical server name has to be unique in the system $servername = "server-$(Get-Random)" # The sample database name $databasename = "mySampleDatabase" # The ip address range that you want to allow to access your server $startip = "0.0.0.0" $endip = "0.0.0.0" # Create a resource group $resourcegroup = New-AzureRmResourceGroup -Name $resourcegroupname -Location $location # Create a server with a system wide unique server name $server = New-AzureRmSqlServer -ResourceGroupName $resourcegroupname ` -ServerName $servername ` -Location $location ` -SqlAdministratorCredentials $(New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $adminlogin, $(ConvertTo-SecureString -String $password -AsPlainText -Force)) # Create a server firewall rule that allows access from the specified IP range $serverfirewallrule = New-AzureRmSqlServerFirewallRule -ResourceGroupName $resourcegroupname ` -ServerName $servername ` -FirewallRuleName "AllowedIPs" -StartIpAddress $startip -EndIpAddress $endip # Create a blank database with an S0 performance level $database = New-AzureRmSqlDatabase -ResourceGroupName $resourcegroupname ` -ServerName $servername ` -DatabaseName $databasename ` -RequestedServiceObjectiveName "S0" ` -SampleName "AdventureWorksLT" # Clean up deployment # Remove-AzureRmResourceGroup -ResourceGroupName $resourcegroupname |
Virtual Machine + Azure PowerShell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# Variables for common values $resourceGroup = "myResourceGroup" $location = "westeurope" $vmName = "myVM" # Create user object $cred = Get-Credential -Message "Enter a username and password for the virtual machine." # Create a resource group New-AzureRmResourceGroup -Name $resourceGroup -Location $location # Create a subnet configuration $subnetConfig = New-AzureRmVirtualNetworkSubnetConfig -Name mySubnet -AddressPrefix 192.168.1.0/24 # Create a virtual network $vnet = New-AzureRmVirtualNetwork -ResourceGroupName $resourceGroup -Location $location ` -Name MYvNET -AddressPrefix 192.168.0.0/16 -Subnet $subnetConfig # Create a public IP address and specify a DNS name $pip = New-AzureRmPublicIpAddress -ResourceGroupName $resourceGroup -Location $location ` -Name "mypublicdns$(Get-Random)" -AllocationMethod Static -IdleTimeoutInMinutes 4 # Create an inbound network security group rule for port 3389 $nsgRuleRDP = New-AzureRmNetworkSecurityRuleConfig -Name myNetworkSecurityGroupRuleRDP -Protocol Tcp ` -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * ` -DestinationPortRange 3389 -Access Allow # Create a network security group $nsg = New-AzureRmNetworkSecurityGroup -ResourceGroupName $resourceGroup -Location $location ` -Name myNetworkSecurityGroup -SecurityRules $nsgRuleRDP # Create a virtual network card and associate with public IP address and NSG $nic = New-AzureRmNetworkInterface -Name myNic -ResourceGroupName $resourceGroup -Location $location ` -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id # Create a virtual machine configuration $vmConfig = New-AzureRmVMConfig -VMName $vmName -VMSize Standard_D1 | ` Set-AzureRmVMOperatingSystem -Windows -ComputerName $vmName -Credential $cred | ` Set-AzureRmVMSourceImage -PublisherName MicrosoftWindowsServer -Offer WindowsServer -Skus 2016-Datacenter -Version latest | ` Add-AzureRmVMNetworkInterface -Id $nic.Id # Create a virtual machine New-AzureRmVM -ResourceGroupName $resourceGroup -Location $location -VM $vmConfig |
Sígueme en Twitter @vmorenoz
¿Te gustó este artículo? Únete a Facebook en MicrosoftLand