This commit is contained in:
Zack Meier
2026-04-15 15:45:50 -05:00
commit 1d304511b8
613 changed files with 140998 additions and 0 deletions
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
}
@@ -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)
}
@@ -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 $_ }
@@ -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>
@@ -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 = ''
}
@@ -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 {
}
}
@@ -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 {
}
}
@@ -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
}
}
@@ -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
}
}
@@ -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
}
}
@@ -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 {
}
}
@@ -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 {
}
}
@@ -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 {
}
}
@@ -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 {
}
}
@@ -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 {
}
}
@@ -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 {
}
}
@@ -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 {
}
}
@@ -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
}
}
@@ -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 {
}
}
@@ -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
)
@@ -0,0 +1,2 @@
New-ServiceNowSession -Url 'northdakota.service-now.com' -Credential $Secret:SNowVMCred -WarningAction SilentlyContinue
Update-ITDSNowVMTaskDescription -Verbose