Script para reportear estado de la configuración de vSphere

Esto es mas como un trabajo en progreso, tengo meses tratando de darme el tiempo para generar un script que me ayude con la información necesaria para hacer la “memoria técnica” de una implementación, porque odio documentar, pero es parte del trabajo, así que…

Este script arroja la info de como está la configuración de red, datastores, VMs. Se que le hace falta info y pulir las salidas, pero lo voy a ir actualizando. Crea varios TXT que se van depositando en una carpeta que lleva como nombre el día que se ejecuta el script.

Está diseñado para que la salida sea como “lista”, pero se puede configurar para que sea una tabla. También con unas pequeñas modificaciones se pueden exportar como csv o como HTML.

La idea también es poder programar la ejecución del script para poder tener a la mano la información actualizada de la configuración de vSphere, y en caso de tener que hacer troubleshooting no tener que recurrir a esa “memoria técnica” en físico y que ya se encuentra desactualizada ¡¡porque se hizo hace años!!

Déjenme un comentario si lo quieren probar y tiene dudas de como echarlo a volar o ideas para mejorarlo 🙂


## Script que genera CSV con informacion de la configuracion de distintos elementos en una
## instalacion de vSphere (5.1/5.5). Pensada en que corra al terminar una instalacion o con
## cierta frecuencia para mantener actualizada la informacion del entorno vSphere.
## Archivos CSV que va a generar el reporte
## -> Reporte de VMs
## -> Reporte de discos virtuales y configuracion
## -> Configuracion de politicas en PortGroups
## -> Configuracion de red en PortGroups
## -> IP y funcionalidades en PortGroups
## -> Datastores VMFS
## -> Datastores NFS
## -> Configuracion host ESXi
## -> Licencias hosts ESXi
## -> Cluster
## -> HostId de los ESXi
## Completar con la informacion de vCenter Server!!
$vCenter = "IP_de_vCenter_Server"
$user = "Usuario_con_derechos_de_administrador_de_vCenter"
$password = "contraseña_usuario_administrador"
## Variables que utizaremos mas tarde
$ok = "Si"
$noresp = "No"
$na ="N/A"
$on = "Encendida"
$off = "Apagada"
$running = "Running"
$current = "guestToolsCurrent"
$unmanaged = "guestToolsUnmanaged"
$noact = "No Actualizado"
$date = Get-Date
$foldername = Get-Date -Format yyMMdd
## Crea el directorio donde se depositaran los TXT
Set-Location -path c:\temp
md -Name $foldername
## Credenciales de vCenter y PS Snapin
Add-PSSnapin -name VMware.VimAutomation.Core
Connect-VIServer -Server $vCenter -User $user -Password $password
## Reporte de VMs
Get-VMHost -Name * | Get-VM |
Select @{Name="VM";E={$_.name}},
@{Name="Nombre DNS";E={$_.guest.hostname}},
@{Name="IP";E={$_.guest.ipaddress[0]}},
@{Name="vCPU";E={$_.numcpu}},
@{Name="Memoria (GB)";E={$_.memorygb}},
@{Name="VMware Tools";E={ if (($_.guest.ExtensionData.Toolsversionstatus -eq $current) -or ($_.guest.ExtensionData.Toolsversionstatus -eq $unmanaged)) { $ok } else { $noact }}},
@{Name="Sistema Operativo";E={$_.ExtensionData.Summary.config.guestfullname}},
@{Name="Estado";E={ if ($_.guest.state -eq $running) { $on } else { $off }}} | Export-Csv c:\temp\$foldername\VMs.csv
Add-Content c:\temp\$foldername\VMs.csv "`r`nReporte generado: $date"
## Reporte de discos virtuales y configuracion
Get-VM * | Get-HardDisk |
Select @{Name="VM";Expression={$_.Parent}},
@{Name="Disco";Expression={$_.name}},
@{Name="Capacidad GB";Expression={"{0:N1}" -f $_.CapacityGB}},
@{Name="Formato";Expression={if ($_.StorageFormat -eq 'Thin') { "Thin" } else { "Thick" }}},
@{Name="RDM";Expression={if ($_.ExtensionData.backing.LunUuid -ne $null) { "Si" } else { "No" }}},
@{Name="Independiente";Expression={if ($_.Persistence -eq 'Persistent') { "No" } else { "Si" }}},
@{Name="Persistente";Expression={if ($_.Persistence -eq 'IndependentPersistent' -or 'Persistent') { "Si" } else { "No" }}},
@{Name="Datastore";Expression={$_.FileName.Split(']')[0].TrimStart('[')}},
@{Name="Folder/VMDK";Expression={$_.filename.Split(']')[1]}} | Export-Csv c:\temp\$foldername\discos.csv
Add-Content c:\temp\$foldername\discos.csv "`r`nReporte generado: $date"
## Configuracion de politicas en PortGroups
Get-VMHost * | Get-VirtualPortGroup |
Select @{Name="Portgroup";E={$_.name}},
@{Name="Promiscuous Mode";E={$_.ExtensionData.ComputedPolicy.security.allowpromiscuous}},
@{Name="Mac Address Changes";E={$_.ExtensionData.ComputedPolicy.security.MacChanges}},
@{Name="Forged Transmits";E={$_.ExtensionData.ComputedPolicy.security.ForgedTransmits}},
@{Name="Host";E={$_.vmhostid}} | Export-Csv c:\temp\$foldername\politicas-sw.csv
Add-Content c:\temp\$foldername\politicas-sw.csv "`r`nReporte generado: $date"
## Configuracion de red en PortGroups
Get-VMHost * | Get-VirtualPortGroup |
Select @{Name="Portgroup";E={$_.name}},
@{Name="Active NIC";E={$_.ExtensionData.ComputedPolicy.nicteaming.nicorder.activenic}},
@{Name="Standby NIC";E={$_.ExtensionData.ComputedPolicy.nicteaming.nicorder.StandbyNic}},
@{Name="Balance Protocol";E={$_.ExtensionData.ComputedPolicy.nicteaming.Policy}},
@{Name="Failback";E={$_.ExtensionData.ComputedPolicy.nicteaming.ReversePolicy}},
@{Name="Notify switch";E={$_.ExtensionData.ComputedPolicy.nicteaming.NotifySwitches}},
@{Name="VLAN";E={$_.VLanId}},
@{Name="Host";E={$_.vmhostid}} | Export-Csv c:\temp\$foldername\conf-PG.csv
Add-Content c:\temp\$foldername\conf-PG.csv "`r`nReporte generado: $date"
## IP y funcionalidades en PortGroups
Get-VMHost * | Get-VMHostNetworkadapter | Where {$_.Name -like "vmk*"} |
Select @{Name="Portgroup";E={$_.PortGroupName}},
@{Name="IP";E={$_.IP}},
@{Name="Netmask";E={$_.SubnetMask}},
@{Name="Management";E={$_.ManagementTrafficEnabled}},
@{Name="vMotion";E={$_.VMotionEnabled}},
@{Name="Fault Tolerance";E={$_.FaultToleranceLoggingEnabled}},
@{Name="Host";E={$_.vmhostid}} | Export-Csv c:\temp\$foldername\conf-IP-vmkernel.csv
Add-Content c:\temp\$foldername\conf-IP-vmkernel.csv "`r`nReporte generado: $date"
## Datastores VMFS
Get-Datastore | where{$_.Type -eq "VMFS"} |
Select @{Name="Datastore";E={$_.Name}},
@{Name="Capacity (GB)";E={$_.capacityGB}},
@{Name="Type";E={$_.Type}},
@{Name="Version";E={$_.FileSystemVersion}},
@{Name="Canonical Name";E={(Get-ScsiLun -datastore $_ | Select -First 1).canonicalname}},
@{Name="URL (Folder)";E={$_.ExtensionData.Summary.Url}},
@{Name="Hosts conectados";E={$_.ExtensionData.Host.Key}}| Export-Csv c:\temp\$foldername\datastores-VMFS.csv
Add-Content c:\temp\$foldername\datastores-VMFS.csv "`r`nReporte generado: $date"
## Datastores NFS
Get-Datastore | where{$_.Type -eq "NFS"} |
Select @{Name="Datastore";E={$_.Name}},
@{Name="Capacity (GB)";E={$_.capacityGB}},
@{Name="Type";E={$_.Type}},
@{Name="NFS Server";E={$_.RemoteHost}},
@{Name="Folder";E={$_.RemotePath}},
@{Name="Hosts conectados";E={$_.ExtensionData.Host.Key}} | Export-Csv c:\temp\$foldername\datastores-NFS.csv
Add-Content c:\temp\$foldername\datastores-NFS.csv "`r`nReporte generado: $date"
## Configuracion host ESXi
Get-VMHost |
Select @{Name="Name";E={$_.Name}},
@{Name="Model";E={$_.Model}},
@{Name="Processor Model";E={$_.ProcessorType}},
@{Name="Cores";E={$_.NumCpu}},
@{Name="Sockets";E={$_.extensiondata.hardware.cpuinfo.numcpupackages}},
@{Name="Total cores";E={$_.ExtensionData.Hardware.CpuInfo.NumCpuCores}},
@{Name="Memory";E={$_.MemoryTotalGB}},
@{Name="Version ESXi";E={$_.Version}},
@{Name="Build";E={$_.Build}} | Export-Csv c:\temp\$foldername\hosts.csv
Add-Content c:\temp\$foldername\hosts.csv "`r`nReporte generado: $date"
## Licencias hosts ESXi
Get-VMHost |
Select @{Name="Name";E={$_.Name}},
@{Name="License Key";E={$_.LicenseKey}} | Export-Csv c:\temp\$foldername\licencias-esx.csv
Add-Content c:\temp\$foldername\licencias-esx.csv "`r`nReporte generado: $date"
## Cluster
Get-Cluster |
Select @{Name="Name";E={$_.Name}},
@{Name="HA Enabled";E={$_.HAEnabled}},
@{Name="DRS Enabled";E={$_.DRSEnabled}} | Export-Csv c:\temp\$foldername\cluster.csv
Add-Content c:\temp\$foldername\cluster.csv "`r`nReporte generado: $date"
## HostId de los ESXi
Get-VMHost | Select Name,Id | Export-Csv c:\temp\$foldername\vmhostId.csv
## Desconectar sesion de vCenter Server
Disconnect-VIServer -Server $vCenter -Force -Confirm:$false

Respaldos automáticos de instancias de EC2 en Amazon AWS

Hasta donde sé, Amazon no tiene un método para programar respaldos automáticos de sus instancias en EC2, así que hice un pequeño script de PowerShell que me permite programar respaldos de un server, específicamente de volúmenes EBS (Elastic Block Storage).

La lógica del script es identificar todos los discos de la instancia, el script supone que tiene solo un disco, pero se puede modificar facilmente para encontrar y respaldar todos en caso de existir mas de uno.

Teniendo el disco, sacamos su “volume ID” y generamos el snapshot. Una cosa interesante del Cmdlet con el que hacemos el snapshot es que podemos ponerle una descripción, para este caso estoy incluyendo la fecha, la hora y el nombre de la instancia, pero podemos ponerle lo que queramos.

Otra cosa que hace el script es que mantiene solo un determinado número de puntos de restauración, en este caso estoy dejando únicamente 7 días. Recordemos que AWS cobra por GB, así que hay que cuidar los centavos 🙂

$nombre = "Mi_Instancia"
$instancia = Get-EC2Instance | select -expandproperty RunningInstance | ? {$_.Tag.Key -eq "Name" -and $_.Tag.Value -eq $nombre}
$id = $instancia.InstanceId
$disco = Get-EC2Volume | Where-Object {$_.Attachment.InstanceId -eq $id}
$fecha = Get-Date -Format "yyMMdd-HHmm"
$descripcion = "backup-$fecha-$nombre"

# Snapshots a mi !!
New-EC2Snapshot -VolumeId $disco.VolumeId -Description $descripcion

# Elimina el Snapshot que tienen mas de 7 días (Bueno, mas de 165 horas, o 6 días + 21 horas)
$7dias = (Get-Date).addhours(-165)
$oldsnapshot = Get-EC2Snapshot | ? {$_.VolumeId -eq $disco.VolumeId -and $_.StartTime -lt $7dias}
Remove-EC2Snapshot -SnapshotId $oldsnapshot.SnapshotId -Force

La manera en la que se programa la ejecución del script de respaldo es utilizando Task Scheduler de Windows, así puede ejecutarse con la frecuencia que queramos.

Si queremos ver todos los snapshots que tiene la instancia ejecutamos esta línea…

 Get-EC2Snapshot | ? {$_.VolumeId -eq $disco.VolumeId} | select description, starttime, state | ft

Algo así …

Captura_de_pantalla_2015-03-07_a_las_21_08_35

Espero lo encuentren útil, y si necesitan ayuda para customizar el script porfavor sólo déjenme un mensaje. Sería un gusto.

Referencias:
AWS Tools para PowerShell http://docs.aws.amazon.com/powershell/latest/reference/Index.html

Throughput, IOPS y proporción Reads/Writes de discos virtuales.

Hora de trabajar un poco con Get-Stat, en esta ocasión para generar un script que nos muestre las estadísticas sobre la demanda de trafico en KBps, latencia e IOPS de los discos virtuales de nuestras VMs. Para ponerle un poco de peligro, le incluí ciertos parámetros para que sólo arroje datos de la operación durante “horario de oficina”, esto con el objetivo de excluír datos de periodos de tiempo donde sabemos que no hay usuarios activos o procesos ejecutándose.

La idea del script es que corra el fin de semana y muestre información de la demanda de recursos que tuvieron los discos virtuales durante la semana. Pero se puede editar para mostrar el periodo de tiempo que queramos.

Las columnas que arroja son el tráfico en KBps generado por los discos virtuales (throughput), latencia en milisegundos, cantidad de I/O por segundo y la proporción de Reads/Writes. Conocer la proporción de I/O de lectura y de escritura nos puede ayudar a diseñar y tomar mejores decisiones sobre el tipo de discos virtuales y especificaciones que debe tener el storage donde van a residir los discos de nuestras máquinas virtuales.

## Horario inicio de operaciones ##
$abre = get-date -hour 8 -minute 0 -second 0

## Horarios cierre de operaciones ##
$cierre = get-date -hour 16 -minute 0 -second 0

## Horario inicio de operaciones ##
$abre = get-date -hour 8 -minute 0 -second 0
## Horarios cierre de operaciones ##
$cierre = get-date -hour 16 -minute 0 -second 0

$IOarray = Get-VM $MisVMs | Where {$_.PowerState -eq "PoweredOn"} | select name,
@{N="IORead";E={[Math]::Round((($_ |Get-Stat -Stat virtualDisk.numberReadAveraged.average -Start $abre.adddays(-5) -finish $cierre.adddays(-1) |Measure-Object Value -Average).Average),2)}},
@{N="IOWrite";E={[Math]::Round((($_ |Get-Stat -Stat virtualDisk.numberWriteAveraged.average -Start $abre.adddays(-5) -finish $cierre.adddays(-1) |Measure-Object Value -Average).Average),2)}},
@{N="LatRead";E={[Math]::Round((($_ |Get-Stat -Stat virtualDisk.totalReadLatency.average -Start $abre.adddays(-5) -finish $cierre.adddays(-1) |Measure-Object Value -Average).Average),2)}},
@{N="LatWrite";E={[Math]::Round((($_ |Get-Stat -Stat virtualDisk.totalWriteLatency.average -Start $abre.adddays(-5) -finish $cierre.adddays(-1) |Measure-Object Value -Average).Average),2)}},
@{N="Throughput";E={[Math]::Round((($_ |Get-Stat -Stat disk.usage.average -Start $abre.adddays(-5) -finish $cierre.adddays(-1) |Measure-Object Value -Average).Average),2)}}

$IOarray = $IOarray | Select name,IORead,IOWrite,Throughput,
@{Name="IOPS";Expression={($_.IORead + $_.IOWrite)}},
@{Name="Latencia";Expression={($_.LatRead + $_.LatWrite)}}

$IOarray = $IOarray | Select name,IOPS,Latencia,Throughput,
@{Name="IORead";Expression={"{0:N0}" -f (($_.IORead/$_.IOPS) * 100)}},
@{Name="IOWrite";Expression={"{0:N0}" -f (($_.IOWrite/$_.IOPS) * 100)}}

$IOarray | FT @{Name="VM";Expression={$_.Name};a="left";width=15},
@{Name="Throughput(KBps)";Expression={$_.Throughput};a="right";width=10},
@{Name="Latencia (ms)";Expression={$_.Latencia};a="right";width=9},
@{Name="IOPS";Expression={$_.IOPS};a="right";width=10},
@{Name="Rd/Wr";Expression={($_.IORead + "/" + $_.IOWrite)};a="center";width=10} -wrap 

Debemos de ver algo así, que son las estadísticas generadas por nuestras VMs de Lunes a Viernes de la última semana, en un horario de 8hrs a 16hrs.

123

Si desean conocer con mas detalle como trabajar con estadísticas en vSphere utilizando PowerCLI, les recomiendo consultar la serie que Luc Dekens publicó en su Blog:

PowerCLI & vSphere statistics – Part 1 – The basics

PowerCLI & vSphere statistics – Part 2 – Come together

PowerCLI & vSphere statistics – Part 3 – Instances

PowerCLI & vSphere statistics – Part 4 – Grouping

PowerCLI & vSphere statistics – Part 5 – Rollup Types

¡Suerte!

Reporte de discos virtuales. Tipo, tamaño, formato y ruta.

Aproveché que me pidieron ayuda en una migración de storage para hacer un script que me arrojara la información de la configuración y ubicación de todos los discos virtuales.

Algo importante que hay que tener presente en cuanto a la configuración de los discos virtuales (VMDKs), y que podemos observar con este reporte, es que a los discos independiente no le podemos tomar snapshot, por lo tanto no pueden ser respaldados por ninguna herramienta que utilice los VMware Storage APIs for Data Protection (VADP). Y en general siempre deberíamos de saber como y donde están creados los discos de los servidores.

En el script va el nombre de la máquina virtual, nombre del disco, capacidad provisionada, información sobre el formato, si es de tipo RDM, datastore en que se encuentra y carpeta. Creo podría ser buena idea si queremos documentar el inventario o vamos a comenzar a trabajar en el datacenter.

Va…

$MyVMs = Get-VM
foreach($VM in $MyVMs){
Get-VM $VM |Get-HardDisk |
Format-Table @{Name="VM";Expression={$_.Parent};a="left"},
@{Name="Disco";Expression={$_.name};a="left"},
@{Name="Capacidad GB";Expression={"{0:N1}" -f $_.CapacityGB};a="right"},
@{Name="Formato";Expression={if ($_.StorageFormat -eq 'Thin') { "Thin" } else { "Thick" }};a="center"},
@{Name="RDM";Expression={if ($_.ExtensionData.backing.LunUuid -ne $null) { "Si" } else { "No" }};a="center"},
@{Name="Independiente";Expression={if ($_.Persistence -eq 'Persistent') { "No" } else { "Si" }};a="center"},
@{Name="Persistente";Expression={if ($_.Persistence -eq 'IndependentPersistent' -or 'Persistent') { "Si" } else { "No" }};a="center"},
@{Name="Datastore";Expression={$_.FileName.Split(']')[0].TrimStart('[')};a="center"},
@{Name="Folder/VMDK";Expression={$_.filename.Split(']')[1]};a="left"} -a
}

Y debemos de tener algo así por cada una de las VMs que queramos revisar…

Captura de pantalla 2015-02-20 a las 23.15.19

Espero les sea de utilidad…