lunes, 30 de junio de 2014

Comandos útiles PowerCli

Hola de nuevo,

PowerCli es un módulo de powershell con CmdLets para gestionar un entorno de vSphere directamente desde la consola. Por supuesto como se tratan de comandos powershell podemos incluirlos en un script para realizar varias tareas a la vez, usar los famosos pipes de powershell, etc...
A continuación pongo unos cuantos comandos de los que a mí me resultan más útiles:

1. Para conectar a un servidor ESX o a un servidor vCenter (nos pedirá los credenciales necesarios para conectar a ese servidor):

 Connect-VIServer <IP del servidor>

2. En caso de estar conectado a un servidor vCenter, para obtener un listado de los host ESX conectados:

 Get-VMHost

(Nos aparece un listado Nombre - Estado - Número de CPUs - Uso de CPU)

3. Para obtener información avanzada de los hosts ESX

 get-vmhost | Get-VMHostAdvancedConfiguration

4. Para obtener un listado de los datastores presentados a los servidores de Vmware y del espacio libre que tienen.

Get-Datastore

5. Si queremos información más detallada de los datastores:

Get-Datastore | select Name, FileSystemVersion, FreeSpaceGB, CapacityGB


 6. Para ver las máquinas virtuales tienen discos dentro de un datastore concreto:

Get-Datastore <nombre datastore> | Get-VM

7. Para obtener un reporte de las máquinas virtuales que tenemos

 Get-VM

(Nos aparece un listado con las columnas Nombre - Estado - CPU's - RAM)

Además en este comando (y en otros también) podemos obtener resultados filtrados según el nombre de las máquinas virtuales con el parámetro -Name

 Get-VM -Name <*texto*>

(Devolverá el listado de máquinas virtuales que su nombre contenga el texto pasado por parámetro)

8. Existen otras maneras de filtrar. Como he comentado antes podemos usar pipes, y en la variable $_ tenemos el resultado del pipe anterior. Así, con el siguiente comando obtenemos las máquinas virtuales que están encendidas.

 Get-VM | Where {$_.PowerState -eq "PoweredOn"}

9. Para obtener más información de las máquinas virtuales: El comando Get-VM nos devuelve una lista de objetos de tipo "VMware.VimAutomation.Types.VirtualMachine" con diferentes propiedades, de las cuales podemos obtener información. Las que encuentro más útiles son:

Guest: Sistema operativo de la máquina virtual
HardDisks: Información sobre los discos de la máquina virtual
Host: Información sobre el host ESX
NumCPU: Número de CPU's
PowerState: Para saber si está encendida
Version: Versión del hardware de la màquina virtual (7,8....)
VMResourceConfig: Información sobre la configuración de compartición de recursos (shares para los que ya sabéis de que va el tema)
VMSwapfilePolicy: Información sobre donde se guarda el fichero de swap de la máquina virtual.

Podemos listar estas propiedades con el mismo comando:

 Get-VM | select Name, Description, NumCpu, MemoryGB, Version, Host, {$_.Guest.IPAddress}

10. Existen otros comandos que podemos usar con pipes para obtener información más detallada:

Máquinas con discos persistentes:
 get-VM | Get-HardDisk | Where {$_.Persistence -eq "IndependentPersistent"}

 Información avanzada de la máquina virtual y sus dicheros de configuración
 Get-VM | get-View 

Máquinas virtuales con snapshots creados

get-vm | get-snapshot | format-table vm,name,sizeMB,IsCurrent,PowerState,created

11. Para acabar, algún comando útil de los que se suelen usar en powershell para exportar resultados a ficheros o para ordenar los resultados obtenidos:

get-vm | get-snapshot | format-list | out-file c:\snaps.txt

Get-VM | select Name, NumCpu, MemoryGB | Export-Csv -path “<path CSV>” -NoTypeInformation

Get-VM | select Name, Description, NumCpu, MemoryGB | sort MemoryGB | Export-Csv -path “<path>” –NoTypeInformation



De momento esto es todo, evidentemente existen un montón de comandos más en PowerCLi para gestionar un entorno de virtualización con Vmware, pero he querido retratar en estos primeros pasos unos cuantos comandos para obtener información sobre el entorno, algo útil por si tenemos que sacar de manera rápida algún resumen de nuestro sistema.

Hasta la próxima entrada!




sábado, 14 de junio de 2014

Errores con Google Apps Directory Sync

Eres administrador de Google Apps? Entonces quizás utilizas la herramienta Directory Sync, para sincronizar información entre los usuarios de un directorio activo de Microsoft y  los usuarios de Google Apps.

Hace poco me encontré con que la herramiento Directory Sync daba un error al realizar la sincronización. Al mirar el log encontré la siguiente información:

[2014-06-09 12:23:21,785] [pool-8-thread-2] [ERROR] [plugin.google.GDataRetryPolicy] Retry attempts exhausted for Updating person Pepito Sánchez, with attempt # 0
[2014-06-09 12:23:21,785] [pool-8-thread-2] [ERROR] [plugin.google.GDataRetryPolicy] Last encountered exception: com.google.gdata.util.InvalidEntryException: Bad Request
External id value can&#39;t be empty.

[2014-06-09 12:23:21,785] [pool-8-thread-2] [DEBUG] [usersyncapp.util.RetryImpl] Retry attempts exhausted for Updating person Pepito Sánchez with attempt # 0

Buscando en Google por este apenas lograba encontrar información, así que decidí rebuscar un poco por micuenta. Como se puede ver en el registro de error los usuarios que tienen problemas son usuarios que tienen un valor nulo en el campo externalIDs. Parece ser una especie de campo libre donde podemos introducir identificadores para nuestros usuarios que funcionen de manera independiente del ID único que tienen en Google Apps. Hasta aquí todo bien si no fuera porque en los usuarios de mi organización este campo ni siquiera lo tienen, ya que si no lo creas expresamente el campo ni existe. Así que me dispuse a buscar qué usuarios podían tener ese campo creado. Puedes consultar los usuarios que te dan problemas des de la web de la API (eso sí, debes tener habilitada la API en tu dominio):

https://developers.google.com/admin-sdk/directory/v1/reference/users/get#try-it

Activamos el interruptor "Authorize requests using OAuth 2.0 " para que nos deje realizar la consulta:


 Poniendo la dirección de correo del usuario problemático en el campo UserKey y dándole al botón "Execute" observo la siguiente respuesta:

200 OK
- Show headers -
{
 [...]
,
 "externalIds": [
  {
   "value": "",
   "type": "organization"
  }
 ],
 [...]
}

Como se puede ver el campo externalIDs (de tipo lista) contiene en mi caso un elemento de tipo "organization" pero con valor NULL, y Google Directory Sync se queja de que ese valor no puede estar vacío.

Así que si modificamos el campo "value" poniéndole un valor cualquiera que no sea null. Lo podemos cambiar desde la siguiente web:

https://developers.google.com/admin-sdk/directory/v1/reference/users/patch#try-it

En el campo UserKey volvemos a poner la dirección de correo de ese usuario, y ponemos el campo "Patch body" en modo Freeform:



 Le ponemos un valor cualquiera de la siguiente forma (hay que poner el editor ):

{
  "externalIds":[
    {
     "value": "xxx",
     "type": "organization"
    }
   ]
}

Después de ejecutar esta consulta el programa dejará de dar error y sincronizará el resto de datos. No sé en qué punto ese campo se ha rellenado, es el misterio que me queda por resolver. Pero en cualquier caso ese es el problema, espero que le sirva a alguien.

Saludos!

lunes, 9 de junio de 2014

VMTools en Debian 7

Hoy voy a explicar como, desde un sistema vSphere,  instalar las VMware Tools en una máquina virtual con la distribución Debian 7, ya que si instalamos una máquina virtual desde cero con esta distribución el proceso no es tan automático como podría ser por ejemplo en un sistema guest Windows. Por supuesto necesitaremos permisos de usuario root para realizar estas acciones.

Para empezar instalaremos el compilador gcc:

apt-get install gcc make

Después instalamos los ficheros de cabecera del kernel que estemos usando:

apt-get install linux-headers-$(uname -r)

Ahora des del cliente de vSphere vamos al menú de la máquina virtual y seleccionamos la opción para instalar/actualizar las VMWare Tools:











En una máquina virtual con Windows esta opción automáticamente lanzaría el instalador de las VMTools, en cambio en Debian deberemos montar manualmente la unidad de CD para acceder al instalador:

mount /dev/sr0  /mnt/

Ahora en el directorio mnt tenemos el fichero tar.gz con el instalador. Lo copiamos a un directorio temporal y lo descomprimimos para acceder al instalador:

cp /mnt/VMwareTools-{version de las tools}.tar.gz /tmp
cd /tmp
tar xvf VMwareTools-{version de las tools}.tar.gz


Al descomprimir se habrá crear un directorio llamado vmware-tools-distrib dentro del direcotio tmp, donde encontraremos el instalador que podremos lanzar, y que nos hará unas cuantas preguntas. Las marco en negrita y indico en rojo una pequeña explicación sobre cada cosa:

/tmp/vmware-tools-distrib/vmware-install.pl

[...]
In which directory do you want to install the binary files?
[/usr/bin]
Directorio donde queremos instalar los binarios, se puede dejar el que sale por defecto

What is the directory that contains the init directories (rc0.d/ to rc6.d/)?
[/etc]
Directorio que contiene los directorios con los niveles de inicialización del arranque del sistema. Se puede dejar por defecto, o si por el motivo que sea los has cambiado deberás indicarlo aquí.

What is the directory that contains the init scripts?
[/etc/init.d]
Directorio con los scripts de arranque de inicio automático

In which directory do you want to install the daemon files?
[/usr/sbin]
Directorio donde queramos instalar los ficheros del demonio de las VMTools, podemos dejar este por defecto

In which directory do you want to install the library files?
[/usr/lib/vmware-tools]
Directorio donde queramos instalar las librerías de las VMTools, se puede dejar este por defecto.
[...]
In which directory do you want to install the documentation files?
[/usr/share/doc/vmware-tools]
Ubicación de los ficheros de documentación, podemos dejar este por defecto.
[...]

Before running VMware Tools for the first time, you need to configure it by
invoking the following command: "/usr/bin/vmware-config-tools.pl". Do you want
this program to invoke the command for you now? [yes]
Ahora tenemos la opción de configurar las VMTools antes de iniciarlas por primera vez
[...]
Searching for GCC...
Detected GCC binary at "/usr/bin/gcc".
The path "/usr/bin/gcc" appears to be a valid path to the gcc binary.
Would you like to change it?
[no] Aquí podemos indicar el path donde está instalado el compilador gcc si no lo ha detectado automáticamente
[...]
The path "/lib/modules/3.2.0-4-amd64/build/include" appears to be a valid path
to the 3.2.0-4-amd64 kernel headers.
Would you like to change it?
[no] Aquí podemos indicar el path donde están almacenados los ficheros de cabecera del kernel que estamos usando, en caso de que no lo detecte automáticamente.
[...]
The VMware Host-Guest Filesystem allows for shared folders between the host OS
and the guest OS in a Fusion or Workstation virtual environment.  Do you wish
to enable this feature? [no]
Aquí podemos cambiar la opción a "yes" si queremos que la máquina virtual tenga activada la funcionalidad de tener carpetas compartidas entre la máquina virtual y el host que la está ejecutando.
[...]
The vmblock enables dragging or copying files between host and guest in a
Fusion or Workstation virtual environment.  Do you wish to enable this feature?
[no]
Aquí podemos cambiar la opción a "yes" si queremos poder copiar ficheros entre la máquina virtual y el cliente simplemente arrastrando ficheros entre ellas.
[...]
Would you like to enable VMware automatic kernel modules?
[no]
Ojo, opción experimental. Nos sirve para activar la compilación automática de los módulos de vmware en caso de actualizar el kernel. Al iniciar el sistema con el nuevo kernel se prepararían los modulos (vmxnet, etc...)
[...]
Enjoy,
--the VMware team

Cuando recibimos el saludo del equipo de VMware significa que hemos acabado la instalación. Hemos finalizado el trabajo, ya tenemos las VMTools instaladas.

jueves, 29 de mayo de 2014

Cambiar Ip sai APC

Hoy pongo otro truco rápido, muy rápido.

Seguramente ya sabréis que muchos Sai's APC vienen con una tarjeta de red la cual podemos conectar con un cable de red para poder gestionar el SAI de manera remota:

http://www.apc.com/resource/include/techspec_index.cfm?base_sku=AP9630CH

Incluso si el SAI no trae esa tarjeta se puede adquirir como componente opcional para poder añadir esa funcionalidad al SAI. Para la configuración inicial, cuando la tarjeta todavía no tiene dirección IP asignada, puede ser que en un momento determinado no dispongamos del cable serie necesario para conectar al SAI y configurar la ip. A través de este truco podemos configurar la dirección ip a través del cable de red. Conectamos un ordenador al SAI a través del cable de red (ya sea mediante switch o cable cruzado) y directamente desde una consola de comandos ejecutamos lo siguiente:

1. Añadimos una entrada ARP para informar al pc de la mac address del SAI (la mac suele venir informada en una pegatina en el sai).

arp -s <dirección ip que le queremos poner al SAI> <MAC address de la tarjeta de red del SAI>

2. Enviamos un ping con un tamaño específico para que el SAI reciba el paquete icmp y se configure la ip

ping 192.168.135.16 -l 113

Y ya lo tenemos! Esta funcionalidad está descrita en la documentación de APC pero no es muy conocida. Desconozco si funciona para todos los modelos de SAI, pero para una configuración rápida no cuesta nada probar!


sábado, 19 de abril de 2014

Cambiar ubicación TempDB

Hola,

Hoy continuamos con otro tema de los fáciles. Si administras algún servidor de base de datos SQL Server sabrás que una de sus bases de datos de sistema es la TempDB. En otra entrada ya explicaré exactamente para que sirve esa base de datos.

Puede ser que alguna vez necesites cambiar la ubicación de esta base de datos para moverla a otra ubicación diferente de la ubicación que se definió al instalar el motor de la base de datos. Pues bien, con unos pocos pasos conseguiremos nuestro objetivo:

Como cualquier base de datos de SQL Server, los archivos de la tempdb tienen unos nombre lógicos que tenemos que saber para poderla mover. Ejecutamos la siguiente consulta:

SELECT name, physical_name FROM sys.master_files WHERE database_id = DB_ID('tempdb');

Esta consulta nos devuelve el nombre que tienen el archivo de datos y el archivo de log:


Una vez ya tenemos los nombres (normalmente y si no lo hemos cambiado, por defecto son tempdev y templog) ya podemos ejecutar las consultas para moverlos:

USE master; 
GO 

ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILENAME = 'path_deseado\tempdb.mdf'); 
GO 
ALTER DATABASE tempdb MODIFY FILE (NAME = templog, FILENAME = 'path_deseado\tempdb.ldf');
 GO

Ojo con no olvidarnos de poner en el path los nombres de archivo (\tempdb.mdf y \tempdb.ldf), si sólo ponemos la carpeta podemos tener consecuencias indeseadas.

Una vez hecho esto sólo nos faltará reiniciar el servicio de SQL Server (la verdad es que no he encontrado manera de mover la TempDB evitando el reinicio, diría que no se puede) y ya lo tenemos.

domingo, 6 de abril de 2014

Ejecutar script al conectar con OpenVPN

Bueno, estrenaremos el blog con un truquillo para la gente que use OpenVPN. Si te has dignado a leer esta entrada asumo que conoces el archiconocido cliente de vpn OpenVPN. A veces nos interesa que al conectar a la VPN se ejecute de manera automática un script, ya sea para mapear una una unidad de red, que se ejecute un programa, yo que sé, mil cosas.

Para realizar esto tenemos dos maneras de hacerlo:
  1. Llamamos a OpenVPN desde la línea de comandos. Para hacerlo así debemos usar parámetros:  --up <ruta al script> --script-security  2 La siguiente opción es más cómoda.
  2. Para dar facilidad a los usuarios de Windows hay gente que usa el programa OpenVPN Gui. Este programa es una senzilla interfaz para llamar al ejecutable de OpenVpn y que el usuario sólo tenga que escribir nombre y contraseña. Pues bien, resulta que si creamos un archivos que se llame client_up.bat y lo metemos en la ubicación donde se encuentre el fichero de configuración de OpenVPN (típicamente en la carpeta c:\archivos de programa\openvpn\config\) OpenVPN Gui lo ejecutará sin que tengamos que hacer nada más. Rápido y sencillo. ¡Pero espere! ¡aún hay más! Podemos definir el tiempo de espera que deseemos para que se ejecute ese script. En la clave del registro  HKEY_LOCAL_MACHINE\SOFTWARE\OpenVPN-GUI\connectscript_timeout podremos introducir en segundos el valor deseado (máximo 90)
A ver si a alguien le sirve de algo el truco del día!

jueves, 3 de abril de 2014

Inicializando el sistema...

Bueno, allá vamos.

Un blog más de entre los miles de millones que colapsan la red...
Si estás buscando un blog diferente, aquí no lo encontrarás.
Si estás buscando un blog con contenido exclusivo, sigue buscando.
Si estás buscando un blog con noticias de corazón, meeeeeec!!!! error!!! Te has equivocado al teclear.

En fin, como explico en la cabecera, he creado este blog para aportar mi granito de arena. Después de la infinidad de veces que rebuscar por Internet me ha dado la solución a un problema, ahora me toca a mí aportar conocimiento que le pueda servir a alguien. Como siempre ando liado con alguna historia de informática, pues la temática habitual será: programación, cacharreo, seguridad, etc...aunque no descarto que pueda publicar cosas sobre otros temas.

Y recuerda, si alguno de los artículos que se publicarán aquí te sirve de algo, estarás en deuda con Internet, no lo olvides. Te toca crear contenido a ti también, sembrar algo para que alguien después pueda recogerlo.

Que vaya bien la cosecha.