martes, 13 de octubre de 2009

OneLiner 3: Detección de errores de conectividad en las vmhba de fibra

Buenas, os paso un OneLiner encargado de recoger la configuración de HBAs de fibra asociadas a los servidores ESX de un cluster determinado e imprimir el estado de las mismas. Si existe cualquier fallo de conexión con la SAN se mostrará la hba y su correspondiente WWNP (Port World Wide Name) en rojo.

 foreach ($esx in $(get-vmhost -Location (get-cluster '<cluster>') | ? {$_.State -eq 'Connected'})) {(get-view (get-vmhoststorage $esx).Id).StorageDeviceInfo.HostBusAdapter | % {if ($_.key -match 'FibreChannel') {if ($_.status -ne 'online') { Write-Host ("Host: {0} - HBA: {1} - WWNP: {2:X}" -f $esx.name,$_.Device,$_.PortWorldWideName) -Foreground Red} else { Write-Host ("Host: {0} - HBA: {1} - WWNP: {2:X}" -f $esx.name,$_.Device,$_.PortWorldWideName) -Foreground Green}}}}

Si en lugar de controlar los ESX que están en un cluster quereis controlar todos los ESX de vuestro datacenter simplemente teneis que eliminar la parte: -Location (get-cluster '<cluster>'). El OneLiner controla el estado de los servidores, de forma que sólo interroga a los ESX que están conectados actualmente al Virtual Center, sin tener en cuenta si el ESX está en modo mantenimiento o en modo desconectado.

viernes, 2 de octubre de 2009

OneLiner 2: Modificar la configuración NTP de los servidores ESX

Esta mañana estaba revisando unos logs cuando de repente... sorpresa!!! la hora de las entradas del log no tenían sentido ninguno. El problema evidente era que la hora del sistema no era la correcta, así que me puse a revisar la configuración del cliente ntp y... voilá! estaban mal. El paso siguiente y evidente era corregir la configuración del cliente ntp, pero claro (y por murphy...), no en un único ESX, ... ¡sino en todo el datacenter!. Solución, script al canto. En este caso tres oneliner:
  • Un OneLiner para consultar la configuración ntp de todos los hosts del datacenter:
Get-VMHost |Sort Name|Select Name, @{N=“NTPServer“;E={$_ |Get-VMHostNtpServer}}, @{N=“ServiceRunning“;E={(Get-VmHostService -VMHost $_ |Where-Object {$_.key-eq “ntpd“}).Running}}
  • Otro OneLiner para eliminar los servidores incorrectos, ya que no se puede hacer sustituciones directamente:
Get-VMHost | Sort Name | Remove-VMHostNtpServer @("servidor1","servidor2",...)
  • Otro para añadir la configuración correcta de servidores:
Get-VMHost | Sort Name | Add-VMHostNtpServer -NtpServer @("servidor1","servidor2",...)
  • Y el último para reiniciar el servicio de ntp, para que el servicio actualice los cambios en la configuración:

Get-VmHostService -VMHost (Get-VMHost | Sort Name) | Where_Object {$_.key -eq "ntpd"} | Restart-VMHostService
 Aprovecho ya también para llamaros la atención sobre este último OneLiner. Si observais, básicamente lo que hace este OneLiner es localizar un servicio, en nuestro caso ntpd y reiniciar el servicio. Si cambiais ntpd por el nombre del servicio que os interese y el cmdlet Restart-VMHostService por Start-VMHostService o Stop-VMHostService, podeis gestionar los servicios de los ESX de vuestro datacenter de forma remota. Por supuesto, esta no es la única forma de hacerlo, simplemente una más :).

jueves, 1 de octubre de 2009

Despiste 5: Dividir un fichero de texto en partes de tamaño fijo

En esta ocasion os dejo un script que toma un fichero de texto y lo divide en partes de tamaño fijo. El script lo podeis descargar desde:

http://dl.getdropbox.com/u/1039818/Blog/Windows/split-file.ps1

Para hacer honor a la verdad, este script no ha sido una creación mía, sino una modificación de un script que he encontrado por la red (escrito por Josh Einstein) que hace lo mismo, pero divide el fichero de texto en el número de partes que se le pasa como parámetro, sin poder definir el tamaño de las partes. Si quereis acceder al original, lo encontrareis en este enlace:

http://stackoverflow.com/questions/1001776/how-can-i-split-a-text-file-using-powershell/1003866#1003866

martes, 29 de septiembre de 2009

OneLiner 1: Máquinas Virtuales ejecutándose en un Cluster

Seguro que no soy el único administrador de VMware al que en algún momento le ha venido algún compañero con una de las más inocentes preguntas que nos pueden hacer: "¿cuantas y cuales son las máquinas virtuales hay corriendo en el cluster?". Como podreis adivinar, la tarea no es que sea especialmente complicada, pero si el número de las susodichas es elevado, de una tarea sencilla, pasamos a una tarea tediosa. Pues precisamente esa ha sido la pregunta que me han hecho hoy... así que he decidido tirar de powershell, o para ser más exactos de PowerCLI, y hacer no un script (que me parecía demasiado engorroso para obtener una simple lista) sino un OneLiner (es decir, una secuencia de comandos que ocupa una sóla línea). Pues bien, aquí os dejo un oneliner que se encarga de obtener el listado de todas las máquinas virtuales que se estén ejecutando en un cluster determinado:


(Get-View $(Get-Cluster cluster).Id).Host | Foreach-Object {(Get-View $_).Vm | Foreach-Object { (Get-View $_) | Where-Object{$_.Runtime.PowerState -eq 'poweredOn'}} | Select-Object Name }

Donde simplemente teneis que sustituir cluster por el nombre de vuestro cluster. Recuerdo que el oneliner requiere que hayais establecido previamente una conexión con un virtual center mediante el comando:

Connect-VIServer virtualcenter

Cambiando virtualcenter por el nombre o la IP de vuestro virtual center
Si en lugar de obtener las máquinas virtuales asociadas a un cluster, quereis saber el nombre de todas las máquinas virtuales que se están ejecutando bajo el control de vuestro virtual center, el oneliner quedaría:

(Get-VMHost | Foreach-Object {Get-View $_.Id}) | Foreach-Object {Get-View $_.Vm |  Where-Object {$_.Runtime.PowerState -eq 'poweredOn'}} | Select-Object Name

miércoles, 23 de septiembre de 2009

Despiste 4: Comparar el contenido de varios directorios

Bueno, pues otro despiste más... El otro día en el trabajo me encargaron comparar el contenido de un directorio distribuido entre 12 servidores diferentes. Imaginandome como iba a ser el percal y que la cosa no iba a ser tan simple como revisar el tamaño y la fecha de 2 ó 3 ficheros decidí tirar de San Google. Después de estar buscando durante un rato no encontré ninguna herramienta que satisfaciera completamente mis necesidades, así que tiré de scripting (amos, lo que suelo hacer cuando no encuentro una herramienta que satisfaga mis necesidades). El resultado de esas horas de programación ha sido mDiff, un pequeño script en PoSH que toma como único parámetro de entrada una lista de ficheros o directorios a comparar (independietemente de que estén en el disco local o publicado en una carpeta compartida) y que calcula la firma MD5 de cada uno de los elementos a comparar, presentando un informe en HTML con el resultado de las comparaciones.

El script podeis descargarlo como siempre desde mi dropbox:

http://dl.getdropbox.com/u/1039818/Blog/Windows/mdiff.ps1

Para poder ejecutarlo necesitareis la PoSH v2 y las extensiones de la comunidad (PSCX)

martes, 22 de septiembre de 2009

Otro Senil

Hola A todos.
Como lo prometido es deuda, espero poder aportar algunas cosas a este blog. En el momento que tenga algo de tiempo empezare a introducir algunos tutoriales sobre seguridad en redes y wifi. Hablaremos sobre VPN, EoIP, PPPoE, wep, wpa(wep2),wpa2, etc.

Un saludo y espero vernos pronto por aqui.

miércoles, 16 de septiembre de 2009

Despiste 3: Detectar los procesos que acceden a un fichero

¿A quién no le ha pasado alguna vez eso de tener que borrar un fichero y no poder porque hay algún otro proceso que lo tiene abierto?.
Si eres un administrador de Unix la solución es fácil, haces un fuser sobre el fichero/directorio/partición en cuestión y obtienes el PID del proceso que te está haciendo la pascua.
Si de lo que hablamos es de un sistema Windows (para la versión 2000), la cosa cambia un poco, ya que no existe una herramienta en el propio sistema que nos permita obtener el deseado PID. Pero una cosa es que el sistema no cuente con una herramienta que nos resuelva el problema y otra muy distinta es que no exista ninguna herramienta que nos aporte la deseada solución. En este caso la herramienta salvadora forma parte de la suite de herramientas de sysinternals, handle. Este comando, que toma como uno de sus parámetros, el nombre del fichero que tenemos bloqueado, nos informa acerca de todos los handlers (descriptores de fichero) que tiene abierto el sistema y nos dá, entre otras cosas, el PID del proceso que hace uso del descriptor de fichero. Ahora sólo queda optar por una de las dos siguientes opciones:
  1. Irse al task manager, localizar el PID que nos interesa y parar el proceso (eso de matar nunca me ha gustado :))
  2. Usar el propio comando handle con el parámetro -c , es decir: handle -c 237. Si esta opción es la que más os gusta, tened cuidado con el proceso que parais, vaya a ser que topeis con uno gordo del sistema. Aquí teneis un listado de los procesos por defecto del sistema.
Este procedimiento es válido para todos los Windows a partir de 2000. A partir de XP se ha introducido el comando openfiles que muestra y desconecta los ficheros abierto en el sistema. La principal ventaja sobre handle es que también permite la desconexión de ficheros abierto en sistemas remotos.

jueves, 3 de septiembre de 2009

despiste 2: Al intentar eliminar una máquina virtual de un datastore en una SAN desde el DataStore Browser aparece el mensaje "Could not delete file"

Uno de los problemas que me he encontrado alguna vez administrando la granja VMWare ha sido el de no poder mover o eliminar una máquina virtual, recibiendo el error "Could not delete the file" desde el Virtual Infrastructure Client.

Las operaciones que me llevaban a este error eran:

  • Intentar eliminar la máquina virtual ("vm1", por ejemplo) desde el VIClient con la opción Delete from disk. Al lanzar el comando este se ejecuta correctamente. Sin embargo cuando reviso el datastore correspondiente veo que se mantienen los ficheros de los discos duros virtuales (*-flat.vmdk) y el fichero de swap (*.vswp).
  • Si intento eliminar los ficheros directamente desde la Sevice Console (en el directorio /vmfs/volumes/) con el comando rm, este me devuelve el error: Device or resource busy
Al ejecutar el comando grep -ir "vm1" * sobre el directorio /proc/vmware/vm aparece la siguiente salida:


1382/names:vmid=1382 pid=-1 cfgFile="/vmfs/volumes/48b776c0-7387a6c0-da4e-00215aee45bc/vm1/vm1.vmx" uuid="50 26 f1 98 a4 68 a8 f6-f8 eb 3c 0f b7 2c f1 71" displayName="vm1"
1382/userRPC: Total vmm0:
vm1 vmm1:vm1 vmm2:vm1 vmm3:vm1
1383/userRPC: Total vmm0:vm1 vmm1:vm1 vmm2:vm1 vmm3:vm1
1384/userRPC: Total vmm0:vm1 vmm1:vm1 vmm2:vm1 vmm3:vm1
1385/userRPC: Total vmm0:vm1 vmm1:vm1 vmm2:vm1 vmm3:vm1

De esta salida, la información que nos interesa de la salida anterior es el el process ID (pid, en negrita). Como veis, el pid está establecido a
-1, con lo que la solución que presenta vmware no resulta efectiva. El problema está en que el proceso que bloquea los ficheros de esa máquina virtual no está corriendo en la COS sino en el VMKernel, con lo cual hemos de acceder al espacio de ejecución de este para poder obtener el pid que nos interesa.


El procedimiento para eliminar el bloqueo es el siguiente:

  1. Obtener el vmid de la máquina virtual bloqueada. Ejecutar el comando vm-support -x | grep -i | awk '{print $1}' | awk -F '=' '{print $2}' desde un sistema de ficheros que no sea VMFS.
  2. Localizar el wid asociado al vmid mediante el comando cat /proc/vmware/vm//cpu/status | awk '{print $21}' | awk -F '.' '{print $2}'
  3. Enviar la señal de KILL al wid mediante el comando /usr/lib/vmware/bin/vmkload_app -k donde señal en nuestro caso será el valor 9

A partir de este momento es posible eliminar los ficheros bloqueados del datastore
.

A continuación os pongo los enlaces que me han servido de referencia

martes, 11 de agosto de 2009

primer "despiste" Listado de permisos sobre un directorio NTFS

En fin, pues como lo prometido es deuda aqui os dejo el primero de mis despistes. Se trata de un script de PowerShell que se encarga de recopilar el conjunto de privilegios establecidos en una jerarquía de carpetas que se le pasa como parámetro. El propio script tiene una ayuda para indicaros como ejecutarlo.

http://dl.getdropbox.com/u/1039818/Blog/Windows/listACL.ps1 (v0.4)
http://dl.getdropbox.com/u/1039818/Blog/Windows/versiones%20antiguas/listACL_v03.ps1 (v0.3)
http://dl.getdropbox.com/u/1039818/Blog/Windows/versiones%20antiguas/listACL_v02.ps1 (v0.2)

Para los que usan git: git://gist.github.com/166397.git

Como podreis ver vosotros mismo faltan algunas cosillas que mejorar, como por ejemplo la parte de JavaScript del informe HTML encargada de contraer el arbol de directorios o dibujar una estructura de arbol que represente el alcance de acceso de los usuarios a las carpetas el directorio. Pero todo eso en sucensivas versiones :)

Presentación

Antes de que empezar a publicar cualquier entrada me gustaría contaros un poquito acerca de mi y la de la necesidad de crear un sitio como este.
Soy administrador de sistemas desde hace relativamente poco, unos 6 años aproximadamente. Vengo de la programación y como deformación tengo la costumbre de aplicar lo poco que aprendí en la programación a la administración de sistemas, por lo que tengo escrito una pequeña batería de scripts para facilitarme mi trabajo diario.
El motivo de empezar este blog es que me he dado cuenta que a pesar de mi corta edad (29 años) tengo una desagrable tendencia a olvidar, y por lo tanto a perder, las cosas que he programado. Por lo que, un poco cansado de esta tendencia, he decido publicar estos scripts (que cariñosamente llamaré de ahora en adelante "despistes") para matar dos pájaros de un tiro:
  • el primero (y más importante), empezar de una vez a devolver a la comunidad tanto conocimiento que me ha aportado.
  • el segundo, no olvidarme más de los despistes que he programado :)

Por supuesto, cualquier persona que quiera aportar, colaborar o simplemente colaborar será recibida de buen grado.

Un saludo pa tós y espero que mis despiestes os sirvan de utilidad a alguno de vosotros.