28 may

Buscar máquinas virtuales con PowerCli en VMware

Bueno con este titulo tan largo os voy a explicar como solventar un problema que me encontré alguna vez, básicamente el problema se presenta cuando tenemos una granja de servidores VMware ESX “grande” y tenemos algún problema con la máquina de VCenter, con lo cual perdemos la gestión centralizada, a esto le sumamos que tenemos activado DRS, y las máquinas bailan de un servidor a otro. Entonces por ejemplo si queremos acceder a la consola de servidor de VCenter, lo que nos tocará será ir esx por esx buscando donde esta la maldita máquina.

Pues a este problema, esta solución (seguro que hay otras más elegantes, pero las desconozco.)

Me monte un pequeño PS, que lo que me hace es una vez al día (a través de gestor de tareas) hace una lista de las máquinas virtuales y en que host ESX están ubicadas y maravillosamente me las envía por mail, sin más dilación aquí el PowerCli!

add-pssnapin VMware.VimAutomation.Core
Connect-VIServer -Server <ip> -User <usuario> -Password <Contraseña>
Get-VM | select Name, VMHost| Format-List * | Out-File "<Ruta donde guardamos la lista>" -Encoding UTF8
$to = New-Object System.Net.Mail.MailAddress "<dirección de mail del destinatario"
$msg = new-object system.Net.Mail.MailMessage "<dirección de quien lo envia>", $to
$msg.Subject = "Lista de máquinas en host"
$file = "<Ruta del fichero>"
$att = new-object Net.Mail.Attachment($file)
$msg.body = "Lista de host con las máquinas que tienen"
$smtpServer = 'Servidor smtp'
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$msg.Attachments.Add($att)
$smtp.Send($msg);

Bueno el código como veis es muy sencillo y muy fácil de entender, con esto cada vez que queramos tendremos la lista de ubicación de las máquinas y los host, de esta manera si algún día perdemos VCenter, nos sera mas sencillo encontrarlo.

Por último, el resultado es algo tal que así.

Name   : bpe
VMHost : xxxcpdesx202.xxx.xxx

Name   : Zabbix-Hq
VMHost : cpdesxi09.xxx.xxx

Name   : GRPCPDBCK02_replica
VMHost : cpdesx203.xxx.xxx

Name   : WEB-DEV
VMHost : hdqesx01.xxx.xxx.
.
.
.
Ale a disfrutarlo!!!
22 may

Tipos de caches ZFS

Vamos a explicar que tipos de cache tenemos disponible en ZFS y como trabaja cada una de ellas, este post es  un añadido al mejora del rendimiento ZFS,  hechas las presentaciones vamos al lio.

Como sabemos ZFS nos permite hacer miles de cosas que difícilmente las podemos encontrar en los sistemas tradicionales de almacenamiento, e incluso algunas de ellas no están presente entre los grandes como EMC o Hitachi, pero bien estamos viendo que con el paso del tiempo hemos conseguido aumentar el numero de cpu’s, los GB de RAM e incluso los miles de TB de nuestros discos duros, pero aún así seguimos pecando de la velocidad de los discos, así que dada esta situación solo nos queda meter caches intermedias para conseguir darle un poco de brío al tema, en esta situación tenemos lo que popularmente se esta conociendo como Hybrid Storage, que no es más que la unificación de un disco duro + un disco SSD + RAM, la cantidad de cada una de las partes en nuestro sistema dependerá una vez mas de los leuros que tengamos encima de la mesa.

En los tiempos que corren, lo mas normal es que tengamos muchos discos rotativos, poca ram y algún SSD, así que vamos a centrarnos en esta situación para explicar como funcionan y como debemos organizar las caches del sistema ZFS. Dónde tenemos el problema?, pues en el acceso aleatorio a los datos, la búsqueda del sector, más el movimiento de la aguja que nos lleva a tener una latencia importante.

Vamos a ver el esquema de sistemas de cache que tiene ZFS y explicar cada una de ellas.

arcCache ARC -> Muy por encima, ubicado en RAM, es la cache de primer nivel de ZFS, si no le decimos nada ZFS intentara ubicar en ella lo máximo posible, ya que al estar en RAM es la más rápida.(uberblock y punteros  a los arboles de datos, para acceder de la forma mas rápida posible a los mismos).

L2ARC: Cache de segundo nivel de lectura, esto son los discos SSD, zfs ubicará  todos los datos que no pudo ubicar en ARC (debemos recordar que zfs hace un uso intensivo del sistema de prefetch inteligente), esto se puede modificar y decidir que parte queremos enviar al ARC y que parte quedarnos en el L2ARC, esta explicado entre otras variables en el post “Mejorar rendimiento de ZFS“.

ZIL: Más disco SSD, cache de segundo nivel de escritura, ahí meteremos el log, el  zfs intent log que acelerará las escrituras de tipo sincrono.

Disk storage pool: Pues los discos, cuando llegamos aquí ya tenemos que tenerlo todo montadito, que sino empieza a ir todo lento lento….

Entonces como nos quedaría?, pues algo tal que así.

Diagrama1

Cosas a tener en cuenta para entender mejor la arquitectura:

  1. El incremento del rendimiento se notara tras varias horas de funcionamiento con la estructura montada, ya que el sistema L2ARC/ZiL, ira almacenando en cache, los datos que mayor acceso tengan.
  2. El L2ARC, esta pensado para sistemas de write one, read many, o sea mucha lectura poca escritura, y lectura de datos de tipo aleatorio, la lectura de datos secuenciales zfs no hará uso de L2ARC (de cualquier modo el sistema de prefetcht integrado en zfs ya esta suficientemente optimizado para el envío de datos).
  3. ZIL, esto nos ayudara a compensar las escrituras a disco, la verdad es que yo recomiendo activar ambos, ya que obtendremos el mejor rendimiento posible.

Por último, recordad que una vez montado la arquitectura deberías revisar los parámetros, pasaros por el post Mejorar rendimiento de ZFS

Como montar esto?

Fácil

zpool add <pool> cache <disco>

 

zpool add <pool> log <disco>

El primer comando activaremos la cache de L2ARC y con la opción log del segundo comando activaremos la cache ZiL
Ale a disfrutarlo!

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!

06 may

Instalar BaculaWeb en Freebsd

Vamos a explicar como instalar una pequeña web única y exclusivamente para controlar los trabajos del servidor de bacula, esta solución básicamente los que nos ofrece es una web donde veremos como están los backups, cuantos fallaron cuantos fueron bien etc… pero de momento como os comento es a modo informativo….

Pues dicho esto vamos al lio.

Primero de todo deberemos instalar los paquetes que nos hacen falta.

Como lo vamos hacer en FreeBSD una cosa muy importante es controlar los paquetes dependientes de las X11, para evitar que nos instale “basura” si no tenemos un entorno gráfico, para evitar eso lo explico aquí

Haremos.

cd /usr/ports/
cd databases/postgresql91-server
make install clean
cd ..
cd sysutils/bacula-client
www/apache22
make install clean
cd ..
cd lang/php5
make install clean
cd ..
cd www/php5-session
make install clean
cd ..
cd devel/php5-gettext
make install clean
cd ..
cd graphics/php5-gd
make install clean
cd ..
cd sysutils/bacula-client
make install clean
cd ..
cd www/apache22
make install clean
cd ..
cd lang/php5
make install clean
cd ..
cd www/php5-session
make install clean
cd ..
cd devel/php5-gettext
make install clean
cd ..
cd graphics/php5-gd
make install clean
cd ..
cd databases/php5-mysql
make install clean
cd ..
cd databases/php5-pdo_mysql
make install clean

Es posible que durante la instalación de los paquetes tengamos un problema de dependencias con el paquete libpng-1.5.13.tar.xz, pero no os preocupéis el papi Miguel piensa en vosotros y aquí lo tenéis libpng-1.5.13, por supuesto esta en doc porque wordpress no me deja subir tar.xz, pero es un tar.xz.

Pues con esto instalado comprobamos que esta el apache arrancado y lo ponemos en el arranque automático

vi  /root/rc.confapache22_enable="YES"

Ahora solo nos queda configurar el codigo, nos lo bajamos de http://bacula-web.org/tl_files/downloads/

cd  /usr/local/www/apache22/data/wget http://bacula-web.org/tl_files/downloads/bacula-web-latest-version-number.tar.gztar -xzf bacula-web-version_number.tar.gz -C /usr/local/www/apache22/data/chown -Rv /usr/local/www/apache22/data/baculachmod -v ug+w /usr/local/www/apache22/data/bacula/application/view/cache

Bueno como veréis los pasos son triviales, lo único que debemos tener en cuenta es darle permisos de escritura al directorio cache.

Ahora vamos a configurar el chirringo este para que se comunique con bacula-dir

Utilizaremos los ficheros de ejemplo para configurarlo.

cp  /usr/local/www/apache22/data/bacula/application/config/config.php.sample /usr/local/www/apache22/data/bacula/application/config/config.php

 

$config['language'] = 'es_ES';// MySQL bacula catalog

Como vemos es bastante sencillo, cambiamos el idioma por defecto y configuramos la base de datos donde tengamos corriendo Bacula.

Una vez hecho esto ya deberíamos tener la web funcionando, iremos a la dirección siguiente

http://IPserver/bacula/test.php

Y deberíamos ver algo así.

testY si vamos a index.php, veremos las tareas y demás información que ya os dejo que la vayáis descubriendo vosotros mismos :).

Dashboard

Ale a disfrutarlo!!!

03 may

Evitar dependencias X11 al instalar paquetes FreeBSD

Una de las cosas super chulas que tenemos por defecto en FreeBSD, es que nos podemos encontrar que queremos instalar un paquete, por ejemplo vim, pero observamos que durante la instalación el sistema también quiere instalar dependencias de X11, y nosotros no tenemos instalado en nuestro sistema las X11, que debemos hacer?

Muy fácil.

sudo vim /etc/make.conf

WITHOUT_X11=yes

Y volvemos a la felicidad, así de sencillo.