Criação de Custom Role no Azure com PowerShell no novo módulo AZ

Finalidade

Criação de grupos customizados para delegação de acessos específicos no Azure

Requisitos

Passos para criação

  • Listar Assinaturas com o comando Get-AzSubscription
  • Se já sabe qual é a Subscription que irá trabalhar, executar o comando com o nome da Subscription

Get-AzSubscription -SubscriptionName “Nome Assinatura”

  • Selecionar assinatura em qual Subscription irá trabalhar no PowerShell, obtendo os metadados usados para autenticar as solicitações do Azure Resource Manageraonde deseja criar o grupo.

Set-AzContext -SubscriptionId “xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”

  • Criar um arquivo no formato exemplo abaixo:
{
    “Name”:  “Nome do Grupo”,
    “IsCustom”:  true,
                    “Id”: “id do grupo xxxxxxxxxxxxxxxxxxx”
    “Description”:  “Descrição do Grupo.”,
    “Actions”:  [
                    “Microsoft.Storage/*”,
                    “Microsoft.Network/*”,
                    “Microsoft.Compute/*”,
                    “Microsoft.Authorization/*/read”,
                    “Microsoft.Resources/subscriptions/resourceGroups/read”,
                    “Microsoft.Resources/deployments/validate/action”,
                    “Microsoft.Resources/deployments/operations/read”,
                    “Microsoft.Resources/deployments/delete”,
                    “Microsoft.Resources/deployments/write”,
                    “Microsoft.Resources/providers/read”,
                    “Microsoft.Resources/resources/read”,
                    “Microsoft.Insights/alertRules/*”,
                    “Microsoft.Insights/diagnosticSettings/*”,
                    “Microsoft.Support/*”,
                    “Microsoft.LogAnalytics/*/read”,
                    “Microsoft.DBforMySQL/*”,
                    “Microsoft.RecoveryServices/*”,
                    “Microsoft.Insights/*/read”
    ],
    “NotActions”:  [
                   ],
    “DataActions”:  [
                    ],
    “NotDataActions”:  [
                       ],
    “AssignableScopes”:  [
                    “/subscriptions/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx”
                         ]
  }
  • Uma vez criado o JSON, salvo em determinada pasta, contendo as respectivas permissões basta executar o comando para criar o grupo na sua Subscription:

New-AzureRmRoleDefinition -InputFile “C:\_Azure\customrole.json”

  • Se for criar novo Grupo, a chave IsCustom deve ter valor True e não precisa do Id, porém se for atualizar um grupo existente a chave IsCustom se mantém com True precisando pegar o ID do Grupo para adicionar à chave Id no arquivo JSON.
  • Para pegar o ID do Grupo execute o comando:

Get-AzRoleDefinition “Nome do Grupo”

  • Exemplo de saída do comando:
Name             : Nome do Grupo
Id               : xxxxxxxxxx
IsCustom         : True
Description      : Descrição do grupo e suas ações.
Actions          : {Microsoft.Storage/*, Microsoft.Network/*, Microsoft.Compute/*, Microsoft.Authorization/*/read…}
NotActions       : {}
DataActions      : {}
NotDataActions   : {}
AssignableScopes : {/subscriptions/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
  • Editar o arquivo JSON com o ID que pegou no comando acima:
    “Name”:  “Nome do Grupo”,
    “IsCustom”:  true,
            “Id”: “xxxxxxxxxxxxxxxxxxx”
  • Depois de pegar o ID, editar o JSON, basta executar o seguinte comando para atualizar sua role customizado, comando:

Set-AzureRmRoleDefinition -InputFile “C:\_Azure\customrole.json”

Referência:

Lista de Resource Provider para pesquisar e delegar correta permissão

https://docs.microsoft.com/en-us/azure/role-based-access-control/resource-provider-operations

Tutorial oficial Docs – Custom Role Powershell

https://docs.microsoft.com/en-us/azure/role-based-access-control/tutorial-custom-role-powershell

 

 

 

Benefício Híbrido do Azure com PowerShell

Olá Pessoal ! Tudo bem ?

Este artigo é voltado para explicar um pouco o beneficio HUB  no Azure, também como aplicar este item quando já temos as máquinas virtuais criadas. Na criação de uma máquina virtual pelo portal, você pode já selecionar esta opção, recurso, já aplicando à mesma, porém tem casos em que a máquina virtual já está criada e você precisa converter para utilizar este benefício, que neste caso é possível sim.

Vejo muito assunto falando sobre o beneficio HUB no Azure, que nada mais é para empresas que possuem licenças locais do Windows Server com o Software Assurance. Com isso você só pagara pelos custos básicos da computação em Cloud (Azure).

Vamos ver na prática….

No portal do Azure, em Virtual Machines, você pode visualizar se as VMs estão com o recurso aplicado, uma vez indo Edit columms e selecionando Azure hybrid, aonde na visualizações das informações de cada irá ver se o recurso está aplicado a VM, conforme imagem abaixo:

1

Como podemos ver o recurso aplicado via PowerShell ? Primeiramente logar no Azure e selecionar assinatura, vide:

Login-AzureRmAccount
# Selecionar Assinatura Azure (subscription)
$subscriptionId =
(Get-AzureRmSubscription |
Out-GridView `
-Title “Selecionar sua Assinatura do Azure …” `
-PassThru).SubscriptionId
Select-AzureRmSubscription `
-SubscriptionId $subscriptionId

Neste powershell abaixo damos um Get nas VMs ou podemos afinar, dando um GET  nas VMs com base em Resource Group

$vms = Get-AzurermVM
$vms = Get-AzureRmVM -ResourceGroup $rgName 
foreach ($vm in $vms)
{
“VM Name: ” + $vm.Name, ” Azure hybrid Benefit for Windows Server : ” + $vm.LicenseType
}

No Foreach listamos a partir do GET as máquinas virtuais e mostramos quais benefícios quais estão aplicados ou não “Windows Server”, que é o Beneficio HUB aplicado.

Para aplicar o beneficio na VM, basta usar os comandos abaixo:

$rgName = “Nome do Resource Group”
$vmName = “Nome da VM”
$vm = Get-AzureRmVM -ResourceGroup $rgName -Name $vmName
$vm.LicenseType = “Windows_Server”
Update-AzureRmVM -ResourceGroupName $rgName -VM $vm

Bom é isso pessoal… abraços !

Referência:

https://azure.microsoft.com/en-us/pricing/hybrid-benefit/
https://docs.microsoft.com/en-us/windows-server/get-started/azure-hybrid-benefit

 

Criando uma VM no Azure a partir da imagem generalizada criada anteriormente

Anteriormente vimos como criar uma imagem a partir de uma VM já criada, via powershell, tanto para todos os discos manage disk quanto para somente o sistema operaciona.

Neste post iremos tratar via Powershell como criarmos uma vm a partir desta imagem, simples e direto segue script:

Requisito: Install-Module AzureRM.Compute,AzureRM.Network

Login-AzureRmAccount
# Selecionar Assinatura Azure (subscription)
$subscriptionId =
(Get-AzureRmSubscription |
Out-GridView `
-Title “Selecionar sua Assinatura do Azure …” `
-PassThru).SubscriptionId
Select-AzureRmSubscription `
-SubscriptionId $subscriptionId
# Visualizar Assinatura escolhida, validando.
# Get-AzureRmContext
# Definição variáveis #
$rgName = “xxxx” # Resource Group
$location = “East US” # Região, mesma Resource Group e imagem
$imageName = “xxx” # Nome da imagem gerada
$image = Get-AzureRMImage -ImageName $imageName -ResourceGroupName $rgName # Get na imagem.
$subnetName = “xxxx” # Subnet aonde irá criar a VM
$vnetName = “xxxx” # Vnet aonde irá criar a VM
$ipName = “xxxx” # Informações IP Public
$pip = New-AzureRmPublicIpAddress -Name $ipName -ResourceGroupName $rgName -Location $location -AllocationMethod Dynamic # Mudar depois para static se necessário, pelo portal.
$nicName = “xxxx” # Informações Interface NIC
$nic = New-AzureRmNetworkInterface -Name $nicName -ResourceGroupName $rgName -Location $location -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id
# Informações do NSG já criado no caso, para associar na criação
$nsgName = “xxxx”
# Get nos valores e pesquisa vnet
$vnet = Get-AzureRmVirtualNetwork -ResourceGroupName $rgName -Name $vnetName
# Usuário e senha local servidor, definir.
$cred = Get-Credential -Message “Entre com usuário e senha para a máquina virtual.”
# Nome da VM que deseja criar
$vmName = “xxxxx”
$computerName = “xxxx”
# Escolher size da VM
$vmSize = “Standard_DS1_v2”
# Lista Availability Set Homologação
#
$avset = “xxx”
# Availability Set – Setando na vm configuration abaixo
$availabilitySet = Get-AzureRmAvailabilitySet -ResourceGroupName $rgName -Name $avset
# Adicionando o nome da VM e o size para VM Configuration
$vm = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize -AvailabilitySetId $availabilitySet.Id
# Set na imagem da VM e sua origem para a nova VM
$vm = Set-AzureRmVMSourceImage -VM $vm -Id $image.Id
# Set the OS configuration and add the NIC.
$vm = Set-AzureRmVMOSDisk -VM $vm -StorageAccountType PremiumLRS -DiskSizeInGB 128 -CreateOption FromImage -Caching ReadWrite
$vm = Set-AzureRmVMOperatingSystem -VM $vm -Windows -ComputerName $computerName -Credential $cred -ProvisionVMAgent -EnableAutoUpdate
$vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $nic.Id
# Create the VM
New-AzureRmVM -VM $vm -ResourceGroupName $rgName -Location $location
# Verify that the VM was created
$vmList = Get-AzureRmVM -ResourceGroupName $rgName
$vmList.Name

Este script já cria a vm em um Availability Set já criado, porém você pode ignorar se não necessário, basta alterar esta linha:

# Availability Set – Setando na vm configuration abaixo
# $availabilitySet = Get-AzureRmAvailabilitySet -ResourceGroupName $rgName -Name $avset  (Comentar esta linha)
# Adicionando o nome da VM e o size para VM Configuration
$vm = New-AzureRmVMConfig -VMName $vmName -VMSize $vmSize

Retirar da linha acima o > -AvailabilitySetId $availabilitySet.Id

Como já tinha criado o Availability , então na variável $avset = “xxx” coloquei o nome na chave, caso não tenha como falei em alterar as linhas cima, pode comentar esta linha da seguinte forma: # $avset = “xxx”

Obrigado e até a próxima….

 

 

Criando uma imagem gerenciada (Manage image) de uma VM generalizada no Azure, via PowerShell.

Quando nos deparamos com a necessidade de criar um modelo de máquina virtual em massa, ou até mesmo replicar nosso ambiente ou para gerar um modelo padrão de vm, seja com seus aplicativos já instalados ou requisitos para implementar no IaaS sua aplicação, nos deparamos com a necessidade como tinhamos no vmware de template ou hyper-v, com isso a necessidade de ter uma imagem e gerar suas vms, já com sistema operacional e tudo o que necessita já na sua imagem.

No Azure temos como criar estes modelos, estas imagens e usá-las para criar posteriormente suas vms já com o que definiu como modelo.

Temos opções como salvar esta imagem num blob, numa storage (http:\\path\imagem.vhd) e usar para criar sua VM em modo ARM a partir desta imagem, neste caso estamos falando de VM unmanaged, sem disco gerenciado ou podemos ter um script para criar em modo ARM, já para discos gerenciáveis, replicar estas vms já criadas em modo Manage Disk para um modelo de imagem compátivel.

Abaixo temos um procedimento para executar e criar seu modelo de imagem:

Passo 1 – Utilizar o sysprep (% windir% \ system32 \ sysprep) na VM que deseja criar como imagem, com os seguintes requisitos:

sysprep

Ao término temos o processo via portal e powershell se assim escolher.

Ou executar %windir%\system32\sysprep with /generalize , shutdown option na VM.

Com PowerShell, para gerar uma imagem com todos os discos, podemos seguir da seguinte forma:

Login-AzureRmAccount
# Select an Azure subscription
$subscriptionId =
(Get-AzureRmSubscription |
Out-GridView `
-Title “Selecionar sua Assinatura do Azure …” `
-PassThru).SubscriptionId
Select-AzureRmSubscription `
-SubscriptionId $subscriptionId
$vmName = “Nome da VM”
$rgName = “Nome do Resource Group”
$location = “EastUS” # Região
$imageName = “VMImageNome” # Nome da imagem que deseja criar
Stop-AzureRmVM -ResourceGroupName $rgName -Name $vmName -Force
Set-AzureRmVm -ResourceGroupName $rgName -Name $vmName -Generalized
$vm = Get-AzureRmVM -Name $vmName -ResourceGroupName $rgName
$image = New-AzureRmImageConfig -Location $location -SourceVirtualMachineId $vm.ID
New-AzureRmImage -Image $image -ImageName $imageName -ResourceGroupName $rgName

Com PowerShell, podemos seguir para somente o disco operacional da seguinte forma:

Login-AzureRmAccount
# Select an Azure subscription
$subscriptionId =
(Get-AzureRmSubscription |
Out-GridView `
-Title “Select an Azure Subscription …” `
-PassThru).SubscriptionId
Select-AzureRmSubscription `
-SubscriptionId $subscriptionId
$vmName = “Nome da VM”
$rgName = “Nome do Resource Group”
$location = “EastUS” # Região
$imageName = “VMImageNome” # Nome da imagem que deseja criar
$vm = Get-AzureRmVm -Name $vmName -ResourceGroupName $rgName
$diskID = $vm.StorageProfile.OsDisk.ManagedDisk.Id
$imageConfig = New-AzureRmImageConfig -Location $location
$imageConfig = Set-AzureRmImageOsDisk -Image $imageConfig -OsState Generalized -OsType Windows -ManagedDiskId $diskID
New-AzureRmImage -ImageName $imageName -ResourceGroupName $rgName -Image $imageConfig

Podemos criar imagem também a partir de um snapshoot mais isso será tema de um próximo post.

Próximo post é como criar sua vm a partir da imagem criada neste post.

Obrigado !

Alterar Availability Set de uma VM Windows no Azure.

Uma VM só pode ser adicionada a um availability set quando criado. Para alterar o availability set, você precisa excluir e recriar a máquina virtual.

Para tal segue um script powershell para lhe ajudar com isso:

Para disco gerenciável, temos:

Login-AzureRmAccount

Select-AzureRmSubscription –SubscriptionId xxxxxxx

#set variables
 $rg = "Nome Resource Group"
 $vmName = "Name VM"
 $newAvailSetName = "Availability SET"
 $outFile = "C:\temp\outfile.txt"

#Get VM Details
 $OriginalVM = get-azurermvm -ResourceGroupName $rg -Name $vmName

#Output VM details to file
 "VM Name: " | Out-File -FilePath $outFile 
 $OriginalVM.Name | Out-File -FilePath $outFile -Append

"Extensions: " | Out-File -FilePath $outFile -Append
 $OriginalVM.Extensions | Out-File -FilePath $outFile -Append

"VMSize: " | Out-File -FilePath $outFile -Append
 $OriginalVM.HardwareProfile.VmSize | Out-File -FilePath $outFile -Append

"NIC: " | Out-File -FilePath $outFile -Append
 $OriginalVM.NetworkProfile.NetworkInterfaces[0].Id | Out-File -FilePath $outFile -Append

"OSType: " | Out-File -FilePath $outFile -Append
 $OriginalVM.StorageProfile.OsDisk.OsType | Out-File -FilePath $outFile -Append

"OS Disk: " | Out-File -FilePath $outFile -Append
 $OriginalVM.StorageProfile.OsDisk.Name | Out-File -FilePath $outFile -Append

$diskOS=Get-AzureRmDisk | Where-Object {$_.name -eq $OriginalVM.StorageProfile.OsDisk.Name}

if ($OriginalVM.StorageProfile.DataDisks) {
 "Data Disk(s): " | Out-File -FilePath $outFile -Append
 $OriginalVM.StorageProfile.DataDisks | Out-File -FilePath $outFile -Append
 }

#Remove the original VM
 Remove-AzureRmVM -ResourceGroupName $rg -Name $vmName

#Create new availability set if it does not exist
 $availSet = Get-AzureRmAvailabilitySet -ResourceGroupName $rg -Name $newAvailSetName -ErrorAction Ignore
 if (-Not $availSet) {
 $availset = New-AzureRmAvailabilitySet -ResourceGroupName $rg -Name $newAvailSetName -Location $OriginalVM.Location
 }

#Create the basic configuration for the replacement VM
 $newVM = New-AzureRmVMConfig -VMName $OriginalVM.Name -VMSize $OriginalVM.HardwareProfile.VmSize -AvailabilitySetId $availSet.Id
 Set-AzureRmVMOSDisk -VM $NewVM -ManagedDiskId $diskOS.Id -Name $diskOS.Name -CreateOption Attach -Windows




#Add Data Disks
 foreach ($disk in $OriginalVM.StorageProfile.DataDisks ) { 
 $diskdata = Get-AzureRmDisk | Where-Object {$_.name -eq $OriginalVM.StorageProfile.DataDisks.Name}
 Add-AzureRmVMDataDisk -VM $newVM -Name $disk.Name -ManagedDiskId $diskdata.Id -Caching $disk.Caching -Lun $disk.Lun -CreateOption Attach -DiskSizeInGB $disk.DiskSizeGB
 }

#Add NIC(s)
 foreach ($nic in $OriginalVM.NetworkProfile.NetworkInterfaces) {
 Add-AzureRmVMNetworkInterface -VM $NewVM -Id $nic.Id
 }

#Create the VM
 New-AzureRmVM -ResourceGroupName $rg -Location $OriginalVM.Location -VM $NewVM -DisableBginfoExtension

Para discos não gerenciáveis, temos o abaixo:

#set variables
 $rg = "demo-resource-group"
 $vmName = "demo-vm"
 $newAvailSetName = "demo-as"
 $outFile = "C:\temp\outfile.txt"

#Get VM Details
 $OriginalVM = get-azurermvm -ResourceGroupName $rg -Name $vmName

#Output VM details to file
 "VM Name: " | Out-File -FilePath $outFile 
 $OriginalVM.Name | Out-File -FilePath $outFile -Append

"Extensions: " | Out-File -FilePath $outFile -Append
 $OriginalVM.Extensions | Out-File -FilePath $outFile -Append

"VMSize: " | Out-File -FilePath $outFile -Append
 $OriginalVM.HardwareProfile.VmSize | Out-File -FilePath $outFile -Append

"NIC: " | Out-File -FilePath $outFile -Append
 $OriginalVM.NetworkProfile.NetworkInterfaces[0].Id | Out-File -FilePath $outFile -Append

"OSType: " | Out-File -FilePath $outFile -Append
 $OriginalVM.StorageProfile.OsDisk.OsType | Out-File -FilePath $outFile -Append

"OS Disk: " | Out-File -FilePath $outFile -Append
 $OriginalVM.StorageProfile.OsDisk.Vhd.Uri | Out-File -FilePath $outFile -Append

if ($OriginalVM.StorageProfile.DataDisks) {
 "Data Disk(s): " | Out-File -FilePath $outFile -Append
 $OriginalVM.StorageProfile.DataDisks | Out-File -FilePath $outFile -Append
 }

#Remove the original VM
 Remove-AzureRmVM -ResourceGroupName $rg -Name $vmName

#Create new availability set if it does not exist
 $availSet = Get-AzureRmAvailabilitySet -ResourceGroupName $rg -Name $newAvailSetName -ErrorAction Ignore
 if (-Not $availSet) {
 $availset = New-AzureRmAvailabilitySet -ResourceGroupName $rg -Name $newAvailSetName -Location $OriginalVM.Location
 }

#Create the basic configuration for the replacement VM
 $newVM = New-AzureRmVMConfig -VMName $OriginalVM.Name -VMSize $OriginalVM.HardwareProfile.VmSize -AvailabilitySetId $availSet.Id
 Set-AzureRmVMOSDisk -VM $NewVM -VhdUri $OriginalVM.StorageProfile.OsDisk.Vhd.Uri -Name $OriginalVM.Name -CreateOption Attach -Windows

#Add Data Disks
 foreach ($disk in $OriginalVM.StorageProfile.DataDisks ) { 
 Add-AzureRmVMDataDisk -VM $newVM -Name $disk.Name -VhdUri $disk.Vhd.Uri -Caching $disk.Caching -Lun $disk.Lun -CreateOption Attach -DiskSizeInGB $disk.DiskSizeGB
 }

#Add NIC(s)
 foreach ($nic in $OriginalVM.NetworkProfile.NetworkInterfaces) {
 Add-AzureRmVMNetworkInterface -VM $NewVM -Id $nic.Id
 }

#Create the VM
 New-AzureRmVM -ResourceGroupName $rg -Location $OriginalVM.Location -VM $NewVM -DisableBginfoExtension

Obrigado e até a próxima…