Provisionando Lab com AZ CLI + Bash

Quem nunca precisou de um lab, seja para estudar alguma tecnologia nova ou realizar algum teste?

Com a flexibilidade em ambientes cloud isso facilita muito no dia a dia e ter a possibilidade de criar e recriar um ambiente com alguns cliques conseguimos agilidade.

Provisionar um recurso pelo painel pode ser bem simples e intuitivo, porém com o poder das ferramentas de linha de comando conseguimos automatizar algumas tarefas. Atualmente temos várias ferramentas para esse tipo de provisionamento por exemplo:

– AZ CLI
– ANSIBLE
– TERRAFORM

Inclusive tem um conteúdo bacana sobre Terraform publicado pelo Vanderlei Mota aqui.

Costumo utilizar az cli + bash no dia a dia para automatizar algumas tarefas e economizar alguns minutos do meu dia. Em breve compartilho alguns scripts que utilizo.

A documentação da Microsoft é bem ampla sobre a ferramenta de linha de comando e possui diversos exemplos de utilização dos comandos.

O ambiente que estou utilizando para esse tutorial é baseado em Linux e com o az cli instalado e devidamente logado na minha subscription.

Após seguir o processo de instalação do az cli, basta efetuar o login:

A janela do browser abrirá e basta você logar com a sua conta.

Basta fechar essa janela e voltar para o Shell.

Caso você possua mais de uma subscription, garanta que o campo “isDefault” esteja como True na subscription que você deseja utilizar.

Você pode consultar qual está como default pelo comando:

$ az account list -o table | grep -i true

Caso precise alterar a subscription, basta configurar ela:

$ az account set –subscription “Nome da sua Subscription”

Agora já temos nosso cli devidamente configurado.

Vamos provisionar uma infra básica contendo 2 servidores linux, dentro da mesma VNET e com acesso restrito a porta SSH (22) somente para o nosso IP de origem.

Vamos executar o script parte a parte para entender os passos:

Definir os valores para as variáveis, nome de RG, location, VNET, Subnet, SO e size:

resourceGroup=Lab-Tera
resourceLocation=eastus
vnetAddress=10.0.0.0/16
subnetAddress=10.0.0.0/24
vnetName=Vnet-Lab-Tera
subnetName=Subnet-Lab-Tera
nsgSubnetName=NSG-Subnet-Lab-Tera
vmImage=UbuntuLTS
vmSize=Standard_B1ls

Criando Resource Group

$ az group create –name $resourceGroup –location $resourceLocation

Criando VNet

$ az network vnet create \
  –resource-group $resourceGroup \
  –location $resourceLocation \
  –address-prefix $vnetAddress \
  –name $vnetName

Criando NSG para a Subnet

$ az network nsg create \
  –resource-group $resourceGroup \
  –name $nsgSubnetName

Criando Subnet e adicionando a NSG

$ az network vnet subnet create \
  –resource-group $resourceGroup \
  –vnet-name $vnetName \
  –name $subnetName \
  –address-prefixes $subnetAddress \
  –network-security-group $nsgSubnetName

Atribuindo o ID da subnet para utilizar na criação das VMs

$ subnetId=$(az network vnet subnet show \
  –resource-group $resourceGroup –name $subnetName \
  –vnet-name $vnetName –query id -o tsv) 

Criando 2 VMs

$ for i in `seq 1 2`; do
az vm create \
  –resource-group $resourceGroup \
  –name VM$i \
  –image $vmImage \
  –size $vmSize \
  –generate-ssh-keys \
  –subnet $subnetId \
  –no-wait
done

Pegando o IP de origem para criar NSG de entrada para as VMs

$ sourceIp=$(curl ifconfig.me)

Criando regra de entrada na subnet para SSH com IP de origem

$ az network nsg rule create \
  –resource-group $resourceGroup \
  –nsg-name $nsgSubnetName \
  –name Allow-Source-Home \
  –priority 300 \
  –source-address-prefixes $sourceIp/32 –source-port-ranges ‘*’ \
  –destination-address-prefixes ‘*’ –destination-port-ranges 22 –access Allow \
  –protocol Tcp –description “Allow SSH from my home”

Criando regra na NSG das VMs para SSH com IP de origem

$ for i in `seq 1 2`; do
  while [ ! $(az network nsg rule list -g $resourceGroup            –nsg-name VM${i}NSG) ]; do
    echo ‘Aguardando NSG ser criada…’
  done
az network nsg rule create \
  –resource-group $resourceGroup \
  –nsg-name VM${i}NSG \
  –name Allow-Source-Home \
  –priority 300 \
  –source-address-prefixes $sourceIp/32 –source-port-ranges ‘*’ \
  –destination-address-prefixes ‘*’ –destination-port-ranges 22 –access Allow \
  –protocol Tcp –description “Allow SSH from my home”
az network nsg rule delete \
  –resource-group $resourceGroup \
  –nsg-name VM${i}NSG \
  –name default-allow-ssh
done

O usuário criado na VM é o mesmo da sua sessão no shell e as chaves são as mesma que estão no seu perfil.

Pegando os IPs Públicos

$ for i in `seq 1 2`; do
az vm show -d -g $resourceGroup -n VM$i –query ‘[name,publicIps]’ -o tsv 
done

Pronto, seu Lab está provisionado.

Para deletar o Lab basta executar:

$ az group delete -n Lab-Tera

Caso queira escolher outro size, pesquise pelo cli o nome do size e troque na variável $vmSize

$ az vm list-sizes –location “eastus” -o table