Merge pull request #230 from doogleit/feature/set-tagsinguestinfo
Sample script to set VM tags in the guestinfo
This commit is contained in:
98
Scripts/Set-TagsInGuestinfo.ps1
Normal file
98
Scripts/Set-TagsInGuestinfo.ps1
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
<#
|
||||||
|
.NOTES
|
||||||
|
Script name: Set-TagsInGuestinfo.ps1
|
||||||
|
Created on: 10/02/2018
|
||||||
|
Author: Doug Taliaferro, @virtually_doug
|
||||||
|
Description: Gets the vSphere Tags assigned to a VM and makes them available to the guest OS.
|
||||||
|
Dependencies: None known
|
||||||
|
|
||||||
|
===Tested Against Environment====
|
||||||
|
vSphere Version: 6.5
|
||||||
|
PowerCLI Version: 10.0.0.7893909
|
||||||
|
PowerShell Version: 5.1.14409.1005
|
||||||
|
OS Version: Windows 7, 10
|
||||||
|
Keyword: VM, Tags, Guestinfo
|
||||||
|
|
||||||
|
.SYNOPSIS
|
||||||
|
Gets the vSphere Tags assigned to a VM and makes them available to the guest OS.
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
Gets the tags assigned to one or more VMs from one or more categories and sets the tag values
|
||||||
|
in the VM's 'guestinfo' advanced settings. This makes the tags available within the guest OS
|
||||||
|
using VM tools (vmtoolsd.exe) and allows the tags to be used as metadata for applications or
|
||||||
|
management agents that run inside the guest.
|
||||||
|
|
||||||
|
For example, if a VM has a tag named 'Accounting' from the
|
||||||
|
category 'Departments', the advanced setting becomes:
|
||||||
|
guestinfo.Departments = Accounting
|
||||||
|
|
||||||
|
This can be retrieved in the guest OS by running:
|
||||||
|
vmtoolsd.exe --cmd "info-get guestinfo.Departments"
|
||||||
|
|
||||||
|
If multiple tags are assigned from the same category, they are joined using the specified
|
||||||
|
delimter (a semicolon by default):
|
||||||
|
guestinfo.Departments = Accounting;Sales
|
||||||
|
|
||||||
|
.PARAMETER VMs
|
||||||
|
One or more VMs returned from the Get-VM cmdlet.
|
||||||
|
|
||||||
|
.PARAMETER Categories
|
||||||
|
The names of tag categories that should be set in the advanced settings.
|
||||||
|
|
||||||
|
.PARAMETER Delimiter
|
||||||
|
The delimiting character used for multiple tags of the same category. Defaults to a
|
||||||
|
semicolon.
|
||||||
|
|
||||||
|
.PARAMETER vCenter
|
||||||
|
The vCenter server to connect to. Optional if you are already connected.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
.\Set-TagsInGuestInfo.ps1 -VM (get-vm testvm01) -Categories Departments, Environment
|
||||||
|
|
||||||
|
Gets tags assigned to 'testvm01' in the Departments and Environment categories and
|
||||||
|
sets their values in 'guestinfo.Departments' and 'guestinfo.Environment'.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
.\Set-TagsInGuestInfo.ps1 -VM (get-cluster Dev-01 | get-vm) -Categories Departments
|
||||||
|
|
||||||
|
Gets tags assigned to all VMs in the Dev-01 cluster and sets 'guestinfo.Departments'
|
||||||
|
on each VM.
|
||||||
|
#>
|
||||||
|
#Requires -modules VMware.VimAutomation.Core
|
||||||
|
[CmdletBinding()]
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory=$true,Position=0)]
|
||||||
|
$VMs,
|
||||||
|
[Parameter(Mandatory=$true,Position=1)]
|
||||||
|
[string[]]$Categories,
|
||||||
|
[string]$Delimiter = ';',
|
||||||
|
[string]$vCenter
|
||||||
|
)
|
||||||
|
if ($vCenter) {
|
||||||
|
Connect-VIServer $vCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
ForEach ($categoryName in $Categories) {
|
||||||
|
$category = Get-TagCategory -Name $categoryName
|
||||||
|
if ($category) {
|
||||||
|
$guestinfoName = "guestinfo.$category"
|
||||||
|
|
||||||
|
# Get Tag assignments for the VMs
|
||||||
|
$tags = Get-TagAssignment -Entity $VMs -Category $category
|
||||||
|
|
||||||
|
# Group the tags by VM (in this case the Entity property of Group-Object)
|
||||||
|
$groups = $tags | Group-Object -Property Entity
|
||||||
|
|
||||||
|
# Get each VM and set the guestinfo
|
||||||
|
ForEach ($item in $groups) {
|
||||||
|
$vm = get-vm $item.Name
|
||||||
|
# Multiple tags of the same category are joined
|
||||||
|
$guestinfoValue = $item.Group.Tag.Name -join $Delimiter
|
||||||
|
|
||||||
|
Write-Host "$($vm): setting '$guestinfoName' = '$guestinfoValue'"
|
||||||
|
New-AdvancedSetting -Entity $vm -Name $guestinfoName -Value $guestinfoValue -Confirm:$false -Force | Out-Null
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host "Category '$categoryName' was not found."
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user