14 may

Estadísticas VMware con PowerCLI y Graphite.

Voy a explicar como unir dos mundos, vamos a montar un sistema que nos permita sacar datos de los rendimientos de nuestra plataforma virtual (VMWARE) a través de Powercli, y los enviaremos a Graphite, utilizaremos por un lado una herramienta en Windows (powercli) y un sistema para generar gráficas que corre en Linux, un gráfico de la arquitectura por servicios seria el siguiente. La idea principal que me llevo a esta solución, es cuando deseamos mostrar al cliente las estadísticas de sus máquinas sin querer que acceda a la vcenter, eso y la falta de dinero para comprar una solución super chula y super caras, de esta manera le podemos dar una URL, para que vea los datos que desee.

grafica

Pensar que es a nivel de servicio, o sea que no debemos tener 3 maquinas :), bien pues por un lado tendremos ps de power shell que recogerá las métricas cada 10 minutos conectandose a vcenter, y lo dejara en un recurso compartido para que posteriormente la máquina de graphite lo trate y genere la gráfica.

Para saber montar graphite y conocer un poco más el producto os recomiendo que os paseis por el blog de mi compañero de labores, que hace un tiempo hizo un post muy interesante al respecto. http://www.tomas.cat/blog/ca/instal%C2%B7lant-graphite-0910-debian-squeeze.

Vale ahora tenemos el sistema de gráficas montado, pues vamos a por los otros puntos que es lo interesante de este post.

Punto 1 – Instalamos powercli en una maquina windows.

Nos lo bajamos de VMWARE, y lo instalamos, la instalación es muy básica y típica de siguiente y siguiente y más siguiente y espera y siguiente y ale finalizar!

Una vez instalado nos iremos al escritorio y ejecutaremos VMware vSphere PowerCLI.exe

Nos dará un error de certificado, pero no os preocupéis aquí explico como solucionarlo.

Punto 2 – Scripts de Powercli

Bien ya tenemos el powercli instalado, ahora vamos con los scripts para poder coger los datos, si quereis ver el codigo de forma mas amigable yo utilizo, http://powergui.org/downloads.jspa

add-pssnapin VMware.VimAutomation.Core
$metrics = "net.usage.average"
$start = (Get-Date).AddMinutes(-10)
Connect-VIServer -Server ipservidor  -User dominiousuario -Password contraseña
$resource = Get-ResourcePool | select name | where { $_.Name -ne “Resources”}

$resource | Sort-Object Name,Time |
Export-Csv "C:psnetresource.csv" -NoTypeInformation -UseCulture

$vmlist = Import-CSV "C:psnetresource.csv"

foreach ($list in $vmlist) {
      $esxImpl = Get-VM -Location $list.name | where { $_.PowerState -eq “PoweredOn”}
      $report = Get-Stat -Entity $esxImpl -Stat $metrics -Realtime -Start $start | `
      Group-Object -Property EntityId,Timestamp | %{
      New-Object PSObject -Property @{
      Name = $_.Group[0].Entity.Name
      Time = [int][double]::Parse((Get-Date -UFormat %s $_.Group[0].Timestamp))
      netActAvg = [math]::Round(($_.Group | Measure-Object -Property Value -Average).Average, 2)
}
}
$file=$list.name
$report | Sort-Object Name,Time | `
Export-Csv "C:psnet$file.csv" -NoTypeInformation -UseCulture

get-content C:psnet$file.csv | %{$_ -replace ' ',''} | %{$_ -replace ';',' '} | %{$_ -replace '"',''} | %{$_ -replace 'Name',''} | %{$_ -replace 'netActAvg',''} | %{$_ -replace 'Time',''} | %{$_ -replace ',','.'} | out-file -Encoding ASCII "ruta compartida entre ambas maquinas"
}

Invoke-VMScript -VM deploy-pre -ScriptText "/bin/bash /mnt/shared/sysprod/nuevo/ntt/bin/graphite_vmware_net.sh" -HostUser usuario -HostPassword contraseña -GuestUser usuariodelamaquinavirtual -GuestPassword contraseña

disconnect-viserver -Server IP -Confirm:$False

Bueno este ps lo que hace es sacar la media de los ultimos 10 minutos del trafico de red, voy a explicar linea por linea lo que hacemos.

add-pssnapin VMware.VimAutomation.Core

-Como vamos a lanzar el script con el administrador de tareas de windows, lo haremos a través de powershell, asi que debemos cargar las librerias de VMWARE para utilizar los metodos o VI Toolkit

$metrics = “net.usage.average”

-En esta variable le pondremos la metrica que queremos sacar, en este caso es la media del tráfico de red, pero podemos utilizar cpu.usage.average, mem.usage.average etc..

$start = (Get-Date).AddMinutes(-10)

-Aquí le diremos el tiempo de datos que queremos recoger, en este caso 10 minutos, o sea por cada ejecución nos dará los datos de los últimos 10 minutos de todas las maquinas virtuales.

Connect-VIServer -Server ipservidor  -User dominiousuario -Password contraseña

Nos conectamos a nuestro vcenter, modificaremos y pondremos nuestro usuario y contraseña.

$resource = Get-ResourcePool | select name | where { $_.Name -ne “Resources”}

– Esto ya es algo particular de mi plataforma, lo que hago es sacar todos los resources de vmware, lo hago porque en graphite organizo las métricas por entornos y cada entorno es un resource, mas adelante lo entenderéis.

$resource | Sort-Object Name,Time | Export-Csv “C:psnetresource.csv” -NoTypeInformation -UseCulture
$vmlist = Import-CSV “C:psnetresource.csv”

-Exportamos los resultados a un csv e importamos la lista de máquinas.

Después hacemos el bucle donde buscamos aquellas que estan encendidas y sacamos los resultado.
$report | Sort-Object Name,Time | `
Export-Csv “C:psnet$file.csv” -NoTypeInformation -UseCulture

-Nos quedamos con los campos que nos interesan nombre y fecha y los exportamos a un CSV.

get-content C:psnet$file.csv | %{$_ -replace ‘ ‘,”} | %{$_ -replace ‘;’,’ ‘} | %{$_ -replace ‘”‘,”} | %{$_ -replace ‘Name’,”} | %{$_ -replace ‘netActAvg’,”} | %{$_ -replace ‘Time’,”} | %{$_ -replace ‘,’,’.’} | out-file -Encoding ASCII “ruta compartida entre ambas maquinas”

-Ahora tratamos el csv para dejarlo medio listo para graphite, quitando aquello que no queremos y dejándolo en el recurso compartido para la maquina de graphite.

Invoke-VMScript -VM deploy-pre -ScriptText “/bin/bash /mnt/shared/sysprod/nuevo/ntt/bin/graphite_vmware_net.sh” -HostUser usuario -HostPassword contraseña -GuestUser usuariodelamaquinavirtual -GuestPassword contraseña

-Por ultimo llamamos a un script que tenemos en la maquina Linux, que se encarga de volver a tratar cada fichero y enviarlo a graphite, esta parte seguro que se puede hacer directamente desde powershell, pero no encontré la forma ni las ganas ;), así que intente volver a territorio conocido…, si alguien lo mejora bienvenido sea…

disconnect-viserver -Server IP -Confirm:$False

Y nos desconectamos.

Bueno, después de lanzar el ps, el resultado de los fichero sera algo tal que:

"1-INT-01";"38";"1367839360"
"1-INT-01";"15";"1367839380"
"1-INT-01";"13";"1367839400"
"1-INT-01";"16";"1367839420"
"1-INT-01";"10";"1367839440"
...

Debemos coger los resultados y dejar algo tal que

vmware.Entornos_de_Test.1-INT-01.avgnet 27 1367848820
vmware.Entornos_de_Test.1-INT-01.avgnet 9 1367848840
vmware.Entornos_de_Test.1-INT-01.avgnet 7 1367848860
vmware.Entornos_de_Test.1-INT-01.avgnet 8 1367848880
vmware.Entornos_de_Test.1-INT-01.avgnet 10 1367848900
vmware.Entornos_de_Test.1-INT-01.avgnet 10 1367848920
vmware.Entornos_de_Test.1-INT-01.avgnet 28 1367848940
vmware.Entornos_de_Test.1-INT-01.avgnet 9 1367848960
vmware.Entornos_de_Test.1-INT-01.avgnet 9 1367848980

Ya que para que graphite lo entienda debemos enviarlo [clave+separación+valor+separación+timestamp unix format] donde algo puede ser más de una opción separado por puntos, por cada . tendremos una carpeta en graphite, tal que…

Captura de pantalla de 2013-05-08 11:39:56

En este caso por ejemplo lo que le mandamos es vmware.Entornos_de_Test.1-INT-01.avgnet y la estructura que creamos será la que veis en la imagen.

Bueno hasta aqui la parte del script de powercli, ahora vamos a mirar el de Linux, que lo lanzamos con el INVOKE, como ya os dije seguro que se puede hacer todo desde powershell y estoy abierto a mejoras.

Vamos a revisar entonces el script.

#!/bin/bash
source=recursocompartido
:> /tmp/datosnet
cd $source
dos2unix *
find . -name '* *' | sort | while read FILE
do
NEWFILE=`echo ${FILE} | sed 's/ /_/g;'`
mv "${FILE}" ${NEWFILE}
echo ${NEWFILE}
done

for site in *;
do
echo $site
awk -v site=$site '{printf ("vmware.%s.%s.avgnet %s %sn",site,$1, $2, $3-7200)}' $site >> /tmp/datosnet
rm -rf $site

done

cat /tmp/datosnet | nc manage 2003

exit $?

Comentamos lo que hacemos.

1.- Definimos un source, que será el recurso compartido donde dejamos los ficheros de powercli

2.- Vaciamos el fichero donde unimos todos los datos

3.- Pasamos el formato windows raro a unix.

4.- Ahora lo que hacemos es modificar los ficheros que tienen en nombre separado y unirlos con _

5.- Y hacemos el awk, donde dejamos los resultados como nos interesa, a medida que los vamos tratando los metemos en el fichero datosnet y eliminarmos el origen.

6.- Ahora se lo enviamos a graphite de forma muy sencilla, con un nc al puerto 2003.

Si todo salio bien deberemos ir a graphite y ver algo tal que:

Captura de pantalla de 2013-05-06 16:41:08

Recordar como habíamos dejado el fichero datos.  (vmware.Entornos_de_Test.1-INT-01.avgnet 27 1367848820), en este caso es carpeta vmware dentro los recurso, dentro el nombre de maquina y dentro las métricas, después separación, valor y tiempo.

Si de damos a la métrica tendremos algo así.

Captura de pantalla de 2013-05-06 16:45:19

Bien ahora que tenemos el proceso vamos automatizarlo con el gestor de tareas de windows, lo más importante es poner bien la ruta donde tenemos powershell, por defecto esta en C:WindowsSystem32WindowsPowerShellv1.0powershell.exe

Y como parámetro le pasamos el ps.

Captura de pantalla de 2013-05-08 12:13:32

No hay mejor forma que de probar que lanzarlo…

Si todo salio bien tendremos las estadísticas en graphite.

En resumidas cuentas, esto es una forma sencilla y gratuita de conseguir sacar las métricas de vcenter y ofrecerlas en un gráfico, digo ofrecerlas ya que con graphite podemos crear Dashboard personalizados y compartirlos de forma muy sencilla a través de la URL, esto nos puede servir por ejemplo para permitir que el usuario de una máquina virtual pueda comprobar el rendimiento de la misma, sin necesidad entrar en vcenter.

Captura de pantalla de 2013-05-7658

Ale a disfrutarlo!

02 abr

Añadir memoria y cpu en caliente linux

Bueno como ahora está de moda el tema de la virtualizacion, muchos sistemas de virtualizacion nos permiten añadir CPU o RAM en las máquinas virtuales sin necesidad de apagarlas, o sea en caliente. En este post explicare como hacerlo en Linux, ya que en windows es bastante trivial.

Así que vamos al lio,

Es sistema de virtualización que utilizaremos es vmware esxi 5.1, lo primero de todo deberemos activar ambas opciones en las características de la máquina virtual, asi pues nos iremos a edit settings y marcaremos las siguientes opciones.

activate hot memory

Una vez activada las opciones arrancamos la máquina virtual.

Ahora vamos a ver la situación actual de la máquina, la memoria

free -m

total       used       free     shared    buffers     cached
Mem:          3825        264       3560          0         88         63
-/+ buffers/cache:        112       3712
Swap:         2047          0       2047

La cpu,

cat /proc/cpuinfo

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 37
model name      : Intel(R) Xeon(R) CPU           X5650  @ 2.67GHz
stepping        : 1
cpu MHz         : 2666.761
cache size      : 12288 KB
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 4
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 11
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts xtopology tsc_reliable nonstop_ts
c aperfmperf unfair_spinlock pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 x2apic popcnt aes hypervisor lahf_lm arat epb dts
bogomips        : 5333.52
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

etc

En resumen la maquina tiene 4 CPUS y 4 GB de RAM.

Bueno pues empezamos con la RAM, vamos al vcenter y aumentamos en 2GB la memoria RAM.

Captura de pantalla de 2013-04-02 13:45:47

Bueno, ahora nos vamos a la maquina Linux, lanzamos

grep line /sys/devices/system/memory/*/state

Nos debemos fijar en aquellos que nos salga offline.

Y ahora los activamos, tal que

echo online > /sys/devices/system/memory/memory[number]/state
free -m

Donde [number] pondremos el numero, si son muchos los que tenemos en offline, facilmente podemos hacer un for, ya que por norma general suelen ser secuenciales.

for i in numbers; do "echo online > /sys/devices/system/memory/memory$i/state"; done

free -m

Bueno ahora vemos el aumento de la RAM

total       used       free     shared    buffers     cached
Mem:        5873        309       5564          0         88         63
-/+ buffers/cache:        157       5716
Swap:         2047          0       2047

Pues ahora que tenemos la ram en su punto, vamos a por la CPU

Ampliamos la CPU en el vcenter.

Captura de pantalla de 2013-04-02 14:00:06

Y nuevamente nos vamos al linux, utilizamos el siguiente script ya hecho :)

#!/bin/bash
# William Lam
# http://engineering.ucsb.edu/~duonglt/vmware/

for CPU in $(ls /sys/devices/system/cpu/ | grep cpu | grep -v idle)
do
CPU_DIR="/sys/devices/system/cpu/${CPU}"
echo "Found cpu: "${CPU_DIR}" ..."
CPU_STATE_FILE="${CPU_DIR}/online"
if [ -f "${CPU_STATE_FILE}" ]; then
STATE=$(cat "${CPU_STATE_FILE}" | grep 1)
if [ "${STATE}" == "1" ]; then
echo -e "t${CPU} already online"
else
echo -e "t${CPU} is new cpu, onlining cpu ..."
echo 1 > "${CPU_STATE_FILE}"
fi
else
echo -e "t${CPU} already configured prior to hot-add"
fi
done

Comprobamos

cat /proc/cpuinfo | grep processor | wc -l
8

Y con esto ya tenemos más potencia en la máquina sin perder el uptime…

Ale a disfrutarlo!!!

08 mar

Instalación de PowerCLI VMWARE.

 

 La instalación de PowerCLI es bastante trivial, sabemos que únicamente debemos ir a la pagina de VMware y realizar la descarga del .exe, ingresando con nuestro usuario de VMware.

A día de hoy el enlace es: VMware PowerCLI, tenemos de dos alternativas, la versión “estandar” que es la que denominan VMware VSphere PowerCLI y la versión “for tenants”, básicamente esta segunda opción es para gestionar diferentes sistemas de VMware, como no es nuestro caso, todo lo que vaya escribiendo estará en base a la primera versión. 

 Es probable que una vez instalado lo vayamos a ejecutar y nos de el siguiente error.

 No se puede cargar el archivo XXX, porque en el sistema está deshabilitada la ejecucion de scripts.

Bueno pues lo que debemos hacer es muy sencillo, debemos ejecutar el comando 

Get-ExecutionPolicy

Si nos devuelve Restricted, ahí tenemos el problema.

Ejecutamos entonces.

Set-ExecutionPolicy Unrestricted</span>

Y le decimos que si.

Cerramos y volvemos abrir, nos debería salir algo como esto: 

Pues entonces ya estamos listo para conectarnos a nuestro entorno. 

 

BIEEEEEENNNN!!!