vCheck es un script de PowerShell / PowerCLI publicado por Alan Renouf (más concretamente un conjunto de scripts que casi se puede describir como un framework) que permite obtener de una forma muy sencilla un informe en el que se muestra el estado de una infraestructura. Aunque inicialmente se creo como un script pensado en una infraestructura de VMware, hay distintas versiones para otros productos (Exchange, SCVMM…)
El diseño de este script, permite añadir nuevas secciones al informe generado a través de lo que se llaman plugins, que son scripts cuyo contenido de salida es añadido al informa.
Esos plugins pueden generar distintos tipos de información, aunque la principal y que más se utiliza son las tablas de datos. Desde la versión 6.21 también soporta la opción de que los plugins generen gráficos (charts). En ocasiones puede ser interesante tener los datos de una forma más visual que una tabla así que vamos a ver como crear un plugin para vCheck que genere un gráfico en el informe.
Lo primero es entender de forma resumida, que tipos de plugin podemos crear. Los plugins pueden generar 3 tipos de datos:
- List
- Table
- Chart
Podemos ver un ejemplo de la información que muestra cada uno de los tipos de plugins:
Tipo | Ejemplo |
List | ![]() |
Table | ![]() |
Chart | ![]() |
Como vemos la diferencia entre la información mostrada en el tipo List y la de tipo Table es pequeña, pero la de tipo Chart si que nos permite ver de forma más visual la información generada por el plugin.
No he visto publicado ningún plugin que muestre la informacion en tipo chart, así que vamos a ver los sencillos pasos para crear uno.
Lo primero es saber que tiene que devolver el plugin.
El plugin tiene que devolver un objeto creado con la función New-Chart, cuya definición en el archivo vCheck.ps1 es la siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<# Create a new Chert object, this will get fed back down the output stream as part of plugin processing. This allows us to keep the same interface for plugins content #> function New-Chart { param ( [int]$height, [int]$width, [Parameter(Mandatory=$true)] [Hashtable[]]$data, [string]$title, [string]$titleX, [string]$titleY, [ValidateSet("Area", "Bar", "BoxPlot", "Bubble", "Candlestick", "Column", "Doughnut", "ErrorBar", "FastLine", "FastPoint", "Funnel", "Kagi", "Line", "Pie", "Point", "PointAndFigure", "Polar", "Pyramid", "Radar", "Range", "RangeBar", "RangeColumn", "Renko", "Spline", "SplineArea", "SplineRange", "StackedArea", "StackedArea100", "StackedBar", "StackedBar100", "StackedColumn", "StackedColumn100", "StepLine", "Stock", "ThreeLineBreak")] $ChartType="bar" ) # If chartsize is specified in style, use it unless explicitly set if ($ChartSize -and (-not $height -and -not $width)) { if ($ChartSize -match "(\d+)x(\d+)") { $height = $Matches[1] $width = $Matches[2] } } # if size not set in style or function call, default to 400x400 (maybe make this a globalVariable?) if (-not $ChartSize -and (-not $height -and -not $width)) { $height = 400 $width = 400 } return New-Object PSObject -Property @{"height" = $height; "width" = $width; "data" = $data; "title" = $title; "titleX" = $titleX; "titleY" = $titleY; "ChartType" = $ChartType } } |
Por esto, en nuestro archivo del plugin añadiremos la siguiente línea de código:
1 |
New-Chart -height $height -width $width -data $datos -title "Sistemas Operativos" -titleX "Sistema Operativo" -titleY "Número de Máquinas" -ChartType "Bar" |
Vamos a ir viendo cada uno de los parámetros (son los mismos datos que hemos ido viendo en anteriores entradas para ver como se utilizan gráficos en PowerShell):
- height: indica el tamaño en altura de la imagen que se va a generar
- width: indica el tamaño de ancho de la imagen que se va a generar
- title: es el título del gráfico
- titleX: es el texto indicado en el eje X
- titleY: es el texto indicado en el eje Y
- ChartType: es el tipo de gráfico de Microsoft Chart Control (Bar, Column, Area, Pie…)
- data: contiene la información de los datos a mostrar
Vamos a centrarnos en este último parámetro, ya que es el que creo más importa
En el parámetro data tenemos que indicar un objeto de tipo Hashtable que contiene la información de los datos a mostrar. Como normalmente solemos trabajar con datos de tipo Table, lo que he hecho es crear en unas sencillas líneas de código la conversión a un objeto de tipo Hashtable, como se puede ver a continuación:
1 2 3 4 5 6 7 |
$SO_maquinas = $FullVM.Config.GuestFullName | Group | Sort-Object Count | Select Count, Name $output = @{}; foreach ($myPsObject in $SO_maquinas) { $output.Add($myPsObject.Name,$myPsObject.Count) } $datos = $output |
El objeto $SO_maquinas es una tabla con la información de los sistemas operativos y el número de máquinas asociadas a cada uno de ellos. Creo un nuevo objeto $output de tipo Hashtable y voy añadiendo los distintos elementos de $SO_maquinas
De esta forma, un ejemplo básico de un plugin completo que genera el número de máquinas virtuales por cada sistema operativo sería el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# Start of Settings # End of Settings # Número de máquinas por Sistema Operativo $SO_maquinas = $FullVM.Config.GuestFullName | Group | Sort-Object Count | Select Count, Name $output = @{}; foreach ($myPsObject in $SO_maquinas) { $output.Add($myPsObject.Name,$myPsObject.Count) } $datos = $output $height = 800 $width =800 New-Chart -height $height -width $width -data $datos -title "Sistemas Operativos" -titleX "Sistema Operativo" -titleY "Número de Máquinas" -ChartType "Bar" $Title = "Número de máquinas por sistema operativo - Chart" $Header = "Número de máquinas por sistema operativo - Chart" $Comments = "Este es el número de máquinas virtuales de cada sistema operativo en la infraestructura" $Display = "Chart" $Author = "Roberto Orayen" $Version = 0.1 $PluginCategory = "vSphere" |
Y así es como se vería el gráfico en el informe generado