|
| 1 | +<# |
| 2 | +.SYNOPSIS |
| 3 | + Creates a small environment in Azure. |
| 4 | +
|
| 5 | +.DESCRIPTION |
| 6 | + A PowerShell script that creates a small environment in Azure. |
| 7 | +
|
| 8 | +.PARAMETER VmSize |
| 9 | + The unique identifier of the client (app registration). |
| 10 | +
|
| 11 | +.PARAMETER AdministratorCredentials |
| 12 | + The credentials of the administrator user. |
| 13 | +
|
| 14 | +.OUTPUTS |
| 15 | + On success - the environment is created. |
| 16 | + On failure - an error message indicating what went wrong. |
| 17 | +
|
| 18 | +.EXAMPLE |
| 19 | + Create-SmallEnvironment -VmSize $vmSize -AdministratorCredentials $credentials |
| 20 | +#> |
| 21 | + |
| 22 | +[CmdletBinding()] |
| 23 | +param ( |
| 24 | + [Parameter(Mandatory = $true, HelpMessage = "Please provide the virtual machine size.")] |
| 25 | + [string]$VmSize, |
| 26 | + |
| 27 | + [Parameter(Mandatory = $true, HelpMessage = "Please pass a credentials object for the administrator user.")] |
| 28 | + [System.Management.Automation.PSCredential]$AdministratorCredentials |
| 29 | +) |
| 30 | + |
| 31 | +############# Environment Settings |
| 32 | +$region = "Sweden Central" # swedencentral |
| 33 | +$resourceGroupName = "QuantumDMS-BLD-PROD" |
| 34 | + |
| 35 | +$vmName = "QuantumDMS-VM01" |
| 36 | +$vmSize = "Standard_D2_v5" |
| 37 | +$vmStorageAccountName = "quantumdms$(Get-Random)" # Must be globally unique |
| 38 | + |
| 39 | +$virtualNetworkName = "quantumdms-vnet" |
| 40 | +$virtualNetworkNicName = "quantumdms-nic" |
| 41 | +$virtualNetworkAddressPrefixes = "192.168.0.0/16" # NOT SURE ABOUT THIS |
| 42 | +$virtualNetworkSubnetName = "quantumdms-subnet" |
| 43 | +$virtualNetworkSubnetPrefix = "192.168.1.0/24" |
| 44 | + |
| 45 | +$nsgName = "quantumdms-nsg" |
| 46 | +#$nsgRuleSSHName = "quantumdms-nsg-ssh" |
| 47 | +$nsgRuleWebName = "quantumdms-nsg-web" |
| 48 | +$nsgRuleAdminName = "quantumdms-nsg-admin" |
| 49 | +$nsgRuleRdpName = "quantumdms-nsg-rdp" |
| 50 | + |
| 51 | +$dataDiskName = "quantumdms-disk-data" |
| 52 | +$osDiskName = "quantumdms-disk-os" |
| 53 | +$dataDiskSize = 64 |
| 54 | + |
| 55 | +$publicIpName = "quantumdms-publicip" |
| 56 | +$domainNameLabel = "quantumdms-bld" |
| 57 | +$publicIPAllocationMethod = "Static" |
| 58 | +############# Environment Settings |
| 59 | + |
| 60 | +# Create Resource Group |
| 61 | +New-AzResourceGroup -Name $resourceGroupName -Location $region |
| 62 | + |
| 63 | +# Storage account |
| 64 | +New-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $vmStorageAccountName -Type Standard_LRS -Location $region -Kind StorageV2 -AccessTier Hot |
| 65 | + |
| 66 | +# Create a subnet configuration |
| 67 | +$subnetConfig = New-AzVirtualNetworkSubnetConfig -Name $virtualNetworkSubnetName -AddressPrefix $virtualNetworkSubnetPrefix |
| 68 | + |
| 69 | +# Create a virtual network |
| 70 | +$vnet = New-AzVirtualNetwork -ResourceGroupName $resourceGroupName -Location $region -Name $virtualNetworkName -AddressPrefix $virtualNetworkAddressPrefixes -Subnet $subnetConfig |
| 71 | + |
| 72 | +# Create a public IP address and specify a DNS name |
| 73 | +$pip = New-AzPublicIpAddress -ResourceGroupName $resourceGroupName -Location $region -AllocationMethod $publicIPAllocationMethod -IdleTimeoutInMinutes 4 -Name "$publicIpName$(Get-Random)" -DomainNameLabel $domainNameLabel |
| 74 | + |
| 75 | +# Create an inbound network security group rule for port 443 |
| 76 | +$nsgRuleWeb = New-AzNetworkSecurityRuleConfig -Name $nsgRuleWebName -Protocol Tcp ` |
| 77 | +-Direction Inbound -Priority 1001 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 443 -Access Allow |
| 78 | + |
| 79 | +# Create an inbound network security group rule for port 5001 |
| 80 | +$nsgRuleAdmin = New-AzNetworkSecurityRuleConfig -Name $nsgRuleAdminName -Protocol Tcp ` |
| 81 | +-Direction Inbound -Priority 1002 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 5001 -Access Allow |
| 82 | + |
| 83 | +# Create an inbound network security group rule for port 3389 |
| 84 | +$nsgRuleRdp = New-AzNetworkSecurityRuleConfig -Name $nsgRuleRdpName -Protocol Tcp ` |
| 85 | +-Direction Inbound -Priority 1003 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 3389 -Access Allow |
| 86 | + |
| 87 | +# Create a network security group |
| 88 | +$nsg = New-AzNetworkSecurityGroup -ResourceGroupName $resourceGroupName -Location $region -Name $nsgName -SecurityRules $nsgRuleWeb,$nsgRuleAdmin,$nsgRuleRdp |
| 89 | + |
| 90 | +# Create a virtual network card and associate it with public IP address and NSG |
| 91 | +$nic = New-AzNetworkInterface -Name $virtualNetworkNicName -ResourceGroupName $resourceGroupName -Location $region -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id |
| 92 | + |
| 93 | +# Virtual Machine |
| 94 | +$virtualMachineConfig = New-AzVMConfig -VMName $vmName -VMSize $vmSize |
| 95 | + |
| 96 | +Set-AzVMOperatingSystem -VM $virtualMachineConfig -Windows -ComputerName $vmName -Credential $credentials |
| 97 | + |
| 98 | +Set-AzVMSourceImage -VM $virtualMachineConfig -PublisherName "MicrosoftWindowsServer" -Offer "WindowsServer" -Skus "2022-datacenter-azure-edition-core" -Version "latest" |
| 99 | + |
| 100 | +# Set the operating system disk properties on a VM |
| 101 | +$setDiskResult = Set-AzVMOSDisk -VM $virtualMachineConfig -CreateOption FromImage -StorageAccountType StandardSSD_LRS -Name $osDiskName |
| 102 | +$setDiskResult | Set-AzVMBootDiagnostic -ResourceGroupName $resourceGroupName -StorageAccountName $vmStorageAccountName -Enable | Add-AzVMNetworkInterface -Id $nic.Id |
| 103 | + |
| 104 | +# Create the VM |
| 105 | +New-AzVM -ResourceGroupName $resourceGroupName -Location $region -VM $virtualMachineConfig |
| 106 | +$vm = Get-AzVm -ResourceGroupName $resourceGroupName -Name $vmName |
| 107 | + |
| 108 | +# Data disk |
| 109 | +$diskConfig = New-AzDiskConfig -Location $region -CreateOption Empty -DiskSizeGB $dataDiskSize -SkuName StandardSSD_LRS |
| 110 | +$newDataDisk = New-AzDisk -ResourceGroupName $resourceGroupName -DiskName $dataDiskName -Disk $diskConfig |
| 111 | +Add-AzVMDataDisk -VM $vm -Name $dataDiskName -CreateOption Attach -ManagedDiskId $newDataDisk.Id -Lun 1 |
| 112 | +Update-AzVM -VM $vm -ResourceGroupName $vm.ResourceGroupName |
| 113 | +Invoke-AzVMRunCommand -VM $vm -CommandId 'RunPowerShellScript' -ScriptString "Get-disk | where-Object Number -eq '1' | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -UseMaximumSize -DriveLetter E | Format-Volume -FileSystem NTFX -NewFileSystemLabel 'QuantumDMS-Data'" |
0 commit comments