martes, 16 de agosto de 2011

Nota técnica: Autoconfiguración de Máquinas virtuales.

Las capacidades de cloning de vSphere no son un secreto. La posibilidad de desplegar una nueva máquina virtual desde otra definida como plantilla, con las opciones de personalización definidas previamente como "Customization Specification" suponen un gran ahorro de tiempo y de nivel deautomatización de despliege.

Una "Customization Specification" no es más que un fichero de respuestas sysprep "inyectado" en la VM destino para que está se configure de determinada manera, en especial en lo relacionado al nombre, pertenencia al dominio o configuración IP.

Sin embargo, sysprep puede dejarnos el trabajo a medias. Me explico.

Si nuestra VM origen tiene, por ejemplo, varios discos duros con unas asignaciones de letras determinadas, estas desaparecerán con el sysprep, siendo sustituidas por las asignaciones por defecto. Si hemos modificado cosas como el swap, (tamaño o localización), también estas configuraciónes se revertirán a sus valores por defecto.

Evidentemente no es nada que no pueda ser solucionado con powershell, GPOs o con intervención manual. Sin embargo, hay entornos donde modificar las GPO no depende de nosotros, o powershell no puede ser usado por normativa interna. El caso que nos ocupa es el siguiente:

Por definición los servidores del entorno que nos ocupa deben tener la siguiente configuración de disco:
  • C: Arranque
  • D: Datos
  • S: swap
  • T: Temporales de sistema y usuarios.

Además, el archivo de swap debe tener un tamaño fijo de 1.5 veces la RAM del sistema.

Por otro lado, el escritorio de la VM debe estar organizado de la siguiente manera:
Icono "Computer": Debe tener como etiqueta el nombre del sistema
Fondo de pantalla: Con BGInfo. debe actualizarse cada vez que se loguea un usuario.

En este caso, en el que el cliente usa McAfee ePO, eliminamos el GUID del agente para que pueda registrarse correctamente en la consola. Así mismo, deshabilitamos el firewall en el perfil de Dominio.

Por requerimientos de la instalación, no podemos usar ni GPOs ni powershell.
Vaya, todo un problema. Por suerte podemos echar mano de las herramientas de línea de comando de Windows 2008R2 (insuperables) y de nuestros maravillosos archivos .bat (o .cmd)

¿Qué hicimos?

Respecto a la máquina virtual, decidimos equiparla con dos controladoras SCSI, una de ellas LSILOGIC y la otra Paravirtual, para aprovechar las ventajas del driver sintético de disco, quedando el disco de arranque en la primera, y el resto de los discos en la segunda. Así mismo, definimos el disco dedicado a temporales como no persistente, lo que nos permite, por una parte, limpiar nuestro servidor cada vez que lo apaguemos, y por otra, evitar que el disco de temporales crezca en exceso quitándonos las ventajas del thin provisioning (recordad que el espacio borrado no se recupera de manera automática)

En primer lugar, crear una customization specification con las siguientes características:



Destaco en rojo los dos parámetros necesarios para el caso que os propongo: El autologin count, que nos permitirá que el usuario administrador de loguee automáticamente tras acabar el despliegue UNA SOLA VEZ, y el GUI run once command, que nos permitirá que en ese login se ejecute nuestro script. Sobra decir que este debe estar previamente en la VM plantilla.

Código, código...

Aquí va el código del script.


:vars
set tdrive=t
set sdrive=s
@echo off
:start
if a%1 == a/install goto install
@echo Personalizando
:mktemp
@if not exist %tdrive%:\temp.usr\%username% mkdir %tdrive%:\temp.usr\%username%
@reg add HKCU\environment /v TMP /t REG_EXPAND_SZ /d "%tdrive%:\temp.usr\%username%" /f > nul
@reg add HKCU\environment /v TEMP /t REG_EXPAND_SZ /d "%tdrive%:\temp.usr\%username%" /f > nul
set temp=%tdrive%:\temp.usr\%username%
set tmp=%tdrive%:\temp.usr\%username%
:MyPcIcon
@reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D} /ve /t REG_SZ /d %computername% /f > nul
@reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\HideDesktopIcons\NewStartPanel /t REG_DWORD /v {20D04FE0-3AEA-1069-A2D8-08002B30309D} /d 0 /f > nul
:Background
c:\tools\bginfo /timer:0 /nolicprompt c:\tools\omt.bgi
goto end
:install
:fwdomdisable
@echo Desactivar firewall en dominio
@netsh advfirewall set domainprofile state off
:tempdrive
@echo Configurando disco temporal y de swap a %tdrive%:\
wmic computersystem where name="%computername%" set AutomaticManagedPageFile=False
@if exist %sdrive%:\pagefile.sys wmic pagefileset where name="%sdrive%:\\pagefile.sys" delete > nul

@echo select volume 5 > c:\tools\swapdrive.dsk
@echo assign letter %sdrive% >> c:\tools\swapdrive.dsk
@diskpart /s c:\tools\swapdrive.dsk > nul

@echo select volume 3 > c:\tools\tempdrive.dsk
@echo assign letter %tdrive% >> c:\tools\tempdrive.dsk
@diskpart /s c:\tools\tempdrive.dsk > nul

@echo Setting Configurando variables TEMP y TMP del sistema
@reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v TEMP /t REG_SZ /d "%tdrive%:\temp.sys" /f > nul
@reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v TMP /t REG_SZ /d "%tdrive%:\temp.sys" /f > nul
:swapfile
@echo setting System swap
@for /f "tokens=*" %%a in ('wmic computersystem get TotalPhysicalMemory^ /Value ^| find "="') do (set var.%%a)
@set vargb1=%var.TotalPhysicalMemory:~0,-7%
@set /a vargb2=%vargb1%/1024
@set /a swapsize=%vargb2%*1024
@set /a swapsize=%swapsize%+(%swapsize%/2)
@echo Configurando swap a %swapsize% MB
@wmic computersystem where name="%computername%" set AutomaticManagedPageFile=False > nul
@wmic pagefileset create name="%sdrive%:\pagefile.sys"
@wmic pagefileset where name="%sdrive%:\\pagefile.sys" set InitialSize=%swapsize%,MaximumSize=%swapsize% > nul
@if exist c:\pagefile.sys wmic pagefileset where name="c:\\pagefile.sys" delete > nul
:McAfee
@echo detecting MCAfee Products
@reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\ePolicy Orchestrator\Agent" /v AgentGUID > nul
if errorlevel 1 goto reboot
if errorlevel 0 goto deleteGUID
:deleteGUID
@echo Detectado ePO¡¡ - Borrando GUID
@reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Network Associates\ePolicy Orchestrator\Agent" /v AgentGUID > nul
:REBOOT
shutdown /r /t 0
:end

El script contiene dos secciones, que se invocarán dependiendo del parámetro que le pasemos al invocarlo.

Si no le pasamos ninguno, el script se limitará a verificar que los directorios temporales del usuario existen y a configurar las variables de entorno del sistema (Sí, sé que en lugar de set podía haber utilizado xset) Así mismo, renombra el icono "Computer" y se asegura de que éste se muestre en el escritorio.

La segunda parte sólo se ejectuta si el script es invocado con el parámetro "/install".

Etiqueta :vars

Aquí definimos las variables que vamos a utilizar: %sdrive% para la letra del disco de swap y %tdrive% para las letras del disco temp

Etiqueta :fwdomdisable

En esta parte, desactivamos el firewall en el perfíl "Dominio" mediante netsh advfirewall

Etiqueta :tempdrive

Esta etiqueta elimina el pagefile existente (nos libera espacio del disco C). Para ello, dejamos al sistema temporalmente sin swap y procedemos a borrar el pagefile.sys que, por defecto, tendrá la máquina en C:

En esta fase, aprovechamos para "reordenar" los discos según especificaciones, con los valores especificados en %tdrive y %sdrive. Para ello, echaremos mano de diskpart y su capacidad de recibir órdenes desde un fichero (parámetro /s). Este fichero lo hemos creado "on the fly". Los números de volumen (3 y 5) dependerán de cada sistema. En el que nos ocupa, los discos creados para temp y swap ocupaban el 3 y el 5 respectivamente). Una vez asignadas las letras correspondientes, modificamos las variables TMP y TEMP del sistema.

Etiqueta :swapfile

Ahora a lo gordo... esta parte del script creamos el nuevo archivo de swap. Para ello, utilizamos el comando wmic (que nos dá acceso a la instrumentación de windows desde línea de comando) y las capacidades "aritméticas" del CMD de Windows.

Etiqueta :McAfee

Aquí detectamos si existe la entrada de registro del ePO de McAfee. Si existe (lo detectamos con errorlevel) saltamos a la etiqueta :deleteGUID que la borrará, forzando al agente a generar una nueva.

Etiqueta :REBOOT
Forzamos un reboot del sistema

Etiqueta :end
¡Esto es todo, amigos!

Resumen.

Este script es sólo un esqueleto, y pueden añadirse más funciones (instalación de software, por ejemplo o de roles del servidor) de forma que una vez desplegada nuestra nueva VM la tarea manual sea la mínima posible.

Esto es todo por ahora.... ¡¡ Buena semana!!