update
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
trigger:
|
||||
- main
|
||||
|
||||
name: 'ITD.Infra-VMware.VirtualMachine'
|
||||
|
||||
variables:
|
||||
major: 2
|
||||
minor: 0
|
||||
patch: $(Build.BuildID)
|
||||
buildVer: $(major).$(minor).$(Build.BuildID)
|
||||
|
||||
pool: itdwinautop1
|
||||
|
||||
stages:
|
||||
- stage: Build
|
||||
jobs:
|
||||
- job: Build
|
||||
steps:
|
||||
- task: PowerShell@2
|
||||
inputs:
|
||||
filePath: '$(System.DefaultWorkingDirectory)/Build/build.ps1'
|
||||
- task: NuGetCommand@2
|
||||
inputs:
|
||||
command: 'pack'
|
||||
packagesToPack: '$(System.DefaultWorkingDirectory)/ITD.Infra-VMware.VirtualMachine.nuspec'
|
||||
versioningScheme: byEnvVar
|
||||
versionEnvVar: buildVer
|
||||
buildProperties: 'VERSIONHERE=$(buildVer)'
|
||||
- task: PublishBuildArtifacts@1
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
|
||||
ArtifactName: 'NuGetPackage'
|
||||
publishLocation: 'Container'
|
||||
- stage: Deploy
|
||||
jobs:
|
||||
- job: Deploy
|
||||
steps:
|
||||
- task: DownloadPipelineArtifact@2
|
||||
inputs:
|
||||
buildType: 'current'
|
||||
artifactName: 'NuGetPackage'
|
||||
itemPattern: '**'
|
||||
targetPath: '$(Pipeline.Workspace)'
|
||||
- task: NuGetCommand@2
|
||||
inputs:
|
||||
command: 'push'
|
||||
packagesToPush: '$(Pipeline.Workspace)/ITD.Infra-VMware.VirtualMachine.$(major).$(minor).$(Build.BuildID).nupkg'
|
||||
nuGetFeedType: external
|
||||
publishFeedCredentials: 'ITD_PwshGallery'
|
||||
@@ -0,0 +1,17 @@
|
||||
$buildVersion = $env:BUILDVER
|
||||
$moduleName = 'ITD.Infra-VMware.VirtualMachine'
|
||||
|
||||
$manifestPath = Join-Path -Path $env:SYSTEM_DEFAULTWORKINGDIRECTORY -ChildPath "$moduleName.psd1"
|
||||
$modulePath = Join-Path -Path $env:SYSTEM_DEFAULTWORKINGDIRECTORY -ChildPath "$moduleName.psm1"
|
||||
|
||||
## Update build version in manifest
|
||||
$manifestContent = Get-Content -Path $manifestPath -Raw
|
||||
$manifestContent = $manifestContent -replace '<ModuleVersion>', $buildVersion
|
||||
|
||||
## Update functions to export in manifest
|
||||
Import-Module $modulePath
|
||||
$funcStrings = (Get-Module ITD.Infra-VMware.VirtualMachine).ExportedCommands.Values.Name
|
||||
$funcStrings = "'$($funcStrings -join "','")'"
|
||||
$manifestContent = $manifestContent -replace "<FunctionsToExport>", $funcStrings
|
||||
|
||||
$manifestContent | Set-Content -Path $manifestPath
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
Param(
|
||||
[string]
|
||||
$SCTaskNum
|
||||
)
|
||||
|
||||
New-ServiceNowSession -Url 'northdakota.service-now.com' -Credential $Secret:SNowVMCred
|
||||
Connect-ITDvCenter -Credential $Secret:svcitdvmvcauto
|
||||
|
||||
$Filter = @('assignment_group', '-like', 'NDIT-Server Build Automation'), '-and', @('short_description', '-like', 'Windows Guest OS complete. Hardware team review.'), '-and', @('state', '-eq', '2') # 2 = 'work in progress'
|
||||
$OpenTasks = Get-ServiceNowRecord -Table 'Catalog Task' -Filter $Filter | Sort-Object Number
|
||||
If ($PSBoundParameters.ContainsKey("SCTaskNum")) {
|
||||
Write-Verbose -Message "SCTaskNum parameter found, value is $SCTaskNum"
|
||||
$OpenTasks = $OpenTasks | Where-Object Number -EQ $SCTaskNum
|
||||
}
|
||||
|
||||
Write-Verbose -Message ("OpenTasks found: " + $OpenTasks.count) -Verbose
|
||||
ForEach ($OpenTask in $OpenTasks) {
|
||||
Write-Verbose -Message $OpenTasks.Number -Verbose
|
||||
}
|
||||
|
||||
ForEach ($OpenTask in $OpenTasks) {
|
||||
$Ci = $null
|
||||
$BuildComplete = $null
|
||||
|
||||
# get SCTask, Ritm
|
||||
$SCTaskNum = $OpenTask.number
|
||||
Write-Verbose -Message "Start $SCTasknum" -Verbose
|
||||
$SCTask = Get-ServiceNowRecord -Table 'Catalog Task' -ID $SCTaskNum
|
||||
$shortdescription = $SCTask.short_description
|
||||
$RitmNum = $SCTask.request_item.display_value
|
||||
$Ritm = Get-ServiceNowRecord -Table 'Requested Item' -ID $RitmNum -IncludeCustomVariable -WarningAction SilentlyContinue
|
||||
|
||||
switch (($Ritm.CustomVariable | Where-Object Name -EQ target_platform).Value) {
|
||||
'azure' { $target_platform = "Azure" }
|
||||
'vmware' { $target_platform = "VMware" }
|
||||
}
|
||||
|
||||
$FormFQDN = ($RITM.CustomVariable | Where-Object Name -EQ "host_name").value
|
||||
$FormHostName = $FormFQDN.split('.')[0]
|
||||
|
||||
$Ci = Get-ServiceNowRecord -Table cmdb_ci -Filter @('name', '-eq', $FormHostName)
|
||||
|
||||
If ($Ci) {
|
||||
Write-Verbose -Message ("Ci found, sys_id = " + $Ci.sys_id + ", name = " + $Ci.name + ", fqdn = " + $Ci.fqdn) -Verbose
|
||||
}
|
||||
switch ($target_platform) {
|
||||
{ $_ -like "*VMware*" } {
|
||||
Connect-ITDvCenter -Credential $Secret:svcitdvmvcauto
|
||||
Write-Verbose -Message ("$FormFQDN is a VMware VM. Determine if SRM was requested.") -Verbose
|
||||
$hardware_platform = "VMware";
|
||||
$hardware_type = 'Virtual Machine'
|
||||
|
||||
If ( ($Ritm.CustomVariable | Where-Object Name -EQ 'dr_protection').Value -eq 'No DR') {
|
||||
Write-Verbose -Message ("$FormFQDN dr_protection equals 'No DR'") -Verbose
|
||||
Approve-ITDVMNewBuild -SCTaskNum $SCTaskNum -CloseTask -Verbose
|
||||
}
|
||||
Else {
|
||||
Write-Verbose -Message ("$FormFQDN dr_protection is requested") -Verbose
|
||||
Write-Warning -Message ("SRM is requested, task will not auto close. -- ZM") -Verbose
|
||||
Approve-ITDVMNewBuild -SCTaskNum $SCTaskNum
|
||||
}
|
||||
Disconnect-ITDvCenter
|
||||
}
|
||||
{ $_ -like "*Microsoft Virtual Machine*" } {
|
||||
Write-Verbose -Message ("$FormFQDN is an Azure VM. DR is not an option, proceed.") -Verbose
|
||||
$hardware_platform = "Azure";
|
||||
$hardware_type = 'Virtual Machine'
|
||||
Write-Warning -Message ("Final close task is commented out until testing can occur. -- ZM") -Verbose
|
||||
#Approve-ITDVMNewBuild -SCTaskNum $SCTaskNum
|
||||
}
|
||||
{ $_ -like "*HP*" } {
|
||||
Write-Verbose -Message ("$FormFQDN is an HPE device.") -Verbose
|
||||
$hardware_platform = 'HPE';
|
||||
$hardware_type = 'Physical'
|
||||
Write-Warning -Message ("Final close task is commented out until testing can occur. -- ZM") -Verbose
|
||||
}
|
||||
default {
|
||||
$hardware_platform = 'Other'
|
||||
Write-Warning -Message ("Ci found, but unavailable to determine hardware platform.")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Disconnect-ITDvCenter
|
||||
+89
@@ -0,0 +1,89 @@
|
||||
Param(
|
||||
[string]
|
||||
$SCTaskNum
|
||||
)
|
||||
|
||||
New-ServiceNowSession -Url 'northdakota.service-now.com' -Credential $Secret:SNowVMCred
|
||||
Connect-ITDvCenter -Credential $Secret:svcitdvmvcauto
|
||||
|
||||
$Filter = 'active=true^short_descriptionSTARTSWITHAutomated Server Build Task for Windows Machine'
|
||||
$OpenTasks = Get-ITDServiceNowRecord -ItemType 'Catalog Task' -Filter $Filter | Sort-Object Number
|
||||
If ($PSBoundParameters.ContainsKey("SCTaskNum")) {
|
||||
Write-Verbose -Message "SCTaskNum parameter found, value is $SCTaskNum"
|
||||
$OpenTasks = $OpenTasks | Where-Object Number -EQ $SCTaskNum
|
||||
}
|
||||
|
||||
Write-Verbose -Message ("OpenTasks found: " + $OpenTasks.count) -Verbose
|
||||
ForEach ($OpenTask in $OpenTasks) {
|
||||
Write-Verbose -Message $OpenTasks.Number -Verbose
|
||||
}
|
||||
|
||||
ForEach ($OpenTask in $OpenTasks) {
|
||||
$Ci = $null
|
||||
$BuildComplete = $null
|
||||
|
||||
# get SCTask, Ritm
|
||||
$SCTaskNum = $OpenTask.number
|
||||
Write-Verbose -Message "Start $SCTasknum" -Verbose
|
||||
$SCTask = Get-ITDServiceNowRecord -ItemType 'Catalog Task' -Number $SCTaskNum
|
||||
$ShortDescription = $SCTask.short_description
|
||||
#$RitmNum = $SCTask.request_item.display_value
|
||||
$Ritm = Get-ITDServiceNowRecord -ItemType 'Request Item' -SysId ($SCTask.request_item.value) -IncludeVariableSet -WarningAction SilentlyContinue
|
||||
|
||||
switch ( $Ritm.VariableSet.target_platform ) {
|
||||
'azure' { $target_platform = "Azure" }
|
||||
'vmware' { $target_platform = "VMware" }
|
||||
}
|
||||
|
||||
#$FormFQDN = ($RITM.CustomVariable | Where-Object Name -EQ "host_name").value
|
||||
$FormFQDN = ($RITM.VariableSet.host_name)
|
||||
$FormHostName = $FormFQDN.split('.')[0]
|
||||
|
||||
#$Ci = Get-ServiceNowRecord -Table cmdb_ci -Filter @('name', '-eq', $FormHostName)
|
||||
$Ci = Get-ITDServiceNowRecord -Table cmdb_ci -Filter ("name=" + $FormHostName)
|
||||
|
||||
If ($Ci) {
|
||||
Write-Verbose -Message ("Ci found, sys_id = " + $Ci.sys_id + ", name = " + $Ci.name + ", fqdn = " + $Ci.fqdn) -Verbose
|
||||
}
|
||||
Else {
|
||||
switch ($target_platform) {
|
||||
{ $_ -like "*VMware*" } {
|
||||
Connect-ITDvCenter -Credential $Secret:svcitdvmvcauto
|
||||
Write-Verbose -Message ("$FormFQDN is a VMware VM. Determine if SRM was requested.") -Verbose
|
||||
$hardware_platform = "VMware";
|
||||
$hardware_type = 'Virtual Machine'
|
||||
|
||||
If ( ($Ritm.CustomVariable | Where-Object Name -EQ 'dr_protection').Value -eq 'No DR') {
|
||||
Write-Verbose -Message ("$FormFQDN dr_protection equals 'No DR'") -Verbose
|
||||
Approve-ITDVMNewBuild -SCTaskNum $SCTaskNum -CloseTask -Verbose
|
||||
}
|
||||
Else {
|
||||
Write-Verbose -Message ("$FormFQDN dr_protection is requested") -Verbose
|
||||
Write-Warning -Message ("SRM is requested, task will not auto close. -- ZM") -Verbose
|
||||
Approve-ITDVMNewBuild -SCTaskNum $SCTaskNum
|
||||
}
|
||||
Disconnect-ITDvCenter
|
||||
}
|
||||
{ $_ -like "*Microsoft Virtual Machine*" } {
|
||||
Write-Verbose -Message ("$FormFQDN is an Azure VM. DR is not an option, proceed.") -Verbose
|
||||
$hardware_platform = "Azure";
|
||||
$hardware_type = 'Virtual Machine'
|
||||
Write-Warning -Message ("Final close task is commented out until testing can occur. -- ZM") -Verbose
|
||||
#Approve-ITDVMNewBuild -SCTaskNum $SCTaskNum
|
||||
}
|
||||
{ $_ -like "*HP*" } {
|
||||
Write-Verbose -Message ("$FormFQDN is an HPE device.") -Verbose
|
||||
$hardware_platform = 'HPE';
|
||||
$hardware_type = 'Physical'
|
||||
Write-Warning -Message ("Final close task is commented out until testing can occur. -- ZM") -Verbose
|
||||
}
|
||||
default {
|
||||
$hardware_platform = 'Other'
|
||||
Write-Warning -Message ("Ci found, but unavailable to determine hardware platform.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Disconnect-ITDvCenter
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
# if a manually triggered build needs to occur, run this
|
||||
|
||||
Update-Module ITD.Infra-VMware.VirtualMachine
|
||||
New-ITDVMwareWindowsVM -ComputerName $FQDN -CPU $CPU -MemoryGB $MemoryGB -VlanId $VlanId -OS $OS -Environment $Environment -Datacenter $Datacenter -LicensingRestrictions $LicensingRestrictions
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
# send JSON payload to AA to create csv file that gets moved to itdwinautop1.nd.gov (and will be built)
|
||||
|
||||
$RestMethodParams = @{
|
||||
Method = 'Post';
|
||||
Uri = 'https://96bdfe01-af80-4575-8f23-e7057184c8f6.webhook.cus.azure-automation.net/webhooks?token=4cWZz%2fq97AqMdlNak6qv2lUurLPFsWmPJmovLmAE%2fNg%3d';
|
||||
Headers = @{ITD = 'mXJU74ABYyDHcVY6iJihPDk8LidJ2ibBA2sA3RAwKaBHS6Gw7Rr2Zz5JZAhPm6wMuvY7X54ZzJxAXaM7ig3PHG4MKvtkBf8X7q3jGNcePgUqg9WCwCSJ3JWG7AA6M39x4vpihKeZV' };
|
||||
Body = [PSCustomObject]@{
|
||||
target_platform = "VMware"
|
||||
target_hostname = 'itdk12cladgwp1.nd.gov';
|
||||
target_cpus = 4;
|
||||
target_memory = 8;
|
||||
target_osdisk = 80;
|
||||
target_datadisk = 9; # this is now swap
|
||||
target_subnet = '10.2.82.208/29';
|
||||
target_os = 'Windows Server 2022 Datacenter';
|
||||
target_environment = 'Production';
|
||||
target_vm_app_name = 'ITD-Edutech-ClassLink';
|
||||
target_datacenter = 'Bismarck';
|
||||
target_licensingrestrictions = 'No Licensing Restrictions';
|
||||
} | ConvertTo-Json;
|
||||
}
|
||||
|
||||
Invoke-RestMethod @RestMethodParams
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
# scheduled task that finds the oldest input file, reads it, and builds a VM with the parameters found
|
||||
|
||||
$TimeStamp = Get-Date -UFormat "%Y%m%d%H%M%S"
|
||||
$TranscriptPath = "F:\AutoBuildLogs\$TimeStamp.log"
|
||||
Start-Transcript $TranscriptPath
|
||||
|
||||
$DriveLetter = 'F'
|
||||
$CsvPath = ($DriveLetter + ":\AutoBuildInputFiles\")
|
||||
$FailedPath = ($DriveLetter + ":\AutoBuildInputFiles\Failed")
|
||||
$CompletedPath = ($DriveLetter + ":\AutoBuildInputFiles\Completed")
|
||||
|
||||
$GetBuildFile = Get-ChildItem -Path $CsvPath -Filter *.csv | Sort-Object LastWriteTime | select -First 1
|
||||
Write-Warning -Message ("Found file " + $GetBuildFile.Name)
|
||||
|
||||
If ($GetBuildFile) {
|
||||
|
||||
$IaasAutoCred = Get-Secret -Name svcitdiaasauto
|
||||
#$IaasAutoCred = $PrvCred
|
||||
|
||||
Set-PowerCLIConfiguration -DefaultVIServerMode Multiple -ParticipateInCeip $false -Confirm:$false -InvalidCertificateAction Ignore
|
||||
|
||||
$InputParams = Import-Csv -Path $GetBuildFile.FullName
|
||||
|
||||
$ComputerName = $InputParams.target_hostname.ToLower()
|
||||
Send-MailMessage -From "itdwinauto@nd.gov" -To "vmware@nd.gov" -SmtpServer apprelay1.nd.gov -Body $InputParams -Subject ("AutoBuildFromFile-$ComputerName-" + $InputParams.target_platform)
|
||||
|
||||
try {
|
||||
switch ($InputParams.target_platform) {
|
||||
'azure' {
|
||||
|
||||
}
|
||||
'vmware' {
|
||||
Connect-VIServer -Server itdvmvc1.nd.gov, itdvmvc2.nd.gov -Credential $IaasAutoCred
|
||||
|
||||
New-ITDVMwareWindowsVM -ComputerName $ComputerName `
|
||||
-CPU $InputParams.target_cpus `
|
||||
-MemoryGB $InputParams.target_memory `
|
||||
-DiskOS $InputParams.target_osdisk `
|
||||
-DiskSwap $InputParams.target_datadisk `
|
||||
-Subnet $InputParams.target_subnet `
|
||||
-OS $InputParams.target_os `
|
||||
-Environment $InputParams.target_environment `
|
||||
-Datacenter $InputParams.target_datacenter `
|
||||
-AppName $InputParams.target_vm_app_name `
|
||||
-LicensingRestrictions $InputParams.target_licensingrestrictions `
|
||||
-Credential $IaasAutoCred `
|
||||
-Verbose
|
||||
|
||||
Move-Item -Path $GetBuildFile.FullName -Destination $CompletedPath
|
||||
|
||||
$postParams = [PSCustomObject]@{
|
||||
AutomationName = "Infra-VMware";
|
||||
Action = 'Provisioning';
|
||||
Units = 240;
|
||||
Platform = 'PowerShell-VMware-VMWindows';
|
||||
}
|
||||
|
||||
Invoke-RestMethod -Uri http://itdnettools.nd.gov/services/automation-tracking.py -Method POST -Body ($postParams | ConvertTo-Json)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
catch {
|
||||
$error[0]
|
||||
Write-Warning "Email vmware admins about failure"
|
||||
$Body = $error[0] | Select-Object *
|
||||
Send-MailMessage -From autobuild@nd.gov -To "vmware@nd.gov" -Subject "Failure-AutoBuildFromFile-$ComputerName" -SmtpServer apprelay.nd.gov -Body $Body
|
||||
|
||||
Write-Warning "Error detected. Moving csv input file to folder Failed"
|
||||
Move-Item -Path $GetBuildFile.FullName -Destination $FailedPath
|
||||
}
|
||||
Disconnect-VIServer -Server * -Confirm:$false -ErrorAction SilentlyContinue
|
||||
}
|
||||
Else {
|
||||
Stop-Transcript
|
||||
Get-Item -Path $TranscriptPath | Remove-Item
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
# enable upgrade at next reboot
|
||||
$ToolsConfig = New-Object VMware.Vim.VirtualMachineConfigSpec
|
||||
$ToolsConfig.tools = New-Object VMware.Vim.ToolsConfigInfo
|
||||
$ToolsConfig.Tools.ToolsUpgradePolicy = 'upgradeAtPowerCycle'
|
||||
|
||||
# single VM, enable
|
||||
$vm = Get-VM -Name itdscmt1.nd.gov
|
||||
($vm | Get-View).ReconfigVM($ToolsConfig)
|
||||
|
||||
# get all WS
|
||||
$AllVMs = Get-VM | Where-Object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" }
|
||||
$AllVMsWindows = $AllVMs | Where-Object {$_.Guest.OSFullName -like "*Windows*"}
|
||||
|
||||
$AllVMsDTAP = $AllVMsWindows | Get-TagAssignment -Category DTAP
|
||||
$AllVMsTest = $AllVMsDTAP | Where-Object {$_.Tag.Name -eq 'Test'}
|
||||
$AllVMsProd = $AllVMsDTAP | Where-Object {$_.Tag.Name -eq 'Production'}
|
||||
|
||||
$AllVMsTest | Export-Csv "D:\OneDrive - State of North Dakota\AllTestVMs.csv"
|
||||
$AllVMsProd | Export-Csv "D:\OneDrive - State of North Dakota\AllProdVMs.csv"
|
||||
|
||||
ForEach($VM in $AllVMsTest){
|
||||
($VM | Get-View).ReconfigVM($ToolsConfig)
|
||||
} #### CHECK 2008 non-R2 x3
|
||||
|
||||
# get all Windows and ToolsVersion counts
|
||||
$AllVMGuests = $AllVMs | Get-VMGuest
|
||||
$AllVMGuests | select VMName, ToolsVersion
|
||||
|
||||
# disable upgrade at next reboot
|
||||
$ToolsConfig = New-Object VMware.Vim.VirtualMachineConfigSpec
|
||||
$ToolsConfig.tools = New-Object VMware.Vim.ToolsConfigInfo
|
||||
$ToolsConfig.Tools.ToolsUpgradePolicy = 'manual'
|
||||
|
||||
$vm = Get-VM -Name itdscmt1.nd.gov
|
||||
($vm | Get-View).ReconfigVM($ToolsConfig)
|
||||
|
||||
|
||||
$AllVMs = Get-VM | Where-Object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" }
|
||||
|
||||
|
||||
|
||||
$AllVMs = Get-VM | Where-Object {$_.Name -like "*itd*" -and $_.Guest.OSFullName -notlike "*Windows*"}
|
||||
|
||||
|
||||
# report
|
||||
$AllVMsWindows | select Name,@{n='OS';e={$_.Guest.OSFullName}},@{n='ToolsVersion';e={($_ | Get-VMGuest).ToolsVersion}},@{n='ToolsPolicy';e={($_ | Get-View).config.tools.toolsupgradepolicy}} -ov ToolsReport | export-csv "D:\vmtools.csv"
|
||||
|
||||
# set prod
|
||||
ForEach($VM in $AllVMsWindows){
|
||||
Write-Warning -Message ($VM.Name)
|
||||
($VM | Get-View).ReconfigVM($ToolsConfig)
|
||||
}
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
$ComputerName = @"
|
||||
itddmrdbmssqlu1.nd.gov
|
||||
itddmrdbmssqld1.nd.gov
|
||||
itddmrdbmsu1.nd.gov
|
||||
itddmrdbmsd1.nd.gov
|
||||
"@
|
||||
|
||||
$ComputerName = ConvertTo-Array -MultiLineString $ComputerName
|
||||
|
||||
Invoke-Command -Credential $PrvCred -ComputerName $ComputerName -ScriptBlock {
|
||||
Get-Process -Name ccmexec, cohesity*, nessus*, cortex*, vmware*
|
||||
} | Sort-Object PSComputerName
|
||||
|
||||
<#
|
||||
# Add to Solarwinds
|
||||
$Func = {
|
||||
param($ComputerName)
|
||||
Import-SWDiscovery -ComputerName $ComputerName -Integration ServiceNow
|
||||
}
|
||||
ForEach ($c in $ComputerName) {
|
||||
#Invoke-Command -ComputerName itdslrwnds.nd.gov -ScriptBlock $Func -ArgumentList $c -Credential $IaaSAuto
|
||||
}
|
||||
|
||||
# Validate Solarwinds node creation
|
||||
$Func = {
|
||||
param($ComputerName)
|
||||
$test = Get-SWNode -ComputerName $ComputerName
|
||||
If ($test) { “Pass” }
|
||||
}
|
||||
ForEach ($c in $ComputerName) {
|
||||
|
||||
Invoke-Command -ComputerName itdslrwnds.nd.gov -ScriptBlock $Func -ArgumentList $c -Credential $IaaSAuto
|
||||
}
|
||||
|
||||
Invoke-Command -ComputerName itdsccmp2.nd.gov -ScriptBlock { Get-Process } -Credential $PrvCred
|
||||
#>
|
||||
|
||||
$SCTaskNums = @"
|
||||
SCTASK0173131
|
||||
SCTASK0173136
|
||||
"@
|
||||
|
||||
$SCTaskNums = ConvertTo-Array -MultiLineString $SCTaskNums
|
||||
$SCTaskNums | ForEach-Object { Approve-ITDVMNewBuild -SCTaskNum $_ }
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0"?>
|
||||
<package>
|
||||
<metadata>
|
||||
<id>ITD.Infra-VMware.VirtualMachine</id>
|
||||
<version>$VERSIONHERE$</version>
|
||||
<authors>Zack Meier</authors>
|
||||
<description>Functions for VMware Virtual Machine tasks</description>
|
||||
</metadata>
|
||||
<files>
|
||||
<file src="**" exclude="**\.git\**;**\Build\**" />
|
||||
</files>
|
||||
</package>
|
||||
+133
@@ -0,0 +1,133 @@
|
||||
#
|
||||
# Module manifest for module 'ITD.Infra-VMware.VirtualMachine'
|
||||
#
|
||||
# Generated by: zmeier
|
||||
#
|
||||
# Generated on: 5/19/2022
|
||||
#
|
||||
|
||||
@{
|
||||
|
||||
# Script module or binary module file associated with this manifest.
|
||||
RootModule = 'ITD.Infra-VMware.VirtualMachine.psm1'
|
||||
|
||||
# Version number of this module.
|
||||
ModuleVersion = '<ModuleVersion>'
|
||||
|
||||
# Supported PSEditions
|
||||
CompatiblePSEditions = 'Desktop', 'Core'
|
||||
|
||||
|
||||
# ID used to uniquely identify this module
|
||||
GUID = '0dc67c1a-d622-468c-880c-7b8001c44235'
|
||||
|
||||
# Author of this module
|
||||
Author = 'zmeier'
|
||||
|
||||
# Company or vendor of this module
|
||||
CompanyName = 'Unknown'
|
||||
|
||||
# Copyright statement for this module
|
||||
Copyright = '(c) zmeier. All rights reserved.'
|
||||
|
||||
# Description of the functionality provided by this module
|
||||
Description = 'Functions for VMware Virtual Machine tasks'
|
||||
|
||||
# Minimum version of the PowerShell engine required by this module
|
||||
# PowerShellVersion = ''
|
||||
|
||||
# Name of the PowerShell host required by this module
|
||||
# PowerShellHostName = ''
|
||||
|
||||
# Minimum version of the PowerShell host required by this module
|
||||
# PowerShellHostVersion = ''
|
||||
|
||||
# Minimum version of Microsoft .NET Framework required by this module. This prerequisite is valid for the PowerShell Desktop edition only.
|
||||
# DotNetFrameworkVersion = ''
|
||||
|
||||
# Minimum version of the common language runtime (CLR) required by this module. This prerequisite is valid for the PowerShell Desktop edition only.
|
||||
# ClrVersion = ''
|
||||
|
||||
# Processor architecture (None, X86, Amd64) required by this module
|
||||
# ProcessorArchitecture = ''
|
||||
|
||||
# Modules that must be imported into the global environment prior to importing this module
|
||||
# RequiredModules = @()
|
||||
|
||||
# Assemblies that must be loaded prior to importing this module
|
||||
# RequiredAssemblies = @()
|
||||
|
||||
# Script files (.ps1) that are run in the caller's environment prior to importing this module.
|
||||
# ScriptsToProcess = @()
|
||||
|
||||
# Type files (.ps1xml) to be loaded when importing this module
|
||||
# TypesToProcess = @()
|
||||
|
||||
# Format files (.ps1xml) to be loaded when importing this module
|
||||
# FormatsToProcess = @()
|
||||
|
||||
# Modules to import as nested modules of the module specified in RootModule/ModuleToProcess
|
||||
# NestedModules = @()
|
||||
|
||||
# Functions to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no functions to export.
|
||||
FunctionsToExport = @(<FunctionsToExport>)
|
||||
|
||||
# Cmdlets to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no cmdlets to export.
|
||||
CmdletsToExport = @()
|
||||
|
||||
# Variables to export from this module
|
||||
VariablesToExport = '*'
|
||||
|
||||
# Aliases to export from this module, for best performance, do not use wildcards and do not delete the entry, use an empty array if there are no aliases to export.
|
||||
AliasesToExport = @()
|
||||
|
||||
# DSC resources to export from this module
|
||||
# DscResourcesToExport = @()
|
||||
|
||||
# List of all modules packaged with this module
|
||||
# ModuleList = @()
|
||||
|
||||
# List of all files packaged with this module
|
||||
# FileList = @()
|
||||
|
||||
# Private data to pass to the module specified in RootModule/ModuleToProcess. This may also contain a PSData hashtable with additional module metadata used by PowerShell.
|
||||
PrivateData = @{
|
||||
|
||||
PSData = @{
|
||||
|
||||
# Tags applied to this module. These help with module discovery in online galleries.
|
||||
# Tags = @()
|
||||
|
||||
# A URL to the license for this module.
|
||||
# LicenseUri = ''
|
||||
|
||||
# A URL to the main website for this project.
|
||||
# ProjectUri = ''
|
||||
|
||||
# A URL to an icon representing this module.
|
||||
# IconUri = ''
|
||||
|
||||
# ReleaseNotes of this module
|
||||
# ReleaseNotes = ''
|
||||
|
||||
# Prerelease string of this module
|
||||
# Prerelease = ''
|
||||
|
||||
# Flag to indicate whether the module requires explicit user acceptance for install/update/save
|
||||
# RequireLicenseAcceptance = $false
|
||||
|
||||
# External dependent modules of this module
|
||||
ExternalModuleDependencies = @("ITD.Infra-Passwordstate","ITD.Infra-Networking-Infoblox")
|
||||
|
||||
} # End of PSData hashtable
|
||||
|
||||
} # End of PrivateData hashtable
|
||||
|
||||
# HelpInfo URI of this module
|
||||
# HelpInfoURI = ''
|
||||
|
||||
# Default prefix for commands exported from this module. Override the default prefix using Import-Module -Prefix.
|
||||
# DefaultCommandPrefix = ''
|
||||
|
||||
}
|
||||
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
#Get public and private function definition files.
|
||||
$Public = @( Get-ChildItem -Path $PSScriptRoot\Public\*.ps1 -ErrorAction SilentlyContinue )
|
||||
$Private = @( Get-ChildItem -Path $PSScriptRoot\Private\*.ps1 -ErrorAction SilentlyContinue )
|
||||
|
||||
#Dot source the files
|
||||
Foreach($import in @($Public + $Private))
|
||||
{
|
||||
Try
|
||||
{
|
||||
. $import.fullname
|
||||
}
|
||||
Catch
|
||||
{
|
||||
Write-Error -Message "Failed to import function $($import.fullname): $_"
|
||||
}
|
||||
}
|
||||
|
||||
# Here I might...
|
||||
# Read in or create an initial config file and variable
|
||||
# Export Public functions ($Public.BaseName) for WIP modules
|
||||
# Set variables visible to the module and its functions only
|
||||
|
||||
Export-ModuleMember -Function $Public.Basename
|
||||
@@ -0,0 +1,140 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Approve-ITDVMNewBuild {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(Mandatory = $True)]
|
||||
[string]
|
||||
$SCTaskNum,
|
||||
|
||||
[switch]
|
||||
$CloseTask,
|
||||
|
||||
[switch]
|
||||
$NoTaskUpdates
|
||||
)
|
||||
|
||||
begin {
|
||||
|
||||
}
|
||||
|
||||
process {
|
||||
# get current user, SCTask, Ritm
|
||||
$assignTo = Get-ServiceNowRecord -Table 'User' -Filter @('email', '-eq', ($env:username + "@nd.gov"))
|
||||
|
||||
$SCTask = Get-ServiceNowRecord -Table 'Catalog Task' -ID $SCTaskNum
|
||||
$RitmNum = $SCTask.request_item.display_value
|
||||
|
||||
$Ritm = Get-ServiceNowRecord -Table 'Requested Item' -ID $RitmNum -IncludeCustomVariable
|
||||
|
||||
$ComputerName = ($Ritm.CustomVariable | Where-Object Name -EQ host_name).Value
|
||||
$OperatingSystem = ($Ritm.CustomVariable | Where-Object Name -EQ operating_system).Value
|
||||
switch (($Ritm.CustomVariable | Where-Object Name -EQ target_platform).Value) {
|
||||
'azure' { $target_platform = "Azure" }
|
||||
'vmware' { $target_platform = "VMware" }
|
||||
}
|
||||
|
||||
# update short description
|
||||
If ($NoTaskUpdates -eq $false) {
|
||||
$shortdescription = "$target_platform $OperatingSystem VM Build for $ComputerName"
|
||||
If ( ($RITM.CustomVariable | Where-Object Name -EQ dr_protection).Value -ne 'No DR') {
|
||||
$shortdescription += ", with SRM protection"
|
||||
}
|
||||
Update-ServiceNowRecord -ID $SCTask.number -Values @{short_description = $shortdescription; assigned_to = $assignTo.name }
|
||||
}
|
||||
|
||||
# search for VM
|
||||
switch (($Ritm.CustomVariable | Where-Object Name -EQ "target_platform").Value) {
|
||||
'azure' {
|
||||
# update task close notes, task customer notes, and ritm customer notes
|
||||
$CommentsToAdd = "Azure VM " + $ComputerName + " build completed. `n" + $CommentsForWorkNotes
|
||||
}
|
||||
'vmware' {
|
||||
$VM = Get-VM -Name $ComputerName | Where-Object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" }
|
||||
switch (@($VM).count) {
|
||||
{ 0 -or $null } {
|
||||
# no matches
|
||||
Write-Error -Message "Zero VM matches found, ending script" -ErrorAction Stop
|
||||
}
|
||||
{ $_ -ne 1 } {
|
||||
# more than one match
|
||||
Write-Error -Message " VM matches found, ending script" -ErrorAction Stop
|
||||
}
|
||||
{ 1 } {
|
||||
# add missing tags
|
||||
switch (($Ritm.CustomVariable | Where-Object Name -EQ environment).Value){
|
||||
'Development' {
|
||||
$DtapString = 'Test'
|
||||
}
|
||||
'Test' {
|
||||
$DtapString = 'Test'
|
||||
}
|
||||
'Production' {
|
||||
$DtapString = 'Production'
|
||||
}
|
||||
}
|
||||
|
||||
$SetITDVMwareTagsParams = @{
|
||||
ComputerName = $ComputerName;
|
||||
#AppName = ($Ritm.CustomVariable | Where-Object Name -EQ application_name).Value;
|
||||
Dtap = $DtapString;
|
||||
#OperatingSystem = switch ( ($Ritm.CustomVariable | Where-Object Name -EQ target_os_version_windows).Value) {
|
||||
# 'Windows Server 2019 Datacenter' { "Windows Server 2019 Standard (64-Bit)" }
|
||||
# 'Windows Server 2022 Datacenter' { "Windows Server 2022 Standard (64-Bit)" }
|
||||
#}
|
||||
StartupPriority = ($Ritm.CustomVariable | Where-Object Name -EQ startup_priority).Value;
|
||||
LicensingRestrictions = ($Ritm.CustomVariable | Where-Object Name -EQ licensing_restrictions).Value;
|
||||
}
|
||||
Set-ITDVMwareVMTag @SetITDVMwareTagsParams
|
||||
|
||||
$AppNameTag = Get-TagAssignment -Entity $VM -Category AppName -ErrorAction SilentlyContinue
|
||||
If ($AppNameTag) {
|
||||
# move VM to VM folder that matches AppName tag
|
||||
Write-Verbose -Message ("AppName tag " + $AppNameTag.Tag.Name + " found, attempting to move to AppName folder")
|
||||
Move-ITDVMwareVMToAppNameFolder -Name $ComputerName
|
||||
$CommentsForWorkNotes += "VM $ComputerName moved to AppName folder. "
|
||||
}
|
||||
Else {
|
||||
Write-Warning "Review AppName tag for $ComputerName, required for backups"
|
||||
}
|
||||
|
||||
If (($Ritm.CustomVariable | Where-Object Name -EQ "dr_protection").value -ne 'No DR') {
|
||||
Write-Warning "SCTask is not Closed. Review SRM Protection values manually"
|
||||
$AutoCloseTask = $false
|
||||
}
|
||||
Else {
|
||||
$AutoCloseTask = $true
|
||||
}
|
||||
|
||||
# update task close notes, task customer notes, and ritm customer notes
|
||||
$CommentsToAdd = "VMware VM " + $ComputerName + " build completed. " + $CommentsForWorkNotes
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
If ($NoTaskUpdates -eq $false) {
|
||||
Update-ServiceNowRecord -ID $SCTask.number -Values @{work_notes = $CommentsToAdd; close_notes = $CommentsToAdd; } # enter comments into sctask
|
||||
Update-ServiceNowRecord -ID $RitmNum -Values @{comments = $CommentsToAdd }
|
||||
|
||||
If ($CloseTask -eq $True -or $AutoCloseTask -eq $True) {
|
||||
Update-ServiceNowRecord -ID $SCTask.number -Values @{state = "Closed Complete" }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end {
|
||||
}
|
||||
}
|
||||
+137
@@ -0,0 +1,137 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Compare-ITDVMwareVMTagFromCmdb {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(
|
||||
Mandatory = $true,
|
||||
ValueFromPipeline = $true,
|
||||
ParameterSetName = 'VMName'
|
||||
)]
|
||||
[string[]]
|
||||
$VMName
|
||||
)
|
||||
|
||||
begin {
|
||||
#$Result = [System.Collections.ArrayList]@()
|
||||
}
|
||||
|
||||
process {
|
||||
ForEach ($vname in $VMName) {
|
||||
$HostName = $vname.split('.')[0]
|
||||
Write-Verbose -Message "Looking up Cmdb Object named $HostName"
|
||||
$Cmdb = Get-ITDServiceNowRecord -Table cmdb_ci_server -Filter "name=$HostName"
|
||||
|
||||
If ($null -eq $Cmdb) {
|
||||
Write-Warning -Message "No Cmdb Object found for $HostName"
|
||||
Continue
|
||||
}
|
||||
|
||||
$VM = Get-VM -Name $vname | Where-Object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" }
|
||||
$OldTags = Get-TagAssignment -Entity $VM
|
||||
|
||||
$VMCompare = [PSCustomObject]@{
|
||||
VMName = $vname;
|
||||
DTAP = $null;
|
||||
AppName = $null;
|
||||
LicensingRestrictions = $null;
|
||||
DRProtection = $null;
|
||||
SRMRecoveryType = $null;
|
||||
}
|
||||
# DTAP
|
||||
#If ($Cmdb.environment.display_value) {
|
||||
$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'DTAP' }).Tag.Name
|
||||
If ($Cmdb.environment.display_value -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $vname DTAP Tag to " + $Cmdb.environment.display_value)
|
||||
#Set-ITDVMwareVMTag -ComputerName $vname -Dtap $Cmdb.environment.display_value
|
||||
$VMCompare.DTAP = $false
|
||||
}
|
||||
Else {
|
||||
$VMCompare.DTAP = $true
|
||||
}
|
||||
#}
|
||||
|
||||
# AppName
|
||||
#If ($Cmdb.u_nd_application_svc.display_value) {
|
||||
$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'AppName' }).Tag.Name
|
||||
If ($Cmdb.u_nd_application_svc.display_value -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $vname AppName Tag to " + $Cmdb.u_nd_application_svc.display_value)
|
||||
#Set-ITDVMwareVMTag -ComputerName $vname -AppName $Cmdb.u_nd_application_svc.display_value
|
||||
$VMCompare.AppName = $false
|
||||
}
|
||||
Else {
|
||||
$VMCompare.AppName = $true
|
||||
}
|
||||
#}
|
||||
|
||||
# Licensing Restrictions
|
||||
#If ($Cmdb.u_nd_licensing_restrictions.display_value) {
|
||||
$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'LicensingRestrictions' }).Tag.Name
|
||||
If ($Cmdb.u_nd_licensing_restrictions.display_value -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $vname Licensing Restrictions Tag to " + $Cmdb.u_nd_licensing_restrictions.display_value)
|
||||
#Set-ITDVMwareVMTag -ComputerName $vname -LicensingRestrictions $Cmdb.u_nd_licensing_restrictions.display_value
|
||||
$VMCompare.LicensingRestrictions = $false
|
||||
}
|
||||
Else {
|
||||
$VMCompare.LicensingRestrictions = $true
|
||||
}
|
||||
#}
|
||||
|
||||
# startup priority TBD
|
||||
# startup priority is not in Cmdb
|
||||
|
||||
# SRM Recovery Type
|
||||
#If ($Cmdb.u_srm_recovery_type.display_value) {
|
||||
$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'SRM Recovery Type' }).Tag.Name
|
||||
If ($Cmdb.u_srm_recovery_type.display_value -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $vname SRM Recovery Type Tag to " + $Cmdb.u_srm_recovery_type.display_value)
|
||||
#Set-ITDVMwareVMTag -ComputerName $vname -SRMRecoveryType $Cmdb.u_srm_recovery_type.display_value
|
||||
$VMCompare.SRMRecoveryType = $false
|
||||
}
|
||||
Else {
|
||||
$VMCompare.SRMRecoveryType = $true
|
||||
}
|
||||
#} Else {
|
||||
#$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'SRM Recovery Type' }).Tag.Name
|
||||
#If ($null -ne $TagAssignmentValue) {
|
||||
#Write-Verbose -Message ("Setting $vname SRM Recovery Type Tag to " + $null)
|
||||
#$VMCompare.SRMRecoveryType = $false
|
||||
#}
|
||||
#Else {
|
||||
#$VMCompare.SRMRecoveryType = $true
|
||||
#}
|
||||
#}
|
||||
#
|
||||
# DR Protection
|
||||
#If ( ($Cmdb.u_nd_dr_protection.display_value -replace "VMware: " -replace "RPO", "VR RPO") ) {
|
||||
#-replace "VMware: " -replace "RPO", "VR RPO"
|
||||
$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'DR Protection' }).Tag.Name
|
||||
If ( ($Cmdb.u_nd_dr_protection.display_value -replace "VMware: " -replace "RPO", "VR RPO") -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $vname DR Protection Tag to " + ($Cmdb.u_nd_dr_protection.display_value -replace "VMware: ") )
|
||||
#Set-ITDVMwareVMTag -ComputerName $vname -DRProtection ($Cmdb.u_nd_dr_protection.display_value -replace "VMware: " -replace "RPO", "VR RPO")
|
||||
$VMCompare.DRProtection = $false
|
||||
}
|
||||
Else {
|
||||
$VMCompare.DRProtection = $true
|
||||
}
|
||||
#}
|
||||
Write-Output $VMCompare
|
||||
}
|
||||
}
|
||||
|
||||
end {
|
||||
|
||||
}
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Get-ITDVMwareVMAppNameTag {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
|
||||
)
|
||||
|
||||
begin {
|
||||
$ViServer = $global:defaultviservers | sort-object Name | select -first 1
|
||||
}
|
||||
|
||||
process {
|
||||
$AppNameTags = Get-Tag -Category AppName -Server $ViServer.Name
|
||||
}
|
||||
|
||||
end {
|
||||
$AppNameTags
|
||||
}
|
||||
}
|
||||
+63
@@ -0,0 +1,63 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Get-ITDVMwareVMHardening {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[string]
|
||||
$Name
|
||||
)
|
||||
Begin {
|
||||
|
||||
}
|
||||
Process {
|
||||
$SettingName = @(
|
||||
"tools.setInfo.sizeLimit",
|
||||
"isolation.device.edit.disable",
|
||||
"isolation.device.connectable.disable",
|
||||
"isolation.tools.copy.disable",
|
||||
"isolation.tools.dnd.disable",
|
||||
"isolation.tools.setGUIOptions.enable",
|
||||
"isolation.tools.paste.disable",
|
||||
"isolation.tools.diskShrink.disable",
|
||||
"isolation.tools.diskWiper.disable",
|
||||
"log.keepOld",
|
||||
"log.rotateSize"
|
||||
)
|
||||
$Result = [System.Collections.ArrayList]@()
|
||||
ForEach ($n in $Name) {
|
||||
$VM = Get-VM -Name $n | Where-Object { $_.ExtensionData.Summary.Config.ManagedBy.Type -ne "placeholderVm" }
|
||||
$GetAdvSetting = Get-AdvancedSetting -Entity $VM -Name $SettingName | select Entity, Name, Value
|
||||
$obj = [PSCustomObject]@{
|
||||
'Entity' = $VM.Name
|
||||
'Uid' = $VM.Uid.split('@')[1].split(':')[0]
|
||||
"tools.setInfo.sizeLimit" = ($GetAdvSetting | Where-Object Name -EQ 'tools.setInfo.sizeLimit').Value
|
||||
"isolation.device.edit.disable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.device.edit.disable').Value
|
||||
"isolation.device.connectable.disable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.device.connectable.disable').Value
|
||||
"isolation.tools.copy.disable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.tools.copy.disable').Value
|
||||
"isolation.tools.dnd.disable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.tools.dnd.disable').Value
|
||||
"isolation.tools.setGUIOptions.enable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.tools.setGUIOptions.enable').Value
|
||||
"isolation.tools.paste.disable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.tools.paste.disable').Value
|
||||
"isolation.tools.diskShrink.disable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.tools.diskShrink.disable').Value
|
||||
"isolation.tools.diskWiper.disable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.tools.diskWiper.disable').Value
|
||||
"log.keepOld" = ($GetAdvSetting | Where-Object Name -EQ 'log.keepOld').Value
|
||||
"log.rotateSize" = ($GetAdvSetting | Where-Object Name -EQ 'log.rotateSize').Value
|
||||
}
|
||||
$Result.Add($obj)
|
||||
}
|
||||
}
|
||||
End {
|
||||
Write-Output $Result
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<#
|
||||
.Synopsis
|
||||
Retreives list of all VMs, and lists their corresponding vSphere Replication RPO settings, if applicable.
|
||||
.DESCRIPTION
|
||||
Long description
|
||||
.EXAMPLE
|
||||
Get-ITDVMwareRPO
|
||||
#>
|
||||
function Get-ITDVMwareVMRPO {
|
||||
[CmdletBinding()]
|
||||
Param
|
||||
(
|
||||
)
|
||||
|
||||
Begin {
|
||||
|
||||
}
|
||||
Process {
|
||||
$VMs = Get-VM -Name itddohslimsp2.nd.gov | Where-Object PowerState -EQ PoweredOn
|
||||
$result = @()
|
||||
ForEach ($VM in $VMs) {
|
||||
Write-Verbose $VM.Name
|
||||
$RPOMinutes = ($VM.ExtensionData.Config.extraconfig | Where-Object key -EQ hbr_filter.rpo).Value
|
||||
$DatastoreTag = ($VM | Get-TagAssignment -Category "VR Datastores").Tag.Name
|
||||
$Cluster = ($VM | Get-Cluster).Name
|
||||
|
||||
$obj = [PSCustomObject]@{
|
||||
'Name' = $VM.Name;
|
||||
'Cluster' = $Cluster;
|
||||
'Datastore' = $DatastoreTag;
|
||||
'RPO' = $RPOMinutes;
|
||||
}
|
||||
Write-Warning $obj
|
||||
$result += $obj
|
||||
}
|
||||
}
|
||||
End {
|
||||
Write-Output $result
|
||||
}
|
||||
}
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Get-ITDVMwareVMTagReport {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(
|
||||
ValueFromPipeline = $true,
|
||||
ParameterSetName = 'VMName'
|
||||
)]
|
||||
[string]
|
||||
$VMName
|
||||
)
|
||||
|
||||
begin {
|
||||
#$Result = [System.Collections.ArrayList]@()
|
||||
}
|
||||
|
||||
process {
|
||||
If ($PSBoundParameters.ContainsKey('VMName')) {
|
||||
# do nothing
|
||||
}
|
||||
Else {
|
||||
$VMName = Get-VM | Where-Object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" }
|
||||
}
|
||||
|
||||
ForEach ($vn in $VMName) {
|
||||
$HostName = $vn.split('.')[0]
|
||||
Write-Verbose -Message "Looking up Cmdb Object named $HostName"
|
||||
$Cmdb = Get-ITDServiceNowRecord -Table cmdb_ci_server -Filter "name=$HostName"
|
||||
$VM = Get-VM -Name $vn | Where-Object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" }
|
||||
$OldTags = Get-TagAssignment -Entity $VM
|
||||
|
||||
$obj = [PSCustomObject]@{
|
||||
VMName = $vn;
|
||||
DTAP = $null;
|
||||
AppName = $null;
|
||||
LicensingRestrictions = $null;
|
||||
DRProtection = $null;
|
||||
SRMRecoveryType = $null;
|
||||
}
|
||||
# DTAP
|
||||
If ($Cmdb.environment.display_value) {
|
||||
$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'DTAP' }).Tag.Name
|
||||
If ($Cmdb.environment.display_value -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $vn DTAP Tag to " + $Cmdb.environment.display_value)
|
||||
$obj.DTAP = $false
|
||||
}
|
||||
Else {
|
||||
$obj.DTAP = $true
|
||||
}
|
||||
}
|
||||
|
||||
# AppName
|
||||
If ($Cmdb.u_nd_application_svc.display_value) {
|
||||
$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'AppName' }).Tag.Name
|
||||
If ($Cmdb.u_nd_application_svc.display_value -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $vn AppName Tag to " + $Cmdb.u_nd_application_svc.display_value)
|
||||
$obj.AppName = $false
|
||||
}
|
||||
Else {
|
||||
$obj.AppName = $true
|
||||
}
|
||||
}
|
||||
|
||||
# Licensing Restrictions
|
||||
If ($Cmdb.u_nd_licensing_restrictions.display_value) {
|
||||
$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'LicensingRestrictions' }).Tag.Name
|
||||
If ($Cmdb.u_nd_licensing_restrictions.display_value -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $vn Licensing Restrictions Tag to " + $Cmdb.u_nd_licensing_restrictions.display_value)
|
||||
$obj.LicensingRestrictions = $false
|
||||
}
|
||||
Else {
|
||||
$obj.LicensingRestrictions = $true
|
||||
}
|
||||
}
|
||||
|
||||
# startup priority TBD
|
||||
# startup priority is not in Cmdb
|
||||
|
||||
# SRM Recovery Type
|
||||
If ($Cmdb.u_srm_recovery_type.display_value) {
|
||||
$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'SRM Recovery Type' }).Tag.Name
|
||||
If ($Cmdb.u_srm_recovery_type.display_value -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $vn SRM Recovery Type Tag to " + $Cmdb.u_srm_recovery_type.display_value)
|
||||
$obj.SRMRecoveryType = $false
|
||||
}
|
||||
Else {
|
||||
$obj.SRMRecoveryType = $true
|
||||
}
|
||||
}
|
||||
#
|
||||
# DR Protection
|
||||
If ( ($Cmdb.u_nd_dr_protection.display_value -replace "VMware: " -replace "RPO", "VR RPO") ) {
|
||||
#-replace "VMware: " -replace "RPO", "VR RPO"
|
||||
$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'DR Protection' }).Tag.Name
|
||||
If ( ($Cmdb.u_nd_dr_protection.display_value -replace "VMware: " -replace "RPO", "VR RPO") -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $vn DR Protection Tag to " + ($Cmdb.u_nd_dr_protection.display_value -replace "VMware: ") )
|
||||
$obj.DRProtection = $false
|
||||
}
|
||||
Else {
|
||||
$obj.DRProtection = $true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end {
|
||||
Write-Output $obj
|
||||
}
|
||||
}
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Get-ITDVMwareVMToolsReport {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[string[]]
|
||||
$VMName,
|
||||
|
||||
[ValidateSet("Windows", "RHEL", "Other")]
|
||||
[string]
|
||||
$GuestOS
|
||||
)
|
||||
|
||||
begin {
|
||||
|
||||
}
|
||||
|
||||
process {
|
||||
If ($PSBoundParameters.ContainsKey('VMName')) {
|
||||
$AllVMs = Get-VM -Name $VMName | Where-Object { $_.ExtensionData.Summary.Config.ManagedBy.Type -ne "placeholderVm" -and $_.Name -notlike "vCLS*" }
|
||||
}
|
||||
else {
|
||||
$AllVMs = Get-VM | Where-Object { $_.ExtensionData.Summary.Config.ManagedBy.Type -ne "placeholderVm" -and $_.Name -notlike "vCLS*" }
|
||||
}
|
||||
|
||||
If ($PSBoundParameters.ContainsKey('GuestOS') ) {
|
||||
switch ($GuestOS) {
|
||||
"Windows" {
|
||||
$AllVMs = $AllVMs | Where-Object { $_.ExtensionData.Guest.GuestId -like "*windows*" }
|
||||
}
|
||||
"RHEL" {
|
||||
$AllVMs = $AllVMs | Where-Object { $_.ExtensionData.Guest.GuestId -like "*rhel*" }
|
||||
}
|
||||
"Other" {
|
||||
$AllVMs = $AllVMs | Where-Object { $_.ExtensionData.Guest.GuestId -notlike "*rhel*" -and $_.ExtensionData.Guest.GuestId -notlike "*windows*" }
|
||||
}
|
||||
Default {
|
||||
Write-Error "Invalid GuestOS specified. Use 'Windows' or 'RHEL'."
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ForEach ($VM in $AllVMs) {
|
||||
$obj = [PSCustomObject]@{
|
||||
Name = $VM.Name;
|
||||
PowerState = $VM.PowerState;
|
||||
GuestOS = $VM.ExtensionData.Guest.GuestId;
|
||||
ToolsVersion = $VM.ExtensionData.Config.Tools.ToolsVersion;
|
||||
ToolsUpgradePolicy = $VM.ExtensionData.Config.Tools.ToolsUpgradePolicy
|
||||
}
|
||||
Write-Output $obj
|
||||
}
|
||||
}
|
||||
|
||||
end {
|
||||
|
||||
}
|
||||
}
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Move Virtual Machines to the correct folder based on the AppName tag
|
||||
.DESCRIPTION
|
||||
Move Virtual Machines to the correct folder based on the AppName tag
|
||||
.NOTES
|
||||
|
||||
.LINK
|
||||
|
||||
.EXAMPLE
|
||||
Move-ITDVMwareVMToAppNameFolder -VMName itdservername.nd.gov
|
||||
#>
|
||||
|
||||
function Move-ITDVMwareVMToAppNameFolder {
|
||||
[CmdletBinding()]
|
||||
param
|
||||
(
|
||||
[Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
|
||||
[string[]]
|
||||
$VMName
|
||||
)
|
||||
|
||||
begin {
|
||||
}
|
||||
|
||||
process {
|
||||
Write-Verbose -Message "Gathering Virtual Machine information"
|
||||
$VMs = Get-VM -Name $VMName | Select-Object Name, PowerState, Folder, @{n = 'VIServer'; e = { $_.Uid.split('@')[1].split(':')[0] } }, @{n = 'AppName'; e = { (Get-TagAssignment -Category AppName -Entity $_).Tag.Name } }, @{n = 'Datacenter'; e = { ($_ | Get-Datacenter).Name } } | Sort-Object Name
|
||||
|
||||
ForEach ($VM in $VMs) {
|
||||
Write-Verbose -Message ("Start " + $VM.Name)
|
||||
|
||||
$NewFolder = $null
|
||||
$Owner = $VM.AppName.split('-')[0]
|
||||
|
||||
Write-Verbose ($VM.Name + ": current folder is " + $VM.Folder.Name)
|
||||
Write-Verbose ($VM.Name + ": current appname is " + $VM.AppName)
|
||||
|
||||
If ($VM.Folder.Name -ne $VM.AppName) {
|
||||
If ($VM.AppName) {
|
||||
Write-Verbose ($VM.Name + ": Folder and AppName are different!!! moving VM to folder " + $VM.AppName)
|
||||
If (!(Get-Datacenter $VM.Datacenter | Get-Folder -Name $VM.AppName -Server $VM.VIServer -ErrorAction SilentlyContinue)) {
|
||||
New-Folder -Name $VM.AppName -Location (Get-Datacenter $VM.Datacenter | Get-Folder -Type VM -Name $Owner -Server $VM.VIServer)
|
||||
}
|
||||
|
||||
$NewFolder = Get-Datacenter $VM.Datacenter | Get-Folder $VM.AppName -Server $VM.VIServer
|
||||
Move-VM -VM $VM.Name -InventoryLocation $NewFolder -Destination (Get-VM $VM.Name -Server $VM.VIServer).VMHost
|
||||
}
|
||||
Else {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
end {
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,282 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
$NewITDVMSNowRitmParams = @{
|
||||
RequestType = "New";
|
||||
ComputerName = "itdzmtest100.nd.gov";
|
||||
SysadminEmail = "zmeier@nd.gov";
|
||||
CustomerRitm = "RITM0145886";
|
||||
Environment = "Test";
|
||||
AppName = "Infra-VMware";
|
||||
Comments = "New VM for VMware sandbox, see RITM0145886 for details";
|
||||
OperatingSystem = "Windows";
|
||||
TargetOSVersion = "Windows Server 2022 Datacenter";
|
||||
TargetPlatform = "VMware";
|
||||
NumCpu = 1;
|
||||
MemoryGB = 4;
|
||||
Disk1GB = 50;
|
||||
Disk2GB = 5;
|
||||
CIDR = '10.11.12.0/23';
|
||||
Datacenter = 'Bismarck';
|
||||
LicensingRestrictions = 'No Licensing Restrictions';
|
||||
AgencyPrefix = 'ITD';
|
||||
SupportHours = 'All Day Every Day';
|
||||
DRProtection = 'No DR';
|
||||
StartupPriority = 5;
|
||||
}
|
||||
New-ITDVMSNowRitm @NewITDVMSNowRitmParams
|
||||
.EXAMPLE
|
||||
New-ITDVMSNowRitm -ImportCsv "C:\temp\NewITDVMSnowRitm.csv"
|
||||
#>
|
||||
|
||||
function New-ITDVMSNowRitm {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(ParameterSetName = 'Csv')]
|
||||
[string]
|
||||
$ImportCsv,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single', Mandatory = $true)]
|
||||
[ValidateSet('New', 'Upgrade/Code Deployment', 'Removal', 'Other')]
|
||||
[string]
|
||||
$RequestType,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single', Mandatory = $true)]
|
||||
[string]
|
||||
$ComputerName,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single', Mandatory = $true)]
|
||||
[string]
|
||||
$SysadminEmail,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single', Mandatory = $true)]
|
||||
[string]
|
||||
$Comments,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single', Mandatory = $true)]
|
||||
[ValidateSet('Production', 'Test')]
|
||||
[string]
|
||||
$Environment,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single', Mandatory = $true)]
|
||||
[string]
|
||||
$AppName,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single')]
|
||||
[ValidateSet('Linux', 'Windows')]
|
||||
[string]
|
||||
$OperatingSystem,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single')]
|
||||
[ValidateSet(
|
||||
'Windows Server 2019 Datacenter',
|
||||
'Windows Server 2022 Datacenter'
|
||||
)]
|
||||
[string]
|
||||
$TargetOSVersion,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single')]
|
||||
[ValidateSet('VMware', 'Azure')]
|
||||
$TargetPlatform,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single')]
|
||||
[int]
|
||||
$NumCpu,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single')]
|
||||
[int]
|
||||
$MemoryGB,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single')]
|
||||
[int]
|
||||
$Disk1GB,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single')]
|
||||
[int]
|
||||
$Disk2GB,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single')]
|
||||
[string]
|
||||
$CIDR,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single')]
|
||||
[ValidateSet('Bismarck', 'Mandan')]
|
||||
[string]
|
||||
$Datacenter,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single')]
|
||||
[ValidateSet(
|
||||
'No Licensing Restrictions',
|
||||
'Microsoft SharePoint Server',
|
||||
'Microsoft SharePoint Server (Academic)',
|
||||
'Microsoft SQL Developer',
|
||||
'Microsoft SQL MSDN',
|
||||
'Microsoft SQL Standard',
|
||||
'Microsoft SQL Standard (Academic)',
|
||||
'Microsoft SQL Standard (Vendor Provided)',
|
||||
'Microsoft SQL Enterprise',
|
||||
'Microsoft SQL Enterprise (Academic)',
|
||||
'IBM Websphere',
|
||||
'IBM ODM',
|
||||
'Oracle Standard Edition',
|
||||
'Oracle Standard Edition One',
|
||||
'Powerschool'
|
||||
)]
|
||||
[string]
|
||||
$LicensingRestrictions,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single')]
|
||||
[ValidateSet('ITD', 'DHS', 'DOT')]
|
||||
[string]
|
||||
$AgencyPrefix,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single')]
|
||||
[ValidateSet('All Day Every Day', 'All Week 500 to 2300', 'Weekdays 700 1800')]
|
||||
[string]
|
||||
$SupportHours,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single')]
|
||||
[ValidateSet(
|
||||
'No DR',
|
||||
'VMWare: ABR',
|
||||
'VMWARE: RPO 0:15',
|
||||
'VMWARE: RPO 0:30',
|
||||
'VMWARE: RPO 1:00',
|
||||
'VMWARE: RPO 2:00',
|
||||
'VMWARE: RPO 4:00',
|
||||
'VMWARE: RPO 8:00')]
|
||||
[string]
|
||||
$DRProtection,
|
||||
|
||||
[Parameter(ParameterSetName = 'Single')]
|
||||
[ValidateRange(1, 5)]
|
||||
[int]
|
||||
$StartupPriority
|
||||
)
|
||||
|
||||
begin {
|
||||
|
||||
}
|
||||
|
||||
process {
|
||||
switch ($PSCmdlet.ParameterSetName) {
|
||||
'Csv' {
|
||||
$Csv = Import-Csv $ImportCsv
|
||||
ForEach ($item in $csv) {
|
||||
$NewITDVMSNowRitmParams = @{
|
||||
RequestType = $item.RequestType
|
||||
ComputerName = $item.ComputerName
|
||||
SysadminEmail = $item.SysadminEmail
|
||||
Environment = $item.Environment
|
||||
AppName = $item.AppName
|
||||
Comments = $item.Comments
|
||||
OperatingSystem = $item.OperatingSystem
|
||||
TargetOSVersion = $item.TargetOSVersion
|
||||
TargetPlatform = $item.TargetPlatform
|
||||
NumCpu = $item.NumCpu
|
||||
MemoryGB = $item.MemoryGB
|
||||
Disk1GB = $item.Disk1GB
|
||||
Disk2GB = $item.Disk2GB
|
||||
CIDR = $item.CIDR
|
||||
Datacenter = $item.Datacenter
|
||||
LicensingRestrictions = $item.LicensingRestrictions
|
||||
AgencyPrefix = $item.AgencyPrefix
|
||||
SupportHours = $item.SupportHours
|
||||
DRProtection = $item.DRProtection
|
||||
StartupPriority = $item.StartupPriority
|
||||
}
|
||||
New-ITDVMSNowRitm @NewITDVMSNowRitmParams
|
||||
}
|
||||
}
|
||||
'Single' {
|
||||
Write-Verbose -Message ("Start " + $ComputerName)
|
||||
# determine lookup fields
|
||||
|
||||
switch ($PSBoundParameters.Keys) {
|
||||
CIDR {
|
||||
$cidr_block = Get-ITDServiceNowRecord -Table 'cmdb_ci_ip_network' -Filter "name=$CIDR"
|
||||
If ($null -eq $cidr_block) { Write-Error -Message "CIDR is invalid" -ErrorAction Stop }
|
||||
}
|
||||
AgencyPrefix {
|
||||
switch ($AgencyPrefix) {
|
||||
'DHS' { $AgencyNum = '325.0' }
|
||||
'DOT' { $AgencyNum = '801.0' }
|
||||
'ITD' { $AgencyNum = '112.0' }
|
||||
}
|
||||
$Agency = Get-ITDServiceNowRecord -Table 'cmn_department' -Filter "id=$AgencyNum"
|
||||
}
|
||||
AppName {
|
||||
$application_info = Get-ITDServiceNowRecord -Table cmdb_ci_service -Filter ("name=$AppName")
|
||||
}
|
||||
# send ints as strings
|
||||
NumCpu {
|
||||
[string]$NumCpuStr = $NumCpu.ToString()
|
||||
}
|
||||
MemoryGB {
|
||||
[string]$MemoryGBStr = $MemoryGB.ToString()
|
||||
}
|
||||
Disk1GB {
|
||||
[string]$Disk1GBStr = $Disk1GB.ToString()
|
||||
}
|
||||
Disk2GB{
|
||||
[string]$Disk2GBStr = $Disk2GB.ToString()
|
||||
}
|
||||
}
|
||||
|
||||
$team_lead_sysid = (Get-ITDServiceNowUser -Email $RequestedForEmail).manager.value
|
||||
|
||||
$NewITDServiceNowServiceCatalogRequestParams = @{ # review and update all of these too
|
||||
CategoryItemName = "Application Server";
|
||||
RequestedForEmail = $SysadminEmail;
|
||||
Values = @{
|
||||
request_type = $RequestType;
|
||||
application_name = $AppName;
|
||||
environment = $Environment;
|
||||
require_hosting_quote = 'No';
|
||||
server_name = $ComputerName;
|
||||
add_change_disaster_recovery = 'No';
|
||||
additional_comments = $Comments;
|
||||
####
|
||||
vm_work_needed = 'Yes';
|
||||
host_name = $ComputerName;
|
||||
server_type = 'Virtual';
|
||||
operating_system = $OperatingSystem;
|
||||
target_os_version_windows = $TargetOSVersion;
|
||||
target_platform = $TargetPlatform;
|
||||
processors = $NumCpuStr;
|
||||
memory_gb = $MemoryGBStr;
|
||||
disk_1_os = $Disk1GBStr;
|
||||
disk_2_swap_disk = $Disk2GBStr;
|
||||
data_center = $Datacenter;
|
||||
licensing_restrictions = $LicensingRestrictions;
|
||||
support_hours = $SupportHours;
|
||||
dr_protection = $DRProtection;
|
||||
startup_priority = $StartupPriority;
|
||||
|
||||
# lookups
|
||||
cidr_block = $cidr_block.sys_id;
|
||||
agency_name = $agency.sys_id;
|
||||
team_lead = $team_lead.sys_id;
|
||||
application_info = $application_info.sys_id;
|
||||
|
||||
};
|
||||
}
|
||||
New-ITDServiceNowServiceCatalogRequest @NewITDServiceNowServiceCatalogRequestParams
|
||||
|
||||
#$NewITDServiceNowServiceCatalogRequestParams
|
||||
Write-Verbose -Message ("End " + $ComputerName)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end {
|
||||
|
||||
}
|
||||
}
|
||||
+193
@@ -0,0 +1,193 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
$params = @{
|
||||
HostName = "itdzmtest999.nd.gov";
|
||||
LicensingRestrictions = "No Licensing Restrictions";
|
||||
DataCenter = 'Bismarck';
|
||||
Environment = 'Test';
|
||||
StartupPriority = '5';
|
||||
OperatingSystem = 'Windows Server 2022 Datacenter (64-Bit)'
|
||||
DR_Protection = 'None';
|
||||
CPU = 1;
|
||||
MemoryGB = 4;
|
||||
Disk1 = 50;
|
||||
Disk2 = 2;
|
||||
Disk3 = 3;
|
||||
|
||||
}
|
||||
|
||||
New-ITDVMwareSharePointVMRecord @params
|
||||
#>
|
||||
|
||||
function New-ITDVMwareSharePointVMRecord {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[string]
|
||||
$HostName,
|
||||
|
||||
[string]
|
||||
$ReplacesVM,
|
||||
|
||||
[string]
|
||||
$LicensingRestrictions,
|
||||
|
||||
<#[string]
|
||||
$AgencyName,#>
|
||||
|
||||
[string]
|
||||
$SupportHours,
|
||||
|
||||
[string]
|
||||
$DataCenter,
|
||||
|
||||
[string]
|
||||
$Environment,
|
||||
|
||||
[int]
|
||||
$StartupPriority,
|
||||
|
||||
[string]
|
||||
$DR_Protection,
|
||||
|
||||
[string]
|
||||
$OperatingSystem,
|
||||
|
||||
[int]
|
||||
$CPU,
|
||||
|
||||
[int]
|
||||
$MemoryGB,
|
||||
|
||||
[string]
|
||||
$CIDRBlock,
|
||||
|
||||
[int]
|
||||
$Disk1,
|
||||
|
||||
[int]
|
||||
$Disk2,
|
||||
|
||||
[int]
|
||||
$Disk3,
|
||||
|
||||
[int]
|
||||
$Disk4,
|
||||
|
||||
[int]
|
||||
$Disk5,
|
||||
|
||||
[int]
|
||||
$Disk6,
|
||||
|
||||
[int]
|
||||
$Disk7,
|
||||
|
||||
[int]
|
||||
$Disk8,
|
||||
|
||||
[int]
|
||||
$Disk9,
|
||||
|
||||
[int]
|
||||
$Disk10,
|
||||
|
||||
[int]
|
||||
$Disk11,
|
||||
|
||||
[int]
|
||||
$Disk12,
|
||||
|
||||
[int]
|
||||
$Disk13,
|
||||
|
||||
[int]
|
||||
$Disk14,
|
||||
|
||||
[int]
|
||||
$Disk15,
|
||||
|
||||
[int]
|
||||
$Disk16
|
||||
)
|
||||
|
||||
begin {
|
||||
$UrlContextInfo = "https://share.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/contextinfo"
|
||||
$InvokeWebRequestParams = @{
|
||||
Uri = $UrlContextInfo;
|
||||
Method = "Post";
|
||||
UseBasicParsing = $true;
|
||||
}
|
||||
If ($Credential) { $InvokeWebRequestParams += @{Credential = $Credential } }
|
||||
Else { $InvokeWebRequestParams += @{UseDefaultCredentials = $true } }
|
||||
#$RequestDigest = Invoke-RestMethod -Uri $UrlContextInfo -Method Post -UseDefaultCredentials
|
||||
$RequestDigest = Invoke-RestMethod @InvokeWebRequestParams
|
||||
$RequestDigest = $RequestDigest.GetContextWebInformation.FormDigestValue
|
||||
|
||||
$UrlList = "https://share.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/lists/getbytitle('VM Guests')"
|
||||
$InvokeWebRequestParams = @{
|
||||
Uri = $UrlList;
|
||||
UseBasicParsing = $true;
|
||||
}
|
||||
If ($Credential) { $InvokeWebRequestParams += @{Credential = $Credential } }
|
||||
Else { $InvokeWebRequestParams += @{UseDefaultCredentials = $true } }
|
||||
#$List = Invoke-RestMethod -uri $UrlList -UseDefaultCredentials
|
||||
$List = Invoke-RestMethod @InvokeWebRequestParams
|
||||
$ListItemEntityTypeFullName = $list.entry.content.properties.ListItemEntityTypeFullName
|
||||
|
||||
$UrlListItems = "https://share.nd.gov/itd/computer-systems/distributed-systems/vmware/_api/lists/getbytitle('VM Guests')/items"
|
||||
|
||||
$header = @{
|
||||
"accept" = "application/json;odata=verbose"
|
||||
"X-RequestDigest" = $RequestDigest
|
||||
}
|
||||
}
|
||||
|
||||
process {
|
||||
[PSCustomObject]$NewRecord = @{
|
||||
"__metadata" = @{type = $ListItemEntityTypeFullName }
|
||||
Title = $HostName
|
||||
}
|
||||
write-host $PSBoundParameters
|
||||
switch($PSBoundParameters.Keys){
|
||||
# '' {$NewRecord += @{ = }}
|
||||
'LicensingRestrictions' {$NewRecord += @{LicensingRestrictions = $LicensingRestrictions}}
|
||||
'DataCenter' {$NewRecord += @{DataCenter = $DataCenter}}
|
||||
'Environment' {$NewRecord += @{Environment = $Environment}}
|
||||
'StartupPriority' {$NewRecord += @{StartupPriority = [string]$StartupPriority}}
|
||||
'OperatingSystem' {$NewRecord += @{OS = $OperatingSystem}}
|
||||
'DR_Protection' {$NewRecord += @{DR_Protection = $DR_Protection}}
|
||||
'CPU' {$NewRecord += @{Processors = $CPU}}
|
||||
'MemoryGB' {$NewRecord += @{RAM = $MemoryGB}}
|
||||
'Disk1' {$NewRecord += @{Disk_x0020_C_x003a_ = $Disk1}}
|
||||
'Disk2' {$NewRecord += @{Disk2_x002d_SwapDisk = $Disk2}}
|
||||
'Disk3' {$NewRecord += @{Disk_x0020_D_x003a_ = $Disk3}}
|
||||
}
|
||||
|
||||
$body = $NewRecord | ConvertTo-Json
|
||||
|
||||
$InvokeWebRequestParams = @{
|
||||
Uri = $UrlListItems;
|
||||
Method = "Post";
|
||||
Body = $body;
|
||||
ContentType = "application/json;odata=verbose";
|
||||
Headers = $header;
|
||||
UseBasicParsing = $true;
|
||||
}
|
||||
If ($Credential) { $InvokeWebRequestParams += @{Credential = $Credential } }
|
||||
Else { $InvokeWebRequestParams += @{UseDefaultCredentials = $true } }
|
||||
#Invoke-RestMethod -Method Post -Uri $UrlListItems -Body $body -ContentType "application/json;odata=verbose" -Headers $header -UseDefaultCredentials
|
||||
Invoke-RestMethod @InvokeWebRequestParams
|
||||
}
|
||||
|
||||
end {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Updates ServiceNow SCTask after a Linux VM is deleted
|
||||
.DESCRIPTION
|
||||
Updates ServiceNow SCTask after a Linux VM is deleted
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Remove-ITDLinuxServerMissingCmdb {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[string]
|
||||
$SCTaskNum,
|
||||
|
||||
[string]
|
||||
$ComputerName
|
||||
)
|
||||
|
||||
begin {
|
||||
|
||||
}
|
||||
|
||||
process {
|
||||
# get current user, SCTask, Ritm, custom variables
|
||||
$assignTo = Get-ServiceNowRecord -Table 'User' -Filter @('email', '-eq', ($env:username + "@nd.gov"))
|
||||
|
||||
$SCTask = Get-ServiceNowRecord -Table 'Catalog Task' -ID $SCTaskNum
|
||||
$RitmNum = $SCTask.request_item.display_value
|
||||
|
||||
$Ritm = Get-ServiceNowRecord -Table 'Requested Item' -ID $RitmNum -IncludeCustomVariable
|
||||
[string]$SNHostName = ($RITM.CustomVariable | Where-Object Name -EQ server_name).Value
|
||||
|
||||
Update-ServiceNowRecord -ID $SCTask.number -Values @{short_description = "VMware VM Removal for $SNHostName"; assigned_to = $assignTo.name }
|
||||
|
||||
If ($ComputerName -ne $SNHostName) {
|
||||
# false is good
|
||||
Write-Error -Message ("ComputerName entered in parameters does not match Host Name field in " + $SCTaskNum) -ErrorAction Stop
|
||||
}
|
||||
|
||||
$VMs = Get-VM -Name $ComputerName -ErrorAction SilentlyContinue | Where-Object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" }
|
||||
switch (@($VMs).count) {
|
||||
{ 0 } {
|
||||
Write-Warning "$ComputerName not found in vCenter... is it Azure?"
|
||||
}
|
||||
{ $_ -gt 1 } {
|
||||
Write-Warning '-gt 1'
|
||||
Write-Error -Message ("Multiple virtual machines with name $ComputerName were found. Are there SRM placeholders? If so, unconfigure SRM and run this again. If there are no placeholders, confirm the virtual machine name.") -ErrorAction Stop
|
||||
}
|
||||
1 {
|
||||
Write-Warning '1'
|
||||
$TagAssignment = Get-TagAssignment -Entity $VMs
|
||||
$vCenterInfo = $TagAssignment | select Tag, Entity | ConvertTo-Json -Depth 1
|
||||
If ($VMs.PowerState -eq 'PoweredOn') {
|
||||
#$VMs | Stop-VMGuest -Confirm:$false
|
||||
$VMs | Stop-VM -Confirm:$false
|
||||
}
|
||||
|
||||
If ($vCenterInfo) {
|
||||
Update-ServiceNowRecord -ID $SCTaskNum -Values @{work_notes = ("vCenter Information: `n " + $vCenterInfo) } # enter work_notes into sctask
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$CommentsForWorkNotes = ("VMware VM $SNHostName has been deleted. ")
|
||||
#$HardwareRemovalDescription = ("$SNHostName hardware is ready for removal.")
|
||||
|
||||
# if no errors, close sctask
|
||||
#$CommentsForWorkNotes += "VMware: Virtual machine named $ComputerName deleted."
|
||||
Update-ServiceNowRecord -ID $SCTaskNum -Values @{work_notes = $CommentsForWorkNotes; state = "Closed Complete"; close_notes = $CommentsForWorkNotes}
|
||||
}
|
||||
|
||||
end {
|
||||
|
||||
}
|
||||
}
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Updates ServiceNow SCTask after a Linux VM is deleted
|
||||
.DESCRIPTION
|
||||
Updates ServiceNow SCTask after a Linux VM is deleted
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Remove-ITDVMviaSNowTask {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[string]
|
||||
$SCTaskNum,
|
||||
|
||||
[string]
|
||||
$ComputerName
|
||||
)
|
||||
|
||||
begin {
|
||||
|
||||
}
|
||||
|
||||
process {
|
||||
# get current user, SCTask, Ritm, custom variables
|
||||
switch ($env:username) {
|
||||
'svcitdiaasauto' {
|
||||
$assignTo = Get-ITDServiceNowUser -Username svcvmwareadm
|
||||
}
|
||||
Default {
|
||||
$assignTo = Get-ITDServiceNowUser -Username $Env:username
|
||||
}
|
||||
}
|
||||
|
||||
$SCTask = Get-ITDServiceNowRecord -ItemType 'Catalog Task' -Number $SCTaskNum
|
||||
$RitmNum = $SCTask.request_item.display_value
|
||||
|
||||
Write-Verbose -Message "Retrieve $RitmNum and its VariableSet"
|
||||
$Ritm = Get-ITDServiceNowRecord -ItemType 'Request Item' -Number $RitmNum -IncludeVariableSet -ErrorAction Stop
|
||||
|
||||
###### the name in the $ComputerName parameter must match a name in the form to continue
|
||||
Write-Verbose -Message "Looking for a match of `$ComputerName $ComputerName and one of the rows' `$TempCi.FQDN.display_value"
|
||||
$MatchFound = $false
|
||||
ForEach ($Row in $Ritm.VariableSet) {
|
||||
$TempCi = Get-ITDServiceNowRecord -Table cmdb_ci -SysId ($Row.host_name_ref) -ErrorAction Stop
|
||||
If ($ComputerName -eq $TempCi.FQDN.display_value) {
|
||||
$Ci = $TempCi
|
||||
$MatchFound = $true
|
||||
}
|
||||
}
|
||||
|
||||
If ($MatchFound -eq $false) {
|
||||
Write-Error -Message "ComputerName $ComputerName was not found in VariableSet for $RitmNum" -ErrorAction Stop
|
||||
}
|
||||
|
||||
Update-ITDServiceNowRecord -ItemType 'Catalog Task' -Number $SCTask.number.display_value -Values @{assigned_to = $assignTo.name }
|
||||
|
||||
$FQDN = $Ci.fqdn.display_value
|
||||
|
||||
switch ( $Ci.model_id.display_value ) {
|
||||
{ $_ -like "*VMware*" } {
|
||||
$hardware_platform = "VMware";
|
||||
$hardware_type = 'Virtual Machine'
|
||||
|
||||
$VMs = Get-VM -Name $FQDN -ErrorAction SilentlyContinue | Where-Object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" }
|
||||
switch ( @($VMs).count ) {
|
||||
{ 0 } {
|
||||
Write-Warning "$FQDN not found in vCenter... is it Azure? Or does it not exist?"
|
||||
}
|
||||
{ $_ -gt 1 } {
|
||||
Write-Verbose -Message "Multiple virtual machines with name $FQDN were found."
|
||||
Write-Error -Message ("Multiple virtual machines with name $FQDN were found. Are there SRM placeholders? If so, unconfigure SRM and run this again. If there are no placeholders, confirm the virtual machine name.") -ErrorAction Stop
|
||||
}
|
||||
1 {
|
||||
Write-Verbose -Message "One virtual machine with name $FQDN were found."
|
||||
|
||||
If ($VMs.PowerState -eq 'PoweredOff') {
|
||||
# do nothing
|
||||
}
|
||||
Else {
|
||||
Write-Error -Message "VMware VM $FQDN is still powered on. "
|
||||
}
|
||||
|
||||
$TagAssignment = Get-TagAssignment -Entity $VMs
|
||||
$vCenterInfo = $TagAssignment | select Tag, Entity | ConvertTo-Json -Depth 1
|
||||
If ($VMs.PowerState -eq 'PoweredOn') {
|
||||
Write-Verbose -Message "Power off VMware VM $FQDN"
|
||||
$CommentsForWorkNotes += ("`nVMware: VM $FQDN has been powered off. ")
|
||||
$VMs | Stop-VM -Confirm:$false
|
||||
}
|
||||
|
||||
#If ($vCenterInfo) {
|
||||
# enter work_notes into sctask
|
||||
Update-ITDServiceNowRecord -ItemType 'Catalog Task' -Number $SCTaskNum -Values @{
|
||||
work_notes = ("vCenter Information: `n " + $vCenterInfo)
|
||||
}
|
||||
#}
|
||||
}
|
||||
}
|
||||
}
|
||||
{ $_ -like "*Microsoft Virtual Machine*" } {
|
||||
$hardware_platform = "Azure";
|
||||
$hardware_type = 'Virtual Machine'
|
||||
}
|
||||
{ $_ -like "*HP*" } {
|
||||
$hardware_platform = 'HPE';
|
||||
$hardware_type = 'Physical'
|
||||
}
|
||||
default { $hardware_platform = 'Other' }
|
||||
}
|
||||
|
||||
$CommentsForWorkNotes = ("$hardware_platform $hardware_type $FQDN has been deleted. ")
|
||||
|
||||
# Set SharePoint status to "Delete"
|
||||
#Set-ITDVMwareSharePointVMRecord -Title $FQDN -Status Delete -Verbose
|
||||
|
||||
Update-ITDServiceNowRecord -ItemType 'Catalog Task' -Number $SCTaskNum -Values @{
|
||||
work_notes = $CommentsForWorkNotes;
|
||||
state = 'Closed Complete';
|
||||
close_notes = $CommentsForWorkNotes
|
||||
}
|
||||
}
|
||||
|
||||
end {
|
||||
|
||||
}
|
||||
}
|
||||
+117
@@ -0,0 +1,117 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Set-ITDVMwareVMHardening {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[string[]]
|
||||
$Name
|
||||
)
|
||||
Begin {
|
||||
|
||||
}
|
||||
Process {
|
||||
If ($Name) {
|
||||
$VMs = Get-VM -Name $Name | Where-Object { $_.ExtensionData.Summary.Config.ManagedBy.Type -ne "placeholderVm" }
|
||||
}
|
||||
Else {
|
||||
$VMs = Get-VM -Name $Name | Where-Object { $_.ExtensionData.Summary.Config.ManagedBy.Type -ne "placeholderVm" }
|
||||
}
|
||||
|
||||
$SettingName = @(
|
||||
"tools.setInfo.sizeLimit",
|
||||
"isolation.device.edit.disable",
|
||||
"isolation.device.connectable.disable",
|
||||
"isolation.tools.copy.disable",
|
||||
"isolation.tools.dnd.disable",
|
||||
"isolation.tools.setGUIOptions.enable",
|
||||
"isolation.tools.paste.disable",
|
||||
"isolation.tools.diskShrink.disable",
|
||||
"isolation.tools.diskWiper.disable",
|
||||
"log.keepOld",
|
||||
"log.rotateSize"
|
||||
)
|
||||
|
||||
$Result = [System.Collections.ArrayList]@()
|
||||
ForEach ($VM in $VMs) {
|
||||
$GetAdvSetting = Get-AdvancedSetting -Entity $VM -Name $SettingName | select Entity, Name, Value
|
||||
$obj = [PSCustomObject]@{
|
||||
'Entity' = $VM.Name
|
||||
'Uid' = $VM.Uid.split('@')[1].split(':')[0]
|
||||
"tools.setInfo.sizeLimit" = ($GetAdvSetting | Where-Object Name -EQ 'tools.setInfo.sizeLimit').Value
|
||||
"isolation.device.edit.disable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.device.edit.disable').Value
|
||||
"isolation.device.connectable.disable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.device.connectable.disable').Value
|
||||
"isolation.tools.copy.disable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.tools.copy.disable').Value
|
||||
"isolation.tools.dnd.disable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.tools.dnd.disable').Value
|
||||
"isolation.tools.setGUIOptions.enable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.tools.setGUIOptions.enable').Value
|
||||
"isolation.tools.paste.disable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.tools.paste.disable').Value
|
||||
"isolation.tools.diskShrink.disable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.tools.diskShrink.disable').Value
|
||||
"isolation.tools.diskWiper.disable" = ($GetAdvSetting | Where-Object Name -EQ 'isolation.tools.diskWiper.disable').Value
|
||||
"log.keepOld" = ($GetAdvSetting | Where-Object Name -EQ 'log.keepOld').Value
|
||||
"log.rotateSize" = ($GetAdvSetting | Where-Object Name -EQ 'log.rotateSize').Value
|
||||
}
|
||||
$Result.Add($obj)
|
||||
}
|
||||
|
||||
$Result
|
||||
|
||||
# remediate VMs
|
||||
ForEach ($VM in ($Result | Where-Object { $_.Entity -notlike "vCLS*" -and $_.'tools.setInfo.sizeLimit' -ne 1048576 }) ) {
|
||||
Get-VM -Name $VM.Entity -Server $VM.Uid | New-AdvancedSetting -Name 'tools.setInfo.sizeLimit' -Value '1048576' -Confirm:$false -Force:$true
|
||||
}
|
||||
|
||||
ForEach ($VM in ($Result | Where-Object { $_.Entity -notlike "vCLS*" -and $_.'isolation.device.edit.disable' -ne "TRUE" }) ) {
|
||||
Get-VM -Name $VM.Entity -Server $VM.Uid | New-AdvancedSetting -Name 'isolation.device.edit.disable' -Value 'TRUE' -Confirm:$false -Force:$true
|
||||
}
|
||||
|
||||
ForEach ($VM in ($Result | Where-Object { $_.Entity -notlike "vCLS*" -and $_.'isolation.device.connectable.disable' -ne "TRUE" }) ) {
|
||||
Get-VM -Name $VM.Entity -Server $VM.Uid | New-AdvancedSetting -Name 'isolation.device.connectable.disable' -Value TRUE -Confirm:$false -Force:$true
|
||||
}
|
||||
|
||||
ForEach ($VM in ($Result | Where-Object { $_.Entity -notlike "vCLS*" -and $_.'isolation.tools.copy.disable' -ne "TRUE" }) ) {
|
||||
Get-VM -Name $VM.Entity -Server $VM.Uid | New-AdvancedSetting -Name 'isolation.tools.copy.disable' -Value 'TRUE' -Confirm:$false -Force:$true
|
||||
}
|
||||
|
||||
ForEach ($VM in ($Result | Where-Object { $_.Entity -notlike "vCLS*" -and $_.'isolation.tools.dnd.disable' -ne "TRUE" }) ) {
|
||||
Get-VM -Name $VM.Entity -Server $VM.Uid | New-AdvancedSetting -Name 'isolation.tools.dnd.disable' -Value 'TRUE' -Confirm:$false -Force:$true
|
||||
}
|
||||
|
||||
ForEach ($VM in ($Result | Where-Object { $_.Entity -notlike "vCLS*" -and $_.'isolation.tools.setGUIOptions.enable' -ne "FALSE" }) ) {
|
||||
Get-VM -Name $VM.Entity -Server $VM.Uid | New-AdvancedSetting -Name 'isolation.tools.setGUIOptions.enable' -Value 'FALSE' -Confirm:$false -Force:$true
|
||||
}
|
||||
|
||||
ForEach ($VM in ($Result | Where-Object { $_.Entity -notlike "vCLS*" -and $_.'isolation.tools.paste.disable' -ne "TRUE" }) ) {
|
||||
Get-VM -Name $VM.Entity -Server $VM.Uid | New-AdvancedSetting -Name 'isolation.tools.paste.disable' -Value 'TRUE' -Confirm:$false -Force:$true
|
||||
}
|
||||
|
||||
ForEach ($VM in ($Result | Where-Object { $_.Entity -notlike "vCLS*" -and $_.'isolation.tools.diskShrink.disable' -ne "TRUE" }) ) {
|
||||
Get-VM -Name $VM.Entity -Server $VM.Uid | New-AdvancedSetting -Name 'isolation.tools.diskShrink.disable' -Value 'TRUE' -Confirm:$false -Force:$true
|
||||
}
|
||||
|
||||
ForEach ($VM in ($Result | Where-Object { $_.Entity -notlike "vCLS*" -and $_.'isolation.tools.diskWiper.disable' -ne "TRUE" }) ) {
|
||||
Get-VM -Name $VM.Entity -Server $VM.Uid | New-AdvancedSetting -Name 'isolation.tools.diskWiper.disable' -Value 'TRUE' -Confirm:$false -Force:$true
|
||||
}
|
||||
|
||||
ForEach ($VM in ($Result | Where-Object { $_.Entity -notlike "vCLS*" -and $_.'log.keepOld' -ne "10" }) ) {
|
||||
Get-VM -Name $VM.Entity -Server $VM.Uid | New-AdvancedSetting -Name 'log.keepOld' -Value '10' -Confirm:$false -Force:$true
|
||||
}
|
||||
|
||||
ForEach ($VM in ($Result | Where-Object { $_.Entity -notlike "vCLS*" -and $_.'log.rotateSize' -ne "1024000" }) ) {
|
||||
Get-VM -Name $VM.Entity -Server $VM.Uid | New-AdvancedSetting -Name 'log.rotateSize' -Value '10' -Confirm:$false -Force:$true
|
||||
}
|
||||
}
|
||||
End {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,330 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Set-ITDVMwareVMTag {
|
||||
[CmdletBinding()]
|
||||
param
|
||||
(
|
||||
[string]
|
||||
$ComputerName,
|
||||
|
||||
[string]
|
||||
$AppName,
|
||||
|
||||
[string]
|
||||
$Dtap,
|
||||
|
||||
<#[string]
|
||||
$OperatingSystem,#>
|
||||
|
||||
[string]
|
||||
$StartupPriority,
|
||||
|
||||
[string]
|
||||
$LicensingRestrictions,
|
||||
|
||||
[string]
|
||||
$DRProtection,
|
||||
|
||||
[string]
|
||||
$SRMRecoveryType
|
||||
)
|
||||
|
||||
begin {
|
||||
}
|
||||
|
||||
process {
|
||||
|
||||
$VMs = Get-VM -Name $ComputerName | Where-Object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" }
|
||||
If ($VMs) {
|
||||
ForEach ($VM in $VMs) {
|
||||
#AppName Tag
|
||||
If ($AppName) {
|
||||
Write-Verbose ($VM.Name + ": AppName Tag Start")
|
||||
$OldTag = Get-TagAssignment -Category AppName -Entity $VM
|
||||
$VIServer = $VM.Uid.split('@')[1].split(':')[0]
|
||||
$OldTagName = $OldTag.tag.name
|
||||
$NewTagName = $AppName
|
||||
|
||||
If ($OldTagName -ne $NewTagName) {
|
||||
Write-Verbose ($VM.Name + " AppName old and new tags different")
|
||||
Write-Verbose ("Old Tag " + $OldTagName)
|
||||
Write-Verbose ("New Tag " + $NewTagName)
|
||||
|
||||
If ($OldTag) { $OldTag | Remove-TagAssignment -Confirm:$false -ErrorAction SilentlyContinue; Write-Host ($VM.Name + " Tag Removed") } #Errors with Remove-TagAssignment : Cannot bind argument to parameter 'TagAssignment' because it is null. --- but still works
|
||||
|
||||
#Get-Tag -Category AppName -Name $NewTagName -Server $VIServer
|
||||
New-TagAssignment -Entity (Get-VM $VM.Name -Server $VIServer -OutVariable VM) -Tag (Get-Tag -Server $VIServer -Category AppName -Name $NewTagName) -Server $VIServer
|
||||
|
||||
Write-Verbose ($VM.Name + " tag updated " + $VIServer)#
|
||||
}
|
||||
Write-Verbose ($VM.Name + ": AppName Tag End")
|
||||
}
|
||||
|
||||
$OldTag = $null
|
||||
$VIServer = $null
|
||||
$OldTagName = $null
|
||||
$NewTagName = $null
|
||||
|
||||
#DTAP Tag
|
||||
If ($DTAP) {
|
||||
Write-Verbose ($VM.Name + ": DTAP Tag Start")
|
||||
$OldTag = Get-TagAssignment -Category DTAP -Entity $VM
|
||||
$VIServer = $VM.Uid.split('@')[1].split(':')[0]
|
||||
$OldTagName = $OldTag.tag.name
|
||||
$NewTagName = $DTAP
|
||||
|
||||
If ($OldTagName -ne $NewTagName) {
|
||||
Write-Verbose ($VM.Name + " DTAP old and new tags different")
|
||||
Write-Verbose ("Old Tag " + $OldTagName)
|
||||
Write-Verbose ("New Tag " + $NewTagName)
|
||||
|
||||
If ($OldTag) { $OldTag | Remove-TagAssignment -Confirm:$false -ErrorAction SilentlyContinue; Write-Host ($VM.Name + " Tag Removed") } #Errors with Remove-TagAssignment : Cannot bind argument to parameter 'TagAssignment' because it is null. --- but still works
|
||||
|
||||
#Get-Tag -Category AppName -Name $NewTagName -Server $VIServer
|
||||
New-TagAssignment -Entity (Get-VM $VM.Name -Server $VIServer -OutVariable VM) -Tag (Get-Tag -Server $VIServer -Category DTAP -Name $NewTagName) -Server $VIServer
|
||||
|
||||
Write-Verbose ($VM.Name + " tag updated " + $VIServer)
|
||||
}
|
||||
Write-Verbose ($VM.Name + ": DTAP Tag End")
|
||||
}
|
||||
|
||||
$OldTag = $null
|
||||
$VIServer = $null
|
||||
$OldTagName = $null
|
||||
$NewTagName = $null
|
||||
|
||||
#Startup Priority
|
||||
If ($StartupPriority) {
|
||||
Write-Verbose ($VM.Name + ": StartupPriority Tag Start")
|
||||
$OldTag = Get-TagAssignment -Category 'StartupPriority' -Entity $VM
|
||||
$VIServer = $VM.Uid.split('@')[1].split(':')[0]
|
||||
$OldTagName = $OldTag.tag.name
|
||||
$NewTagName = $StartupPriority
|
||||
|
||||
If ($OldTagName -ne $NewTagName) {
|
||||
Write-Verbose ($VM.Name + " StartupPriority old and new tags different")
|
||||
Write-Verbose ("Old Tag " + $OldTagName)
|
||||
Write-Verbose ("New Tag " + $NewTagName)
|
||||
|
||||
If ($OldTag) { $OldTag | Remove-TagAssignment -Confirm:$false -ErrorAction SilentlyContinue; Write-Host ($VM.Name + " Tag Removed") } #Errors with Remove-TagAssignment : Cannot bind argument to parameter 'TagAssignment' because it is null. --- but still works
|
||||
|
||||
#Get-Tag -Category AppName -Name $NewTagName -Server $VIServer
|
||||
New-TagAssignment -Entity (Get-VM $VM.Name -Server $VIServer -OutVariable VM) -Tag (Get-Tag -Server $VIServer -Category 'StartupPriority' -Name $NewTagName) -Server $VIServer
|
||||
|
||||
Write-Verbose ($VM.Name + " tag updated " + $VIServer)
|
||||
}
|
||||
Write-Verbose ($VM.Name + ": StartupPriority Tag End")
|
||||
}
|
||||
$OldTag = $null
|
||||
$VIServer = $null
|
||||
$OldTagName = $null
|
||||
$NewTagName = $null
|
||||
|
||||
<# OS Tag
|
||||
If ($OperatingSystem) {
|
||||
Write-Verbose ($VM.Name + ": OS Tag Start")
|
||||
$OldTag = Get-TagAssignment -Category "Operating System" -Entity $VM
|
||||
$VIServer = $VM.Uid.split('@')[1].split(':')[0]
|
||||
$OldTagName = $OldTag.tag.name
|
||||
$NewTagName = $OperatingSystem
|
||||
|
||||
If ($OldTagName -ne $NewTagName) {
|
||||
Write-Verbose ($VM.Name + " OS old and new tags different")
|
||||
Write-Verbose ("Old Tag " + $OldTagName)
|
||||
Write-Verbose ("New Tag " + $NewTagName)
|
||||
|
||||
If ($OldTag) { $OldTag | Remove-TagAssignment -Confirm:$False -ErrorAction SilentlyContinue; Write-Host ($VM.Name + " Tag Removed") }
|
||||
If ($NewTagName -ne "None") {
|
||||
New-TagAssignment -Entity (Get-VM $VM.Name -Server $VIServer -OutVariable VM) -Tag (Get-Tag -Server $VIServer -Category 'Operating System' -Name $NewTagName) -Server $VIServer
|
||||
Write-Verbose ($VM.Name + " tag updated " + $VIServer)
|
||||
}
|
||||
else {
|
||||
Write-Verbose ($VM.Name + " tag invalid or None " + $VIServer)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Write-Verbose ($VM.Name + ": OS Tag End")
|
||||
}
|
||||
|
||||
$OldTag = $null
|
||||
$VIServer = $null
|
||||
$OldTagName = $null
|
||||
$NewTagName = $null
|
||||
#>
|
||||
|
||||
# Licensing Tag
|
||||
If ($LicensingRestrictions) {
|
||||
Write-Verbose ($VM.Name + ": Licensing Restrictions Tag Start")
|
||||
$OldTag = Get-TagAssignment -Category "LicensingRestrictions" -Entity $VM
|
||||
$VIServer = $VM.Uid.split('@')[1].split(':')[0]
|
||||
$OldTagName = $OldTag.tag.name
|
||||
$NewTagName = $LicensingRestrictions
|
||||
|
||||
If ($OldTagName -ne $NewTagName) {
|
||||
Write-Verbose ($VM.Name + " Licensing old and new tags different")
|
||||
Write-Verbose ("Old Tag " + $OldTagName)
|
||||
Write-Verbose ("New Tag " + $NewTagName)
|
||||
|
||||
If ($OldTag) { $OldTag | Remove-TagAssignment -Confirm:$False -ErrorAction SilentlyContinue; Write-Host ($VM.Name + " Tag Removed") }
|
||||
If ($NewTagName -ne "None") {
|
||||
New-TagAssignment -Entity (Get-VM $VM.Name -Server $VIServer -OutVariable VM) -Tag (Get-Tag -Server $VIServer -Category 'LicensingRestrictions' -Name $NewTagName) -Server $VIServer
|
||||
Write-Verbose ($VM.Name + " tag updated " + $VIServer)
|
||||
}
|
||||
else {
|
||||
Write-Verbose ($VM.Name + " tag invalid or None " + $VIServer)
|
||||
}
|
||||
}
|
||||
Write-Verbose ($VM.Name + ": Licensing Tag End")
|
||||
}
|
||||
$OldTag = $null
|
||||
$VIServer = $null
|
||||
$OldTagName = $null
|
||||
$NewTagName = $null
|
||||
|
||||
# SRM Recovery Type Tag
|
||||
If ($SRMRecoveryType) {
|
||||
Write-Verbose ($VM.Name + ": SRM Recovery Type Tag Start")
|
||||
$OldTag = Get-TagAssignment -Category "SRM Recovery Type" -Entity $VM
|
||||
$VIServer = $VM.Uid.split('@')[1].split(':')[0]
|
||||
$OldTagName = $OldTag.tag.name
|
||||
$NewTagName = $SRMRecoveryType
|
||||
|
||||
If ($OldTagName -ne $NewTagName) {
|
||||
Write-Verbose ($VM.Name + " SRM Recovery Type old and new tags different")
|
||||
Write-Verbose ("Old Tag " + $OldTagName)
|
||||
Write-Verbose ("New Tag " + $NewTagName)
|
||||
|
||||
If ($OldTag) { $OldTag | Remove-TagAssignment -Confirm:$False -ErrorAction SilentlyContinue; Write-Host ($VM.Name + " Tag Removed") }
|
||||
If ($NewTagName -ne "None") {
|
||||
New-TagAssignment -Entity (Get-VM $VM.Name -Server $VIServer -OutVariable VM) -Tag (Get-Tag -Server $VIServer -Category 'SRM Recovery Type' -Name $NewTagName) -Server $VIServer
|
||||
Write-Verbose ($VM.Name + " tag updated " + $VIServer)
|
||||
}
|
||||
else {
|
||||
Write-Verbose ($VM.Name + " tag invalid or None " + $VIServer)
|
||||
}
|
||||
}
|
||||
Write-Verbose ($VM.Name + ": SRM Recovery Type Tag End")
|
||||
}
|
||||
$OldTag = $null
|
||||
$VIServer = $null
|
||||
$OldTagName = $null
|
||||
$NewTagName = $null
|
||||
|
||||
# DR Protection
|
||||
If ($DRProtection) {
|
||||
Write-Verbose ($VM.Name + ": DR Protection Tag Start")
|
||||
$OldTag = Get-TagAssignment -Category "DR Protection" -Entity $VM
|
||||
$VIServer = $VM.Uid.split('@')[1].split(':')[0]
|
||||
$OldTagName = $OldTag.tag.name
|
||||
$NewTagName = $DRProtection
|
||||
|
||||
If ($OldTagName -ne $NewTagName) {
|
||||
Write-Verbose ($VM.Name + " DR Protection old and new tags different")
|
||||
Write-Verbose ("Old Tag " + $OldTagName)
|
||||
Write-Verbose ("New Tag " + $NewTagName)
|
||||
|
||||
If ($OldTag) { $OldTag | Remove-TagAssignment -Confirm:$False -ErrorAction SilentlyContinue; Write-Host ($VM.Name + " Tag Removed") }
|
||||
If ($NewTagName -ne "None") {
|
||||
New-TagAssignment -Entity (Get-VM $VM.Name -Server $VIServer -OutVariable VM) -Tag (Get-Tag -Server $VIServer -Category 'DR Protection' -Name $NewTagName) -Server $VIServer
|
||||
Write-Verbose ($VM.Name + " tag updated " + $VIServer)
|
||||
}
|
||||
else {
|
||||
Write-Verbose ($VM.Name + " tag invalid or None " + $VIServer)
|
||||
}
|
||||
}
|
||||
Write-Verbose ($VM.Name + ": DR Protection Tag End")
|
||||
}
|
||||
$OldTag = $null
|
||||
$VIServer = $null
|
||||
$OldTagName = $null
|
||||
$NewTagName = $null
|
||||
|
||||
|
||||
}
|
||||
|
||||
<# SRM Recovery Type Tags
|
||||
Write-Verbose ($VM.Name + ": SRM Recovery Type Tag Start")
|
||||
$OldTag = Get-TagAssignment -Category "SRM Recovery Type" -Entity $VM
|
||||
$VIServer = $VM.Uid.split('@')[1].split(':')[0]
|
||||
$OldTagName = $OldTag.tag.name
|
||||
If ($VM.ExtensionData.summary.config.ManagedBy.Type -eq "placeholderVm" ) {
|
||||
#If VM is placeholder
|
||||
$NewTagName = "Placeholder"
|
||||
}
|
||||
Else {
|
||||
$NewTagName = $SPItem.SRM_RecoveryVMtype
|
||||
}
|
||||
|
||||
If ($OldTagName -ne $NewTagName) {
|
||||
Write-Verbose ($VM.Name + " SRM Recovery Type old and new tags different")
|
||||
Write-Verbose ("Old Tag " + $OldTagName)
|
||||
Write-Verbose ("New Tag " + $NewTagName)
|
||||
|
||||
If ($OldTag) { $OldTag | Remove-TagAssignment -Confirm:$False -ErrorAction SilentlyContinue; Write-Host ($VM.Name + " Tag Removed") }
|
||||
If ($NewTagName -ne "None") {
|
||||
New-TagAssignment -Entity (Get-VM $VM.Name -Server $VIServer -OutVariable VM) -Tag (Get-Tag -Server $VIServer -Category 'SRM Recovery Type' -Name $NewTagName) -Server $VIServer
|
||||
Write-Verbose ($VM.Name + " tag updated " + $VIServer)
|
||||
}
|
||||
else {
|
||||
Write-Verbose ($VM.Name + " tag invalid or None " + $VIServer)
|
||||
}
|
||||
}
|
||||
|
||||
Write-Verbose ($VM.Name + ": SRM Recovery Type Tag End")#>
|
||||
|
||||
$OldTag = $null
|
||||
$VIServer = $null
|
||||
$OldTagName = $null
|
||||
$NewTagName = $null
|
||||
|
||||
<#VR RPO Tag
|
||||
Write-Verbose ($VM.Name + ": SRM Tag Start")
|
||||
$OldTag = Get-TagAssignment -Category 'VR RPO' -Entity $VM
|
||||
$VIServer = $VM.Uid.split('@')[1].split(':')[0]
|
||||
$OldTagName = $OldTag.tag.name
|
||||
$NewTagName = $SPItem.DR_Protection -replace "VMware: "
|
||||
|
||||
If ($OldTagName -ne $NewTagName) {
|
||||
Write-Verbose ($VM.Name + " SRM old and new tags different")
|
||||
Write-Verbose ("Old Tag " + $OldTagName)
|
||||
Write-Verbose ("New Tag " + $NewTagName)
|
||||
|
||||
If ($OldTag) { $OldTag | Remove-TagAssignment -Confirm:$false -ErrorAction SilentlyContinue; Write-Host ($VM.Name + " Tag Removed") } #Errors with Remove-TagAssignment : Cannot bind argument to parameter 'TagAssignment' because it is null. --- but still works
|
||||
#Get-Tag -Category AppName -Name $NewTagName -Server $VIServer
|
||||
If ($NewTagName -ne "None") {
|
||||
New-TagAssignment -Entity (Get-VM $VM.Name -Server $VIServer -OutVariable VM) -Tag (Get-Tag -Server $VIServer -Category 'VR RPO' -Name $NewTagName) -Server $VIServer
|
||||
Write-Verbose ($VM.Name + " tag updated " + $VIServer)
|
||||
}
|
||||
else {
|
||||
Write-Verbose ($VM.Name + " tag invalid or None " + $VIServer)
|
||||
}
|
||||
|
||||
}#>
|
||||
}
|
||||
Else {
|
||||
|
||||
}
|
||||
#}
|
||||
<#catch {
|
||||
Write-Error ($VM.Name + " tag errored")
|
||||
Write-Error $error[-1]
|
||||
}#>
|
||||
}
|
||||
end {
|
||||
|
||||
}
|
||||
}
|
||||
+119
@@ -0,0 +1,119 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Set-ITDVMwareVMTagFromCmdb {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(
|
||||
Mandatory = $true,
|
||||
ValueFromPipeline = $true,
|
||||
ParameterSetName = 'VMName'
|
||||
)]
|
||||
[string]
|
||||
$VMName
|
||||
)
|
||||
|
||||
begin {
|
||||
#$Result = [System.Collections.ArrayList]@()
|
||||
}
|
||||
|
||||
process {
|
||||
$HostName = $VMName.split('.')[0]
|
||||
Write-Verbose -Message "Looking up Cmdb Object named $HostName"
|
||||
$Cmdb = Get-ITDServiceNowRecord -Table cmdb_ci_server -Filter "name=$HostName"
|
||||
|
||||
If($null -eq $Cmdb) {
|
||||
Write-Warning -Message "No Cmdb Object found for $HostName"
|
||||
return
|
||||
}
|
||||
|
||||
$VM = Get-VM -Name $VMName | Where-Object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" } | Sort-Object Name
|
||||
$OldTags = Get-TagAssignment -Entity $VM
|
||||
|
||||
$obj = [PSCustomObject]@{
|
||||
VMName = $VMName;
|
||||
DTAP = $null;
|
||||
AppName = $null;
|
||||
LicensingRestrictions = $null;
|
||||
DRProtection = $null;
|
||||
SRMRecoveryType = $null;
|
||||
}
|
||||
# DTAP
|
||||
If ($Cmdb.environment.display_value) {
|
||||
$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'DTAP' }).Tag.Name
|
||||
If ($Cmdb.environment.display_value -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $VMName DTAP Tag to " + $Cmdb.environment.display_value)
|
||||
Set-ITDVMwareVMTag -ComputerName $VMName -Dtap $Cmdb.environment.display_value
|
||||
}
|
||||
Else {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
# AppName
|
||||
If ($Cmdb.u_nd_application_svc.display_value) {
|
||||
$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'AppName' }).Tag.Name
|
||||
If ($Cmdb.u_nd_application_svc.display_value -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $VMName AppName Tag to " + $Cmdb.u_nd_application_svc.display_value)
|
||||
Set-ITDVMwareVMTag -ComputerName $VMName -AppName $Cmdb.u_nd_application_svc.display_value
|
||||
}
|
||||
Else {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
# Licensing Restrictions
|
||||
If ($Cmdb.u_nd_licensing_restrictions.display_value) {
|
||||
$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'LicensingRestrictions' }).Tag.Name
|
||||
If ($Cmdb.u_nd_licensing_restrictions.display_value -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $VMName Licensing Restrictions Tag to " + $Cmdb.u_nd_licensing_restrictions.display_value)
|
||||
Set-ITDVMwareVMTag -ComputerName $VMName -LicensingRestrictions $Cmdb.u_nd_licensing_restrictions.display_value
|
||||
}
|
||||
Else {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
# startup priority TBD
|
||||
# startup priority is not in Cmdb
|
||||
|
||||
# SRM Recovery Type
|
||||
If ($Cmdb.u_srm_recovery_type.display_value) {
|
||||
$TagAssignmentValue = ($OldTags | Where-Object { $_.Tag.Category.Name -eq 'SRM Recovery Type' }).Tag.Name
|
||||
If ($Cmdb.u_srm_recovery_type.display_value -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $VMName SRM Recovery Type Tag to " + $Cmdb.u_srm_recovery_type.display_value)
|
||||
Set-ITDVMwareVMTag -ComputerName $VMName -SRMRecoveryType $Cmdb.u_srm_recovery_type.display_value
|
||||
}
|
||||
Else {
|
||||
|
||||
}
|
||||
}
|
||||
#
|
||||
# DR Protection
|
||||
If ( ($Cmdb.u_nd_dr_protection.display_value -replace "VMware: " -replace "RPO", "VR RPO") ) { #-replace "VMware: " -replace "RPO", "VR RPO"
|
||||
$TagAssignmentValue = ($OldTags | Where-Object {$_.Tag.Category.Name -eq 'DR Protection' }).Tag.Name
|
||||
If ( ($Cmdb.u_nd_dr_protection.display_value -replace "VMware: " -replace "RPO", "VR RPO") -ne $TagAssignmentValue) {
|
||||
Write-Verbose -Message ("Setting $VMName DR Protection Tag to " + ($Cmdb.u_nd_dr_protection.display_value -replace "VMware: ") )
|
||||
Set-ITDVMwareVMTag -ComputerName $VMName -DRProtection ($Cmdb.u_nd_dr_protection.display_value -replace "VMware: " -replace "RPO", "VR RPO")
|
||||
}
|
||||
Else {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end {
|
||||
|
||||
}
|
||||
}
|
||||
+250
@@ -0,0 +1,250 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Function to process a VMware change request
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Set-ITDVMwareVMViaSnowTask {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[string]
|
||||
$SCTaskNum,
|
||||
|
||||
[switch]
|
||||
$Override,
|
||||
|
||||
[switch]
|
||||
$CloseTask
|
||||
)
|
||||
|
||||
begin {
|
||||
$FreePercentThreshold = 0.20 # 20% free space required before disk expansions are automated
|
||||
}
|
||||
|
||||
process {
|
||||
# get current user, SCTask, Ritm
|
||||
$assignTo = Get-ITDServiceNowUser -Username $Env:USERNAME
|
||||
$SCTask = Get-ITDServiceNowRecord -ItemType 'Catalog Task' -Number $SCTaskNum
|
||||
$Ritm = Get-ITDServiceNowRecord -ItemType 'Request Item' -SysId ($SCTask.request_item.value) -IncludeVariableSet
|
||||
$RitmNum = $Ritm.number.value
|
||||
|
||||
# Get Hostname and CMDB object
|
||||
[string]$SCTaskDescriptionHostname = $SCTask.description.display_value.split(' ')[-1]
|
||||
$TaskCmdb = @()
|
||||
|
||||
Write-Verbose -Message ("Gathering VariableSet data from $RitmNum")
|
||||
$MatchFound = $false
|
||||
ForEach ($Row in $Ritm.VariableSet) {
|
||||
$TempCi = Get-ITDServiceNowRecord -Table cmdb_ci -SysId ($Row.host_name_ref) -ErrorAction Stop
|
||||
If ($SCTaskDescriptionHostname -eq $TempCi.name.display_value) {
|
||||
$Ci = $TempCi
|
||||
$MatchFound = $true
|
||||
}
|
||||
}
|
||||
|
||||
If ($MatchFound -eq $false) {
|
||||
Write-Error -Message "ComputerName $ComputerName was not found in VariableSet for $RitmNum" -ErrorAction Stop
|
||||
}
|
||||
|
||||
$FQDN = $Ci.fqdn.display_value
|
||||
|
||||
If ( @($Ci).count -gt 1 ) {
|
||||
Write-Error -Message "More than one CMDB object found that matches the hostname in this task's description" -ErrorAction Stop
|
||||
}
|
||||
|
||||
# update SCTask description and assignment for humans
|
||||
Update-ITDServiceNowRecord -ItemType 'Catalog Task' -Number $SCTaskNum -Values @{assigned_to = $assignTo.name }
|
||||
|
||||
# search for VMware VM
|
||||
try {
|
||||
$VM = Get-VM -Name $Ci.fqdn.display_value | Where-Object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" }
|
||||
}
|
||||
catch {
|
||||
Write-Error "Error on VM lookup. Are you connected to vCenter?" -ErrorAction Stop
|
||||
}
|
||||
|
||||
switch ( @($VM).count ) {
|
||||
{ 0 -or $null } {
|
||||
# no matches
|
||||
Write-Error -Message "Zero VM matches found, ending script" -ErrorAction Stop
|
||||
}
|
||||
{ $_ -ne 1 } {
|
||||
# more than one match
|
||||
Write-Error -Message "Multiple VM matches found, ending script" -ErrorAction Stop
|
||||
}
|
||||
{ 1 } {
|
||||
# exactly one match, gather request information, and populate variables
|
||||
Write-Verbose -Message ("VM: " + $VM.Name)
|
||||
[int]$CPU = ($Ritm.VariableSet | Where-Object { $_.host_name_ref -EQ $Ci.sys_id.value } ).Processors
|
||||
[int]$MemoryGB = ($Ritm.VariableSet | Where-Object { $_.host_name_ref -EQ $Ci.sys_id.value } ).memory_gb
|
||||
[int]$Disk1 = ($Ritm.VariableSet | Where-Object { $_.host_name_ref -EQ $Ci.sys_id.value } ).disk_1_os
|
||||
[int]$Disk2 = ($Ritm.VariableSet | Where-Object { $_.host_name_ref -EQ $Ci.sys_id.value } ).disk_2_swap_disk
|
||||
|
||||
3..16 | ForEach-Object {
|
||||
$DiskNum = $_
|
||||
Write-Verbose "Populating variable Disk$DiskNum"
|
||||
###Set-Variable -Name "Disk$DiskNum" -Value ([int](($Ritm.CustomVariable | Where-Object Name -Like "disk_$DiskNum*").Value))
|
||||
Set-Variable -Name "Disk$DiskNum" -Value ([int]( ($Ritm.VariableSet | Where-Object { $_.host_name_ref -EQ $Ci.sys_id.value } )."disk_$DiskNum"))
|
||||
}
|
||||
|
||||
# CPU modification
|
||||
If ($CPU -ne 0 -and $CPU -ne $VM.NumCpu) {
|
||||
Write-Verbose -Message ($VM.Name + " attempt changing CPU from " + $VM.NumCPU + " to " + $CPU)
|
||||
try {
|
||||
$OldCpu = $VM.NumCpu
|
||||
$VM | Set-VM -NumCpu $CPU -Confirm:$false -ErrorAction Stop
|
||||
$CommentsForWorkNotes += "CPU was updated from $OldCpu to $CPU. `n"
|
||||
}
|
||||
catch {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
# MemoryGB modification
|
||||
If ($MemoryGB -ne 0 -and $MemoryGB -ne $VM.MemoryGB) {
|
||||
Write-Verbose -Message ($VM.Name + " attempt changing MemoryGB to " + $MemoryGB)
|
||||
try {
|
||||
$OldMemoryGB = $VM.MemoryGB
|
||||
$VM | Set-VM -MemoryGB $MemoryGB -Confirm:$false -ErrorAction Stop
|
||||
$CommentsForWorkNotes += "MemoryGB was updated from $OldMemoryGB to $MemoryGB. `n"
|
||||
}
|
||||
catch {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
# Disk modification loop
|
||||
$VMDisks = $VM | Get-HardDisk
|
||||
1..16 | ForEach-Object {
|
||||
Write-Verbose "Start Loop for Disk $_"
|
||||
$HardDisk = $null
|
||||
$DiskGBNewValue = $null
|
||||
$DiskVarName = $null
|
||||
|
||||
$DiskNum = $_
|
||||
$DiskGBNewValue = (Get-Variable -Name Disk$DiskNum).Value
|
||||
|
||||
switch ($DiskNum){
|
||||
1 {
|
||||
$DiskVarName = "Disk1"
|
||||
}
|
||||
2 {
|
||||
$DiskVarName = "Disk2"
|
||||
}
|
||||
Default {
|
||||
$DiskVarName = ("Disk" + $DiskNum)
|
||||
}
|
||||
}
|
||||
|
||||
If ( (Get-Variable -Name $DiskVarName).Value -ne 0 ) {
|
||||
Write-Verbose -Message ("DiskNum: $DiskNum, DiskGBNewValue: $DiskGBNewValue")
|
||||
|
||||
$HardDisk = $VM | Get-HardDisk -Name "Hard disk $DiskNum" -ErrorAction SilentlyContinue
|
||||
If ($HardDisk) {
|
||||
$Datastore = $HardDisk | Get-Datastore
|
||||
$DiskGBOldValue = $HardDisk.CapacityGB
|
||||
$HardDiskIncreaseGB = $DiskGBNewValue - $DiskGBOldValue
|
||||
If ($HardDiskIncreaseGB -ge 500) {
|
||||
# manual intervention
|
||||
}
|
||||
$FreePercentBefore = ($Datastore.FreeSpaceGB) / $Datastore.CapacityGB
|
||||
$FreePercentAfter = ($Datastore.FreeSpaceGB - $HardDiskIncreaseGB) / $Datastore.CapacityGB
|
||||
|
||||
Write-Verbose -Message ("Datastore " + $Datastore.Name + " free space will lower from " + [math]::round($FreePercentBefore, 4) + " to " + [math]::round($FreePercentAfter, 4) + "") -Verbose
|
||||
Write-Verbose -Message ("Override is " + $Override)
|
||||
If ( ($FreePercentAfter -gt $FreePercentThreshold) -or ($Override -eq $true)) {
|
||||
try {
|
||||
Write-Verbose -Message ("Hard disk $DiskNum : Increasing from " + $HardDisk.CapacityGB + "GB to " + $DiskGBNewValue + "GB") -Verbose
|
||||
|
||||
$VM | Get-HardDisk -Name "Hard disk $DiskNum" | Set-HardDisk -CapacityGB $DiskGBNewValue -Confirm:$false
|
||||
$CommentsForWorkNotes += "Hard disk $DiskNum CapacityGB was modified from $DiskGBOldValue GB to $DiskGBNewValue GB. `n"
|
||||
$DiskChanged = $true
|
||||
}
|
||||
catch {
|
||||
Write-Error -Message "Disk $DiskNum expansion failed" -ErrorAction Stop
|
||||
}
|
||||
}
|
||||
Else {
|
||||
try {
|
||||
Write-Error -Message ("Hard disk $DiskNum failed. " + $FreePercentThreshold * 100 + "% free space is required for automated disk expansions. " + $Datastore.Name + " would be " + [math]::round($FreePercentAfter, 4) + ".") -ErrorAction Stop
|
||||
}
|
||||
catch {
|
||||
Write-Error -Message ("Hard disk $DiskNum failed. " + $FreePercentThreshold * 100 + "% free space is required for automated disk expansions. " + $Datastore.Name + " would be " + [math]::round($FreePercentAfter, 4) + ".") -ErrorAction Stop
|
||||
}
|
||||
}
|
||||
}
|
||||
Else {
|
||||
Write-Verbose "Hard disk $DiskNum was not found. New disk will attempt to be created." -Verbose
|
||||
# get licensing and storage format of existing disks
|
||||
$VMTag = Get-TagAssignment -Entity $VM -Category LicensingRestrictions
|
||||
If (@($VMDisks | Where-Object StorageFormat -Like "*Thick*").count -gt 0) {
|
||||
$StorageFormat = 'EagerZeroedThick'
|
||||
}
|
||||
Else {
|
||||
$StorageFormat = 'Thin'
|
||||
}
|
||||
|
||||
# if not SQL, validate available space and create if possible. if VM is SQL, stop
|
||||
If ($VMTag.Tag.Name -notlike "*SQL*") {
|
||||
# place new disk with disk 1 and validate datastore free space
|
||||
$Datastore = $VM | Get-HardDisk -Name "Hard disk 1" | Get-Datastore
|
||||
$DiskGBOldValue = 0
|
||||
$HardDiskIncreaseGB = $DiskGBNewValue - $DiskGBOldValue
|
||||
If ($HardDiskIncreaseGB -ge 500) {
|
||||
# manual intervention ?
|
||||
}
|
||||
$FreePercentBefore = ($Datastore.FreeSpaceGB) / $Datastore.CapacityGB
|
||||
$FreePercentAfter = ($Datastore.FreeSpaceGB - $HardDiskIncreaseGB) / $Datastore.CapacityGB
|
||||
|
||||
#create the disk, with decided storageformat and persistent persistence on hard disk 1 datastore
|
||||
If ($FreePercentAfter -gt $FreePercentThreshold) {
|
||||
try {
|
||||
Write-Warning -Message ("Hard disk $DiskNum : Creating new disk " + $DiskGBNewValue + " GB")
|
||||
#Write-Warning -Message ("Datastore " + $Datastore.Name + " free space will lower from " + [math]::round($FreePercentBefore,4)*100 + "% to " + [math]::round($FreePercentAfter,4)*100 + "%")
|
||||
Write-Warning -Message ("Datastore " + $Datastore.Name + " free space will lower from " + [math]::round($FreePercentBefore, 4) + " to " + [math]::round($FreePercentAfter, 4) + "")
|
||||
$VM | New-HardDisk -CapacityGB $DiskGBNewValue -StorageFormat $StorageFormat
|
||||
$CommentsForWorkNotes += "Hard disk $DiskNum was created with $DiskGBNewValue GB. "
|
||||
$DiskChanged = $true
|
||||
}
|
||||
catch {
|
||||
|
||||
}
|
||||
}
|
||||
Else {
|
||||
Write-Error -Message ("Hard disk $_ failed. " + $FreePercentThreshold * 100 + "% free space is required for automated disk expansions. " + $Datastore.Name + " would be " + [math]::round($FreePercentAfter, 4) + ".")
|
||||
$DiskChanged = $false
|
||||
$DiskError = $true
|
||||
}
|
||||
}
|
||||
Else {
|
||||
# require human review
|
||||
Write-Error -Message ($HostName + " has SQL licensing, create the new disk manually due to SQL Server best practices. Once complete, rerun to validate size and close task.") -ErrorAction Stop
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# update sctask and ritm, reassign if disk changed
|
||||
$CommentsToAdd = "VMware VM " + $VM.Name + " was modified: `n" + $CommentsForWorkNotes
|
||||
Update-ITDServiceNowRecord -ItemType 'Catalog Task' -Number $SCTaskNum -Values @{comments = $CommentsToAdd }
|
||||
Update-ITDServiceNowRecord -ItemType 'Request Item' -Number $Ritm.number.value -Values @{comments = $CommentsToAdd }
|
||||
|
||||
If ($CloseTask) {
|
||||
Update-ITDServiceNowRecord -ItemType 'Catalog Task' -Number $SCTaskNum -Values @{close_notes = $CommentsToAdd; state = "Closed Complete" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end {
|
||||
|
||||
}
|
||||
}
|
||||
+239
@@ -0,0 +1,239 @@
|
||||
function Sync-ITDVMwareVMMetadataToSharePoint {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[string[]]
|
||||
$VMName,
|
||||
|
||||
[switch]
|
||||
$SRMImplemented,
|
||||
|
||||
[switch]
|
||||
$WhatIf
|
||||
)
|
||||
|
||||
begin {
|
||||
|
||||
}
|
||||
|
||||
process {
|
||||
# validate vcenter connection
|
||||
# search for sharepoint record
|
||||
# if multiple, error
|
||||
# get VM (non-placeholder) information
|
||||
# name, cpu, memoryGB, disks, cluster, datacenter
|
||||
# compare, discover fields that are mismatched
|
||||
# if SRMImplement -eq $true, set SP record to match that
|
||||
# set sharepoint record to values pulled from vcenter
|
||||
|
||||
If ($global:DefaultVIServers) {
|
||||
|
||||
}
|
||||
Else {
|
||||
Write-Error -Message "Not connected to vCenter" -ErrorAction Stop
|
||||
}
|
||||
|
||||
Write-Verbose -Message "Get SharePoint Cluster List"
|
||||
$SharePointClusterList = Get-ITDSharePointVMClusterList
|
||||
Write-Verbose -Message "Get SharePoint Guest List"
|
||||
$SharePointVMList = Get-ITDSharePointVMGuestList
|
||||
|
||||
ForEach ($ComputerName in $VMName) {
|
||||
Write-Verbose -Message "Start $ComputerName"
|
||||
$RecordToUpdate = $SharePointVMList | Where-Object Title -EQ $ComputerName
|
||||
$VM = Get-VM -Name $ComputerName | Where-Object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" }
|
||||
switch (@($VM).count) {
|
||||
{ $_ -le 0 } {
|
||||
Write-Error -Message "No virtual machine found with name $ComputerName" -ErrorAction Stop
|
||||
}
|
||||
{ $_ -gt 1 } {
|
||||
Write-Error -Message "More than one virtual machine found with name $ComputerName" -ErrorAction Stop
|
||||
}
|
||||
{ 1 } {
|
||||
switch (@($RecordToUpdate).count) {
|
||||
{ $_ -le 0 } {
|
||||
Write-Error "SharePoint record with Title $ComputerName not found. Create the new record first." -ErrorAction Stop
|
||||
}
|
||||
{ $_ -gt 1 } {
|
||||
Write-Error "More than one SharePoint record found with Title equal to $ComputerName" -ErrorAction Stop
|
||||
}
|
||||
{ 1 } {
|
||||
# get virtual hard disks and load variables
|
||||
$VMDisks = $VM | Get-HardDisk
|
||||
$VMDisk1 = ($VMDisks | Where-Object Name -EQ "Hard Disk 1").CapacityGB
|
||||
$VMDisk2 = ($VMDisks | Where-Object Name -EQ "Hard Disk 2").CapacityGB
|
||||
$VMDisk3 = ($VMDisks | Where-Object Name -EQ "Hard Disk 3").CapacityGB
|
||||
$VMDisk4 = ($VMDisks | Where-Object Name -EQ "Hard Disk 4").CapacityGB
|
||||
$VMDisk5 = ($VMDisks | Where-Object Name -EQ "Hard Disk 5").CapacityGB
|
||||
$VMDisk6 = ($VMDisks | Where-Object Name -EQ "Hard Disk 6").CapacityGB
|
||||
$VMDisk7 = ($VMDisks | Where-Object Name -EQ "Hard Disk 7").CapacityGB
|
||||
$VMDisk8 = ($VMDisks | Where-Object Name -EQ "Hard Disk 8").CapacityGB
|
||||
$VMDisk9 = ($VMDisks | Where-Object Name -EQ "Hard Disk 9").CapacityGB
|
||||
$VMDisk10 = ($VMDisks | Where-Object Name -EQ "Hard Disk 10").CapacityGB
|
||||
$VMDisk11 = ($VMDisks | Where-Object Name -EQ "Hard Disk 11").CapacityGB
|
||||
$VMDisk12 = ($VMDisks | Where-Object Name -EQ "Hard Disk 12").CapacityGB
|
||||
$VMDisk13 = ($VMDisks | Where-Object Name -EQ "Hard Disk 13").CapacityGB
|
||||
$VMDisk14 = ($VMDisks | Where-Object Name -EQ "Hard Disk 14").CapacityGB
|
||||
$VMDisk15 = ($VMDisks | Where-Object Name -EQ "Hard Disk 15").CapacityGB
|
||||
$VMDisk16 = ($VMDisks | Where-Object { $_.Name.split(' ')[2] -notmatch '\b([1-9]|1[0-5])\b' } | Measure-Object -Sum CapacityGB).Sum
|
||||
|
||||
If ($null -eq $VMDisk1 ) { $VMDisk1 = 0 }
|
||||
If ($null -eq $VMDisk2 ) { $VMDisk2 = 0 }
|
||||
If ($null -eq $VMDisk3 ) { $VMDisk3 = 0 }
|
||||
If ($null -eq $VMDisk4 ) { $VMDisk4 = 0 }
|
||||
If ($null -eq $VMDisk5 ) { $VMDisk5 = 0 }
|
||||
If ($null -eq $VMDisk6 ) { $VMDisk6 = 0 }
|
||||
If ($null -eq $VMDisk7 ) { $VMDisk7 = 0 }
|
||||
If ($null -eq $VMDisk8 ) { $VMDisk8 = 0 }
|
||||
If ($null -eq $VMDisk9 ) { $VMDisk9 = 0 }
|
||||
If ($null -eq $VMDisk10) { $VMDisk10 = 0 }
|
||||
If ($null -eq $VMDisk11) { $VMDisk11 = 0 }
|
||||
If ($null -eq $VMDisk12) { $VMDisk12 = 0 }
|
||||
If ($null -eq $VMDisk13) { $VMDisk13 = 0 }
|
||||
If ($null -eq $VMDisk14) { $VMDisk14 = 0 }
|
||||
If ($null -eq $VMDisk15) { $VMDisk15 = 0 }
|
||||
If ($null -eq $VMDisk16) { $VMDisk16 = 0 }
|
||||
|
||||
# Get VMware Cluster
|
||||
# what vcenter says, and what it should be
|
||||
$vCenterCluster = $VM | Get-Cluster
|
||||
$vCenterSharePointClusterItem = $SharePointClusterList | Where-Object Name -EQ $vCenterCluster.Name
|
||||
# what sharepoint currently is
|
||||
$SharePointClusterFieldId = $RecordToUpdate.ClusterId
|
||||
$SharePointClusterFieldName = $SharePointClusterList | Where-Object Id -EQ $SharePointClusterFieldId
|
||||
|
||||
# Get VMware Datacenter
|
||||
$Datacenter = $VM | Get-Datacenter
|
||||
|
||||
switch ($Datacenter.Name) {
|
||||
'DCN Datacenter' { $DatacenterSharePointName = "DCN" }
|
||||
'Fargo Datacenter' { $DatacenterSharePointName = "Fargo" }
|
||||
'Grand Forks Vantis' { $DatacenterSharePointName = "Grand Forks" }
|
||||
'Primary Datacenter' { $DatacenterSharePointName = "Bismarck" }
|
||||
'Secondary Datacenter' { $DatacenterSharePointName = "Mandan" }
|
||||
'VDI Datacenter' { $DatacenterSharePointName = "VDI" }
|
||||
}
|
||||
|
||||
# one sharepoint record and one virtual machine, compare and set params
|
||||
$SetITDVMwareSharePointVMRecordParams = @{
|
||||
Title = $ComputerName;
|
||||
}
|
||||
|
||||
[string]$SpecialInstructions = ([string](Get-Date) + " - synchronization from vCenter, the following was changed: ")
|
||||
|
||||
If ($VM.NumCPU -ne $RecordToUpdate.Processors) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{CPU = $VM.NumCpu }
|
||||
$SpecialInstructions += ("CPU adjusted from " + $RecordToUpdate.Processors + " to " + $VM.NumCpu + ". ")
|
||||
}
|
||||
If ($VM.MemoryGB -ne $RecordToUpdate.RAM) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{MemoryGB = $VM.MemoryGB }
|
||||
$SpecialInstructions += ("MemoryGB adjusted from " + $RecordToUpdate.RAM + " to " + $VM.MemoryGB + ". ")
|
||||
}
|
||||
|
||||
If ($VMDisk1 -ne $RecordToUpdate.Disk_x0020_C_x003a_) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk1OS = $VMDisk1 }
|
||||
$SpecialInstructions += ("Disk1GB adjusted from " + $RecordToUpdate.Disk_x0020_C_x003a_ + " to " + $VMDisk1 + ". ")
|
||||
}
|
||||
If ($VMDisk2 -ne $RecordToUpdate.Disk2_x002d_SwapDisk) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk2Swap = $VMDisk2 }
|
||||
$SpecialInstructions += ("Disk2GB adjusted from " + $RecordToUpdate.Disk2_x002d_SwapDisk + " to " + $VMDisk2 + ". ")
|
||||
}
|
||||
If ($VMDisk3 -ne $RecordToUpdate.Disk_x0020_D_x003a_) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk3 = $VMDisk3 }
|
||||
$SpecialInstructions += ("Disk3GB adjusted from " + $RecordToUpdate.Disk_x0020_D_x003a_ + " to " + $VMDisk3 + ". ")
|
||||
}
|
||||
If ($VMDisk4 -ne $RecordToUpdate.Disk_x0020__x002d__x0020_Other) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk4 = $VMDisk4 }
|
||||
$SpecialInstructions += ("Disk4GB adjusted from " + $RecordToUpdate.Disk_x0020__x002d__x0020_Other + " to " + $VMDisk4 + ". ")
|
||||
}
|
||||
If ($VMDisk5 -ne $RecordToUpdate.Disk5) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk5 = $VMDisk5 }
|
||||
$SpecialInstructions += ("Disk5GB adjusted from " + $RecordToUpdate.Disk5 + " to " + $VMDisk5 + ". ")
|
||||
}
|
||||
If ($VMDisk6 -ne $RecordToUpdate.Disk6) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk6 = $VMDisk6 }
|
||||
$SpecialInstructions += ("Disk6GB adjusted from " + $RecordToUpdate.Disk6 + " to " + $VMDisk6 + ". ")
|
||||
}
|
||||
If ($VMDisk7 -ne $RecordToUpdate.Disk7) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk7 = $VMDisk7 }
|
||||
$SpecialInstructions += ("Disk7GB adjusted from " + $RecordToUpdate.Disk7 + " to " + $VMDisk7 + ". ")
|
||||
}
|
||||
If ($VMDisk8 -ne $RecordToUpdate.Disk8) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk8 = $VMDisk8 }
|
||||
$SpecialInstructions += ("Disk8GB adjusted from " + $RecordToUpdate.Disk8 + " to " + $VMDisk8 + ". ")
|
||||
}
|
||||
If ($VMDisk9 -ne $RecordToUpdate.Disk9) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk9 = $VMDisk9 }
|
||||
$SpecialInstructions += ("Disk9GB adjusted from " + $RecordToUpdate.Disk9 + " to " + $VMDisk9 + ". ")
|
||||
}
|
||||
If ($VMDisk10 -ne $RecordToUpdate.Disk10) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk10 = $VMDisk10 }
|
||||
$SpecialInstructions += ("Disk10GB adjusted from " + $RecordToUpdate.Disk10 + " to " + $VMDisk10 + ". ")
|
||||
}
|
||||
If ($VMDisk11 -ne $RecordToUpdate.Disk11) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk11 = $VMDisk11 }
|
||||
$SpecialInstructions += ("Disk11GB adjusted from " + $RecordToUpdate.Disk11 + " to " + $VMDisk11 + ". ")
|
||||
}
|
||||
If ($VMDisk12 -ne $RecordToUpdate.Disk12) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk12 = $VMDisk12 }
|
||||
$SpecialInstructions += ("Disk12GB adjusted from " + $RecordToUpdate.Disk12 + " to " + $VMDisk12 + ". ")
|
||||
}
|
||||
If ($VMDisk13 -ne $RecordToUpdate.Disk13) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk13 = $VMDisk13 }
|
||||
$SpecialInstructions += ("Disk13GB adjusted from " + $RecordToUpdate.Disk13 + " to " + $VMDisk13 + ". ")
|
||||
}
|
||||
If ($VMDisk14 -ne $RecordToUpdate.Disk14) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk14 = $VMDisk14 }
|
||||
$SpecialInstructions += ("Disk14GB adjusted from " + $RecordToUpdate.Disk14 + " to " + $VMDisk14 + ". ")
|
||||
}
|
||||
If ($VMDisk15 -ne $RecordToUpdate.Disk15) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk15 = $VMDisk15 }
|
||||
$SpecialInstructions += ("Disk15GB adjusted from " + $RecordToUpdate.Disk15 + " to " + $VMDisk15 + ". ")
|
||||
}
|
||||
If ($VMDisk16 -ne $RecordToUpdate.Disk16) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{Disk16 = $VMDisk16 }
|
||||
$SpecialInstructions += ("Disk16GB adjusted from " + $RecordToUpdate.Disk16 + " to " + $VMDisk16 + ". ")
|
||||
}
|
||||
|
||||
If ($vCenterCluster.Name -ne $SharePointClusterFieldName.Name) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{ClusterId = $vCenterSharePointClusterItem.Id }
|
||||
$SpecialInstructions += ("ClusterId adjusted from " + $RecordToUpdate.ClusterId + " to " + $vCenterSharePointClusterItem.Id + ". ")
|
||||
$SpecialInstructions += ("Cluster adjusted to " + $vCenterSharePointClusterItem.Name + ". ")
|
||||
}
|
||||
If ($DatacenterSharePointName -ne $RecordToUpdate.Datacenter) {
|
||||
$SetITDVMwareSharePointVMRecordParams += @{'Datacenter' = $DatacenterSharePointName }
|
||||
$SpecialInstructions += ("Datacenter adjusted from " + $RecordToUpdate.Datacenter + " to " + $DatacenterSharePointName + ". ")
|
||||
}
|
||||
|
||||
If($PSBoundParameters.ContainsKey('SRMImplemented')){
|
||||
$SetITDVMwareSharePointVMRecordParams += @{SRM_Status = 'Implemented'}
|
||||
$SpecialInstructions += ("SRM_Status set to Implemented. SRM_RecoveryVMtype set to Reserved. SRM_ConfiguredDate set to " + (Get-Date))
|
||||
}
|
||||
|
||||
$SetITDVMwareSharePointVMRecordParams += @{SpecialInstructions = $SpecialInstructions }
|
||||
|
||||
If ($WhatIf) {
|
||||
Write-Warning -Message ("The following fields in SharePoint record #" + $RecordToUpdate.ID + " for Title " + $RecordToUpdate.Title + " would be changed:")
|
||||
$SetITDVMwareSharePointVMRecordParams
|
||||
}
|
||||
Else {
|
||||
$SetITDVMwareSharePointVMRecordParams
|
||||
Set-ITDVMwareSharePointVMRecord @SetITDVMwareSharePointVMRecordParams #-Verbose
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
end {
|
||||
$postParams = [PSCustomObject]@{
|
||||
AutomationName = "Infra-VMware";
|
||||
Action = 'Change';
|
||||
Units = 3;
|
||||
Platform = 'ServiceNow-Overhead-SharePointDualEntry';
|
||||
}
|
||||
|
||||
Invoke-RestMethod -Uri http://itdnettools.nd.gov/services/automation-tracking.py -Method POST -Body ($postParams | ConvertTo-Json) | Out-Null
|
||||
}
|
||||
}
|
||||
+154
@@ -0,0 +1,154 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Sync-ITDVMwareVMTagsFromCmdb {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
|
||||
)
|
||||
|
||||
begin {
|
||||
|
||||
}
|
||||
|
||||
process {
|
||||
$GetITDServiceNowRecordParams = @{
|
||||
#Filter = "model_idLIKEVMware"
|
||||
Table = 'cmdb_ci_server';
|
||||
IncludeTotalCount = $true;
|
||||
Fields = @(
|
||||
'name',
|
||||
'fqdn',
|
||||
'environment',
|
||||
'u_nd_type',
|
||||
'model_id',
|
||||
'os',
|
||||
'os_version',
|
||||
'u_nd_application_svc',
|
||||
'u_nd_licensing_restrictions',
|
||||
'u_nd_dr_protection',
|
||||
'u_srm_recovery_type'
|
||||
)
|
||||
}
|
||||
|
||||
Write-Verbose -Message 'Retrieve all CMDB CIs'
|
||||
$AllCmdb = Get-ITDServiceNowRecord @GetITDServiceNowRecordParams
|
||||
$AllCmdbValues = $AllCmdb | Select-Object @{n = 'Name'; e = { $_.Name.display_value } },
|
||||
@{n = 'fqdn'; e = { $_.fqdn.display_value } },
|
||||
@{n = 'DTAP'; e = { $_.environment.display_value } },
|
||||
@{n = 'environment'; e = { $_.u_nd_type.display_value } },
|
||||
@{n = 'type'; e = { $_.u_nd_type.display_value } },
|
||||
@{n = 'model_id'; e = { $_.model_id.display_value } },
|
||||
@{n = 'os'; e = { $_.os.display_value } },
|
||||
@{n = 'os_version'; e = { $_.os_version.display_value } },
|
||||
@{n = 'u_nd_application_svc'; e = { $_.u_nd_application_svc.display_value } },
|
||||
@{n = 'u_nd_dr_protection'; e = { $_.u_nd_dr_protection.display_value } },
|
||||
@{n = 'u_nd_licensing_restrictions'; e = { $_.u_nd_licensing_restrictions.display_value } },
|
||||
@{n = 'u_srm_recovery_type'; e = { $_.u_srm_recovery_type.display_value } }
|
||||
|
||||
# DTAP from all unique options from the cmdb_ci_server table field name "Environment"
|
||||
Write-Verbose -Message "Start Environment Tag sync"
|
||||
$CmdbValues = ($AllCmdbValues | Select-Object -Unique DTAP | Select-Object -ExpandProperty DTAP)
|
||||
$TagValues = (Get-Tag -Category DTAP -Server itdvmvc1.nd.gov).Name
|
||||
$Compare = Compare-Object -ReferenceObject $CmdbValues -DifferenceObject $TagValues
|
||||
ForEach ($c in ($Compare | Where-Object SideIndicator -EQ '<=')) {
|
||||
Write-Verbose -Message ("Create DTAP tag for " + $c.InputObject)
|
||||
New-Tag -Category DTAP_SNow -Name $c.InputObject -Server 'itdvmvc1.nd.gov'
|
||||
}
|
||||
ForEach ($c in ($Compare | Where-Object SideIndicator -EQ '=>')) {
|
||||
Write-Verbose -Message ("Remove DTAP tag for " + $c.InputObject)
|
||||
Get-Tag -Category DTAP_SNow -Name $c.InputObject -Server 'itdvmvc1.nd.gov' | Remove-Tag -Confirm:$false
|
||||
}
|
||||
$TagValues = $null
|
||||
$Compare = $null
|
||||
Write-Verbose -Message "End Environment Tag sync"
|
||||
|
||||
# AppName, get list from ServiceNow table cmdb_ci_service
|
||||
Write-Verbose -Message "Start AppName Tag sync"
|
||||
$AllAppNames = (Get-ITDServiceNowRecord -Table 'cmdb_ci_service' -Filter "operational_status=1" -IncludeTotalCount -Fields name).name.display_value | Where-Object { $_ -like "*-*" }
|
||||
$TagValues = (Get-Tag -Category AppName -Server itdvmvc1.nd.gov).Name
|
||||
$Compare = Compare-Object -ReferenceObject $AllAppNames -DifferenceObject $TagValues
|
||||
ForEach ($c in ($Compare | Where-Object SideIndicator -EQ '<=')) {
|
||||
Write-Verbose -Message ("Create AppName tag for " + $c.InputObject)
|
||||
New-Tag -Category AppName -Name $c.InputObject -Server 'itdvmvc1.nd.gov'
|
||||
}
|
||||
ForEach ($c in ($Compare | Where-Object SideIndicator -EQ '=>')) {
|
||||
Write-Verbose -Message ("Remove AppName tag for " + $c.InputObject)
|
||||
Get-Tag -Category AppName -Name $c.InputObject -Server 'itdvmvc1.nd.gov' | Remove-Tag -Confirm:$false
|
||||
}
|
||||
$TagValues = $null
|
||||
$Compare = $null
|
||||
Write-Verbose -Message "End AppName Tag sync"
|
||||
|
||||
# Licensing Restrictions
|
||||
Write-Verbose -Message "Start Licensing Restrictions Tag sync"
|
||||
$AllLicensingRestrictions = ($AllCmdbValues | Select-Object -Unique u_nd_licensing_restrictions | Select-Object -ExpandProperty u_nd_licensing_restrictions)
|
||||
$TagValues = (Get-Tag -Category LicensingRestrictions -Server itdvmvc1.nd.gov).Name
|
||||
$Compare = Compare-Object -ReferenceObject $AllLicensingRestrictions -DifferenceObject $TagValues
|
||||
ForEach ($c in ($Compare | Where-Object SideIndicator -EQ '<=')) {
|
||||
Write-Verbose -Message ("Create AppName tag for " + $c.InputObject)
|
||||
New-Tag -Category LicensingRestrictions -Name $c.InputObject -Server 'itdvmvc1.nd.gov'
|
||||
}
|
||||
ForEach ($c in ($Compare | Where-Object SideIndicator -EQ '=>')) {
|
||||
Write-Verbose -Message ("Remove AppName tag for " + $c.InputObject)
|
||||
Get-Tag -Category LicensingRestrictions -Name $c.InputObject -Server 'itdvmvc1.nd.gov' | Remove-Tag -Confirm:$false
|
||||
}
|
||||
|
||||
$TagValues = $null
|
||||
$Compare = $null
|
||||
|
||||
# Startup Priority
|
||||
# Startup Priority is not in CMDB
|
||||
|
||||
# DR_Protection
|
||||
Write-Verbose -Message "Start DR Protection Tag sync"
|
||||
$AllDRProtection = ($AllCmdbValues | Select-Object -Unique u_nd_dr_protection | Select-Object -ExpandProperty u_nd_dr_protection) -replace "VMware: " -replace "RPO", "VR RPO" | Sort-Object
|
||||
$TagValues = (Get-Tag -Category "DR Protection" -Server itdvmvc1.nd.gov).Name
|
||||
$Compare = Compare-Object -ReferenceObject $AllDRProtection -DifferenceObject $TagValues
|
||||
ForEach ($c in ($Compare | Where-Object SideIndicator -EQ '<=')) {
|
||||
Write-Verbose -Message ("Create DR Protection tag for " + $c.InputObject)
|
||||
New-Tag -Category "DR Protection" -Name $c.InputObject -Server 'itdvmvc1.nd.gov'
|
||||
}
|
||||
ForEach ($c in ($Compare | Where-Object SideIndicator -EQ '=>')) {
|
||||
Write-Verbose -Message ("Create Protection tag for " + $c.InputObject)
|
||||
Get-Tag -Category "DR Protection" -Name $c.InputObject -Server 'itdvmvc1.nd.gov' | Remove-Tag -Confirm:$false
|
||||
}
|
||||
|
||||
$TagValues = $null
|
||||
$Compare = $null
|
||||
Write-Verbose -Message "End DR Protection Tag sync"
|
||||
|
||||
# SRM Recovery Type
|
||||
Write-Verbose -Message "Start SRM Recovery Type Tag sync"
|
||||
$AllSRMRecoveryType = ($AllCmdbValues | Select-Object -Unique u_srm_recovery_type | Select-Object -ExpandProperty u_srm_recovery_type)
|
||||
$TagValues = (Get-Tag -Category "SRM Recovery Type" -Server itdvmvc1.nd.gov).Name
|
||||
$Compare = Compare-Object -ReferenceObject $AllSRMRecoveryType -DifferenceObject $TagValues | Where-Object InputObject -NE "Placeholder"
|
||||
ForEach ($c in ($Compare | Where-Object SideIndicator -EQ '<=')) {
|
||||
Write-Verbose -Message ("Create SRM Recovery Type tag for " + $c.InputObject)
|
||||
New-Tag -Category LicensingRestrictions -Name $c.InputObject -Server 'itdvmvc1.nd.gov'
|
||||
}
|
||||
ForEach ($c in ($Compare | Where-Object SideIndicator -EQ '=>')) {
|
||||
Write-Verbose -Message ("Remove SRM Recovery Type tag for " + $c.InputObject)
|
||||
Get-Tag -Category LicensingRestrictions -Name $c.InputObject -Server 'itdvmvc1.nd.gov' | Remove-Tag -Confirm:$false
|
||||
}
|
||||
|
||||
$TagValues = $null
|
||||
$Compare = $null
|
||||
Write-Verbose -Message "End SRM Recovery Type Tag sync"
|
||||
}
|
||||
|
||||
end {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Update-ITDSNowVMTask {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[string]
|
||||
$SCTaskNum,
|
||||
|
||||
[string]
|
||||
$CommentsToAdd,
|
||||
|
||||
[switch]
|
||||
$CloseTask
|
||||
)
|
||||
|
||||
begin {
|
||||
|
||||
}
|
||||
|
||||
process {
|
||||
# get current user, SCTask, Ritm
|
||||
$assignTo = Get-ServiceNowRecord -Table 'User' -Filter @('email', '-eq', ($env:username + "@nd.gov"))
|
||||
$SCTask = Get-ServiceNowRecord -Table 'Catalog Task' -ID $SCTaskNum
|
||||
$RitmNum = $SCTask.request_item.display_value
|
||||
$Ritm = Get-ServiceNowRecord -Table 'Requested Item' -ID $RitmNum -IncludeCustomVariable
|
||||
|
||||
$Hostname = ($Ritm.CustomVariable | Where-Object Name -EQ 'server_name').Value
|
||||
|
||||
# update SCTask description and assignment for humans
|
||||
Write-Warning "$SCTaskNum assigned to $env:username"
|
||||
Update-ServiceNowRecord -ID $SCTask.number -Values @{short_description = "VMware VM modification for $HostName"; assigned_to = $assignTo.name }
|
||||
|
||||
If ($CommentsToAdd) {
|
||||
Update-ServiceNowRecord -ID $SCTask.number -Values @{comments = $CommentsToAdd } # enter comments into SCTASK
|
||||
Update-ServiceNowRecord -ID $RitmNum -Values @{comments = $CommentsToAdd } # enter comments into RITM
|
||||
}
|
||||
If ($CloseTask) {
|
||||
Update-ServiceNowRecord -ID $SCTask.number -Values @{close_notes = $CommentsToAdd; state = "Closed Complete" }
|
||||
}
|
||||
}
|
||||
|
||||
end {
|
||||
}
|
||||
}
|
||||
+169
@@ -0,0 +1,169 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
||||
.DESCRIPTION
|
||||
A longer description of the function, its purpose, common use cases, etc.
|
||||
.NOTES
|
||||
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
||||
.LINK
|
||||
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
||||
.EXAMPLE
|
||||
Test-MyTestFunction -Verbose
|
||||
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
||||
#>
|
||||
|
||||
function Update-ITDSNowVMTaskDescription {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
|
||||
)
|
||||
|
||||
begin {
|
||||
|
||||
}
|
||||
|
||||
process {
|
||||
<# Server Builds
|
||||
Write-Verbose -Message "Start Server Builds"
|
||||
$Filter = @('assignment_group', '-like', 'NDIT-Server Build Automation'), '-and', @('short_description', '-eq', 'Automated Server Build Task for Windows Virtual Machine'), '-and', @('state', '-eq', '2')
|
||||
$OpenTasks = Get-ServiceNowRecord -Table 'Catalog Task' -Filter $Filter | Sort-Object Number
|
||||
|
||||
ForEach ($OpenTask in $OpenTasks) {
|
||||
# get SCTask, Ritm
|
||||
$SCTaskNum = $OpenTask.number
|
||||
$SCTask = Get-ServiceNowRecord -Table 'Catalog Task' -ID $SCTaskNum
|
||||
$RitmNum = $SCTask.request_item.display_value
|
||||
$Ritm = Get-ServiceNowRecord -Table 'Requested Item' -ID $RitmNum -IncludeCustomVariable -WarningAction SilentlyContinue
|
||||
|
||||
$ComputerName = ($Ritm.CustomVariable | Where-Object Name -EQ host_name).Value
|
||||
$OperatingSystem = ($Ritm.CustomVariable | Where-Object Name -EQ operating_system).Value
|
||||
switch (($Ritm.CustomVariable | Where-Object Name -EQ target_platform).Value) {
|
||||
'azure' { $target_platform = "Azure" }
|
||||
'vmware' { $target_platform = "VMware" }
|
||||
}
|
||||
|
||||
# update short description
|
||||
$shortdescription = "$target_platform $OperatingSystem VM Build for $ComputerName"
|
||||
If ( ($RITM.CustomVariable | Where-Object Name -EQ dr_protection).Value -ne 'No DR') {
|
||||
$shortdescription += ", with SRM protection"
|
||||
}
|
||||
Update-ServiceNowRecord -ID $SCTask.number -Values @{short_description = $shortdescription; }
|
||||
}
|
||||
Write-Verbose -Message "End Server Builds"
|
||||
#>
|
||||
<# VM Modifications
|
||||
Write-Verbose -Message "Start VM Modifications"
|
||||
$Filter = @('assignment_group', '-like', 'NDIT-Server Build Automation'), '-and', @('short_description', '-eq', 'Upgrade/Code Deployment'), '-and', @('state', '-eq', '1')
|
||||
$OpenTasks = Get-ServiceNowRecord -Table 'Catalog Task' -Filter $Filter | Sort-Object Number
|
||||
|
||||
ForEach ($OpenTask in $OpenTasks) {
|
||||
Write-Verbose -Message "Start $OpenTask.number"
|
||||
# get SCTask, Ritm
|
||||
$SCTaskNum = $OpenTask.number
|
||||
$SCTask = Get-ServiceNowRecord -Table 'Catalog Task' -ID $SCTaskNum
|
||||
$RitmNum = $SCTask.request_item.display_value
|
||||
$Ritm = Get-ServiceNowRecord -Table 'Requested Item' -ID $RitmNum -IncludeCustomVariable
|
||||
|
||||
$ComputerName = ($Ritm.CustomVariable | Where-Object Name -EQ server_name).Value.tolower()
|
||||
|
||||
# update short description
|
||||
$shortdescription = "VM Modification for $ComputerName"
|
||||
Update-ServiceNowRecord -ID $SCTask.number -Values @{short_description = $shortdescription; }
|
||||
Write-Verbose -Message "End $OpenTask.number"
|
||||
}
|
||||
Write-Verbose -Message "End VM Modifications"
|
||||
#>
|
||||
# VM removal / retire
|
||||
Write-Verbose -Message "Start Remove Server description updates"
|
||||
#$Filter = @('assignment_group', '-like', 'NDIT-Server Build Automation'), '-and', @('short_description', '-like', 'Retire Server'), '-and', @('state', '-eq', '1')
|
||||
$Filter = "active=true^short_descriptionSTARTSWITHRemove Server: "
|
||||
#$OpenTasks = Get-ServiceNowRecord -Table 'Catalog Task' -Filter $Filter | Sort-Object Number
|
||||
$OpenTasks = Get-ITDServiceNowRecord -ItemType 'Catalog Task' -Filter $Filter -IncludeTotalCount | Sort-Object Number
|
||||
$AllRitms = [System.Collections.ArrayList]@()
|
||||
|
||||
ForEach ($OpenTask in $OpenTasks) {
|
||||
Write-Verbose -Message ("Start " + $OpenTask.number)
|
||||
# get SCTask, Ritm
|
||||
$SCTaskNum = $OpenTask.number.value
|
||||
$SCTask = $OpenTask
|
||||
If ($AllRitms | Where-Object sys_id -EQ $SCTask.request_item.value) {
|
||||
$Ritm = $AllRitms | Where-Object sys_id -EQ $SCTask.request_item.display_value
|
||||
}
|
||||
Else {
|
||||
$Ritm = Get-ITDServiceNowRecord -ItemType 'Request Item' -Number $SCTask.request_item.display_value -IncludeVariableSet
|
||||
$null = $AllRitms.Add($Ritm)
|
||||
}
|
||||
|
||||
$short_description_hostname = $SCTask.short_description.display_value.split(' ')[2]
|
||||
$Ci = Get-ITDServiceNowRecord -Table cmdb_ci -Filter ("name=" + $short_description_hostname)
|
||||
|
||||
$HostName = $Ci.Name.display_value
|
||||
$FQDN = $Ci.FQDN.display_value
|
||||
|
||||
# determine if vmware, azure, or physical
|
||||
switch ($Ci.model_id.display_value) {
|
||||
{ $_ -like "*VMware*" } { $hardware_platform = "VMware"; $hardware_type = 'Virtual Machine' }
|
||||
{ $_ -like "*Microsoft Virtual Machine*" } { $hardware_platform = "Azure"; $hardware_type = 'Virtual Machine' }
|
||||
{ $_ -like "*HP*" } { $hardware_platform = 'HPE'; $hardware_type = 'Physical' }
|
||||
default { $hardware_platform = 'Unknown'; $hardware_type = 'Other' }
|
||||
}
|
||||
|
||||
# determine if windows, rhel, or other
|
||||
switch ($Ci.sys_class_name.display_value) {
|
||||
'Linux Server' { $OS = 'Linux' }
|
||||
'Windows Server' { $OS = 'Windows' }
|
||||
'Default' { $OS = 'Other' }
|
||||
}
|
||||
|
||||
$short_description_new = "$hardware_platform $OS Removal for "
|
||||
If ($FQDN) {
|
||||
$short_description_new += $FQDN
|
||||
}
|
||||
Else {
|
||||
$short_description_new += $ComputerName
|
||||
}
|
||||
#Update-ServiceNowRecord -ID $SCTask.number -Values @{short_description = $shortdescription; }
|
||||
Update-ITDServiceNowRecord -ItemType 'Catalog Task' -Number $SCTaskNum -Values @{short_description = $short_description_new}
|
||||
Write-Verbose -Message ("End " + $OpenTask.number.display_value)
|
||||
}
|
||||
Write-Verbose -Message "End VM removal/retire"
|
||||
|
||||
<# Other Server Requests
|
||||
Write-Verbose -Message "Start Other Server"
|
||||
$Filter = @('assignment_group', '-like', 'NDIT-Server Build Automation'), '-and', @('short_description', '-eq', 'Other Server Request'), '-and', @('state', '-eq', '1')
|
||||
$OpenTasks = Get-ServiceNowRecord -Table 'Catalog Task' -Filter $Filter | Sort-Object Number
|
||||
|
||||
ForEach ($OpenTask in $OpenTasks) {
|
||||
Write-Verbose -Message "Start $OpenTask.number"
|
||||
# get SCTask, Ritm
|
||||
$SCTaskNum = $OpenTask.number
|
||||
$SCTask = Get-ServiceNowRecord -Table 'Catalog Task' -ID $SCTaskNum
|
||||
$RitmNum = $SCTask.request_item.display_value
|
||||
$Ritm = Get-ServiceNowRecord -Table 'Requested Item' -ID $RitmNum -IncludeCustomVariable
|
||||
|
||||
$ComputerName = ($Ritm.CustomVariable | Where-Object Name -EQ server_name).Value
|
||||
$OperatingSystem = ($Ritm.CustomVariable | Where-Object Name -EQ operating_system).Value
|
||||
|
||||
# update short description
|
||||
$shortdescription = "Other Server Request for $ComputerName"
|
||||
Update-ServiceNowRecord -ID $SCTask.number -Values @{short_description = $shortdescription; }
|
||||
Write-Verbose -Message "End $OpenTask.number"
|
||||
}
|
||||
Write-Verbose -Message "End Other Server"
|
||||
#>
|
||||
}
|
||||
|
||||
end {
|
||||
<#
|
||||
$postParams = [PSCustomObject]@{
|
||||
AutomationName = "Infra-VMware";
|
||||
Action = 'Change';
|
||||
Units = 3;
|
||||
Platform = 'ServiceNow-Overhead';
|
||||
}
|
||||
|
||||
Invoke-RestMethod -Uri http://itdnettools.nd.gov/services/automation-tracking.py -Method POST -Body ($postParams | ConvertTo-Json)
|
||||
#>
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
# Introduction
|
||||
TODO: Give a short introduction of your project. Let this section explain the objectives or the motivation behind this project.
|
||||
|
||||
# Getting Started
|
||||
TODO: Guide users through getting your code up and running on their own system. In this section you can talk about:
|
||||
1. Installation process
|
||||
2. Software dependencies
|
||||
3. Latest releases
|
||||
4. API references
|
||||
|
||||
# Build and Test
|
||||
TODO: Describe and show how to build your code and run the tests.
|
||||
|
||||
# Contribute
|
||||
TODO: Explain how other users and developers can contribute to make your code better.
|
||||
|
||||
If you want to learn more about creating good readme files then refer the following [guidelines](https://docs.microsoft.com/en-us/azure/devops/repos/git/create-a-readme?view=azure-devops). You can also seek inspiration from the below readme files:
|
||||
- [ASP.NET Core](https://github.com/aspnet/Home)
|
||||
- [Visual Studio Code](https://github.com/Microsoft/vscode)
|
||||
- [Chakra Core](https://github.com/Microsoft/ChakraCore)
|
||||
@@ -0,0 +1,12 @@
|
||||
CREATE TABLE Infra_VMware_VirtualMachine_VMSnapshots_NPD (
|
||||
ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
|
||||
VMName varchar(255) NOT NULL,
|
||||
DateTime DateTime NOT NULL,
|
||||
RequestedBy varchar(255) NOT NULL,
|
||||
DurationHours int NOT NULL,
|
||||
Status varchar(255) NOT NULL,
|
||||
NotifyEmail varchar(255),
|
||||
TakenDateTime DateTime,
|
||||
ExpireDateTime DateTime,
|
||||
DeleteDateTime DateTime
|
||||
)
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
New-ServiceNowSession -Url 'northdakota.service-now.com' -Credential $Secret:SNowVMCred -WarningAction SilentlyContinue
|
||||
Update-ITDSNowVMTaskDescription -Verbose
|
||||
Reference in New Issue
Block a user