186 lines
8.9 KiB
PowerShell
186 lines
8.9 KiB
PowerShell
[CmdletBinding()] #
|
|
param (
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'FromSCTask')]
|
|
$SCTaskNum,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'ManualEntry')]
|
|
[string]
|
|
$FQDN,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'ManualEntry', HelpMessage = "Example: Standard_D4ds_v5")]
|
|
[string]
|
|
$VmSize,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'ManualEntry')]
|
|
[int]
|
|
$DiskOsGB = 128,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'ManualEntry')]
|
|
[int]
|
|
$DiskDataGB = 20,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'ManualEntry')]
|
|
[string]
|
|
$Subnet,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'ManualEntry')]
|
|
[string]
|
|
$OS = 'Windows Server 2022',
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'ManualEntry')]
|
|
[string]
|
|
$VMEnvironment,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'ManualEntry')]
|
|
[string]
|
|
$AppName,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'ManualEntry')]
|
|
[string]
|
|
$LicensingRestrictions = 'No Licensing Restrictions',
|
|
|
|
[string]
|
|
$ResourceGroupNameOverride,
|
|
|
|
[Parameter(Mandatory = $true, ParameterSetName = 'ManualEntry')]
|
|
[ValidateSet('No Zone', 'Zone 1', 'Zone 2', 'Zone 3')]
|
|
[string]
|
|
$AvailabilityZone
|
|
)
|
|
|
|
switch ($PSCmdlet.ParameterSetName) {
|
|
'ManualEntry' {
|
|
$NewITDWindowsVmAzureParams = @{
|
|
FQDN = $FQDN;
|
|
AppName = $AppName;
|
|
VmSize = $VmSize;
|
|
#CPU = $CPU;
|
|
#MemoryGB = $MemoryGB;
|
|
DiskOsGB = $DiskOsGB;
|
|
DiskDataGB = $DiskDataGB;
|
|
Subnet = $Subnet;
|
|
OS = $OS;
|
|
VMEnvironment = $VMEnvironment;
|
|
LicensingRestrictions = $LicensingRestrictions;
|
|
}
|
|
switch ($PSBoundParameters.Keys) {
|
|
'ResourceGroupNameOverride' { $NewITDWindowsVmAzureParams += @{ ResourceGroupNameOverride = $ResourceGroupNameOverride } }
|
|
'AvailabilityZone' { $NewITDWindowsVmAzureParams += @{ AvailabilityZone = $AvailabilityZone } }
|
|
}
|
|
}
|
|
'FromSCTask' {
|
|
Write-Verbose -Message ("UAJob.ComputerName = " + $UAJob.ComputerName) -Verbose
|
|
switch ($UAJob.ComputerName) {
|
|
"ITDWINAUTOT1" { $ServiceNowEnvironment = 'Test' }
|
|
"ITDWINAUTOP1" { $ServiceNowEnvironment = 'Production' }
|
|
}
|
|
Write-Verbose -Message "New-ITDServiceNowSession" -Verbose
|
|
New-ITDServiceNowSession -Environment $ServiceNowEnvironment -Credential $Secret:snow_vmcred
|
|
|
|
$SCTask = Get-ITDServiceNowRecord -ItemType 'Catalog Task' -Number $SCTaskNum
|
|
$Ritm = Get-ITDServiceNowRecord -ItemType 'Request Item' -SysId ($SCTask.request_item.value) -IncludeVariableSet -IncludeCustomVariable
|
|
|
|
$FqdnFromSCTaskDescription = ($SCTask.short_description).display_value.split(' ')[7]
|
|
|
|
$AvailabilityZone =
|
|
|
|
$NewITDWindowsVmAzureParams = @{
|
|
FQDN = ( ($Ritm.VariableSet | Where-Object { $_.host_name -eq $FqdnFromSCTaskDescription }).host_name );
|
|
VmSize = ( ($Ritm.VariableSet | Where-Object { $_.host_name -eq $FqdnFromSCTaskDescription }).azure_vm_size );
|
|
DiskOsGB = ( ($Ritm.VariableSet | Where-Object { $_.host_name -eq $FqdnFromSCTaskDescription }).disk_1_os );
|
|
DiskDataGB = ( ($Ritm.VariableSet | Where-Object { $_.host_name -eq $FqdnFromSCTaskDescription }).disk_3 );
|
|
Subnet = ( Get-ITDServiceNowRecord -Table 'cmdb_ci_ip_network' -SysId ($Ritm.VariableSet | Where-Object { $_.host_name -eq "$FqdnFromSCTaskDescription" }).cidr_block).name.display_value;
|
|
OS = ( ($Ritm.VariableSet | Where-Object { $_.host_name -eq $FqdnFromSCTaskDescription }).target_os_version_windows );
|
|
VMEnvironment = ( $Ritm.customvariable.environment.value );
|
|
AppName = ( Get-ITDServiceNowRecord -Table 'cmdb_ci_service' -SysId ($Ritm.VariableSet | Where-Object { $_.host_name -eq "$FqdnFromSCTaskDescription" }).application_info).name.display_value;
|
|
LicensingRestrictions = ( ($Ritm.VariableSet | Where-Object { $_.host_name -eq $FqdnFromSCTaskDescription }).licensing_restrictions );
|
|
}
|
|
|
|
switch ( ($Ritm.VariableSet | Where-Object { $_.host_name -eq $FqdnFromSCTaskDescription }).zone ) {
|
|
'Zone 1' { $NewITDWindowsVMAzureParams += @{ AvailabilityZone = 1 } }
|
|
'Zone 2' { $NewITDWindowsVMAzureParams += @{ AvailabilityZone = 2 } }
|
|
'Zone 3' { $NewITDWindowsVMAzureParams += @{ AvailabilityZone = 3 } }
|
|
}
|
|
|
|
switch ($PSBoundParameters.Keys) {
|
|
'ResourceGroupNameOverride' {
|
|
Write-Warning -Message "ResourceGroupNameOverride found $ResourceGroupNameOverride"
|
|
$NewITDWindowsVMAzureParams += @{ ResourceGroupNameOverride = $ResourceGroupNameOverride }
|
|
}
|
|
<#'AvailabilityZone' {
|
|
Write-Warning -Message "ResourceGroupNameOverride found $AvailabilityZone"
|
|
$NewITDWindowsVMAzureParams += @{ AvailabilityZone = $AvailabilityZone }
|
|
}#>
|
|
<# 'VMSizeOverride' {
|
|
Write-Warning -Message "VMSizeOverride found $VMSizeOverride"
|
|
$NewITDWindowsVMAzureParams += @{ VMSizeOverride = $VMSizeOverride }
|
|
}#>
|
|
}
|
|
<#If ($NewITDWindowsVmAzureParams.VMSizeOverride) {
|
|
# do nothing
|
|
} Else {
|
|
$NewITDWindowsVMAzureParams += @{ CPU = ( ($Ritm.VariableSet | Where-Object { $_.host_name -eq $FqdnFromSCTaskDescription }).processors );}
|
|
$NewITDWindowsVMAzureParams += @{ MemoryGB = ( ($Ritm.VariableSet | Where-Object { $_.host_name -eq $FqdnFromSCTaskDescription }).memory_gb );}
|
|
}#>
|
|
}
|
|
}
|
|
|
|
Write-Verbose -Message "Connect to Azure using Service Principal" -Verbose
|
|
$tenantId = '2dea0464-da51-4a88-bae2-b3db94bc0c54'
|
|
$AppId = '60244573-7130-4026-9c6d-47de73f8ca29'
|
|
$SecureStringPwd = $Secret:azure_iaasserviceprincipal
|
|
$PSCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $AppId, ($SecureStringPwd | ConvertTo-SecureString -AsPlainText -Force)
|
|
Connect-AzAccount -ServicePrincipal -Credential $PSCredential -Tenant $tenantId
|
|
|
|
Write-Verbose -Message "Attempt server provisioning" -Verbose
|
|
Write-Verbose -Message "NewITDWindowsVMAzureParams:" -Verbose
|
|
Write-Verbose -Message ("FQDN " + $NewITDWindowsVMAzureParams.FQDN) -Verbose
|
|
Write-Verbose -Message ("VmSize " + $NewITDWindowsVMAzureParams.VmSize) -Verbose
|
|
Write-Verbose -Message ("DiskOsGB " + $NewITDWindowsVMAzureParams.DiskOsGB) -Verbose
|
|
Write-Verbose -Message ("DiskDataGB " + $NewITDWindowsVMAzureParams.DiskDataGB) -Verbose
|
|
Write-Verbose -Message ("Subnet " + $NewITDWindowsVMAzureParams.Subnet) -Verbose
|
|
Write-Verbose -Message ("OS " + $NewITDWindowsVMAzureParams.OS) -Verbose
|
|
Write-Verbose -Message ("VMEnvironment " + $NewITDWindowsVMAzureParams.Environment) -Verbose
|
|
Write-Verbose -Message ("AppName " + $NewITDWindowsVMAzureParams.AppName) -Verbose
|
|
Write-Verbose -Message ("LicensingRestrictions " + $NewITDWindowsVMAzureParams.LicensingRestrictions) -Verbose
|
|
try {
|
|
New-ITDWindowsVmAzureStep1 @NewITDWindowsVmAzureParams -Credential $Secret:ndgov_svcitdiaasauto -Verbose
|
|
Write-Verbose -Message "New-ITDWindowsVmAzureStep1 function completed"
|
|
$Step1Complete = $true
|
|
}
|
|
catch {
|
|
$Step1Complete = $false
|
|
switch ($PSCmdlet.ParameterSetName) {
|
|
'FromSCTask' {
|
|
$ErrorText = ($_.ErrorDetails.message | ConvertFrom-Json).text
|
|
If ($ErrorText -match "Cannot find 1 available IP address" ) {
|
|
$Msg = "Resolve the issue and resubmit the Server Build Request catalog item. Setting $SCTaskNum State to Closed Incomplete"
|
|
Write-Warning -Message $Msg
|
|
Update-ITDServiceNowRecord -ItemType 'Catalog Task' -Number $SCTaskNum -Values @{
|
|
work_notes = ("Azure build step 1 errored. $Msg. `nPSU Job Id #" + $UAJob.Id + " `n" + $ErrorText)
|
|
state = 'Closed Incomplete'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
throw
|
|
}
|
|
|
|
|
|
switch ($PSCmdlet.ParameterSetName) {
|
|
'FromSCTask' {
|
|
Write-Verbose -Message ("Update " + $SCTaskNum + " with Step 1 status") -Verbose
|
|
switch ($Step1Complete) {
|
|
$true {
|
|
Update-ITDServiceNowRecord -ItemType 'Catalog Task' -Number $SCTaskNum -Values @{
|
|
work_notes = ("Azure build step 1 complete. `nPSU Job Id #" + $UAJob.Id)
|
|
}
|
|
}
|
|
$false {
|
|
Update-ITDServiceNowRecord -ItemType 'Catalog Task' -Number $SCTaskNum -Values @{
|
|
work_notes = ("Azure build step 1 errored, needs human review. `nPSU Job Id #" + $UAJob.Id)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |