Jugando con IIS, Powershell y WebAdministration

Published: Jul 28, 2014 by Noe Nieto

Pagüer Chel!

Intro

Últimamente he tenido oportunidad de configurar varios servidores con IIS 7.5, algunos desde cero. He aprendido un montón acerca de esta tecnología. También he estado haciendo algo de trabajo tipo DevOps y estoy configurando un Jenkins para correr pruebas con Selenium automáticamente después de un commit de SVN simplemente por que las pruebas manuales son aburridas.

Hay algo que quiero probar. Puedo configurar Jenkins para que elimine el directorio de la aplicacion web y haga un checkout limpio de la aplicación desde el SVN, pero me queda la duda de qué pasará con el sitio en IIS si de repente desaparece la carpeta de la aplicación. Así que me pregunté si sería posible controlar IIS mediante PowerShell. La respuesta es SI.

Con el módulo/provider WebAdministration puedo borrar una aplicación del IIS, luego que Jenkins elimine el directorio y haga un checkout limpio desde el SVN y finalmente restablecer la configuración de la aplicación web.

¡Manos a la obra!

Configurar la política de ejecución de scripts

¡Ash! Pues resulta que por default PowerShell se negará a ejecutar scripts o ciertos comandos que signifiquen algún riesgo para el sitema. Es una historia larga y por el momento se interpone en mi objetivo que es controlar IIS con PowerShell y resulta más cómodo desactivar esa política completamente y después regresar a aprender esa parte. Si estas igual de impaciente como yo, sigue estos pasos:

  1. Ejecuta PowerShell como Administrador.

  2. Pon esto en el PowerShell: Set-ExecutionPolicy Unrestricted

  3. Listo

Al abrir de nuevo la consola de PowerShell el resultado de Get-ExecutionPolicy es Unrestricted.

Incluso reiniciando el servidor el resultado deGet-ExecutionPolicy debe ser Unrestricted.

Verificar que WebAdministration este disponible

Esto lo hice con el cmdlet Get-Module -ListAvailable.

PS C:\Windows\system32> Get-Module -ListAvailable

ModuleType Name                      ExportedCommands
---------- ----                      ----------------
Manifest   ADRMS                     {}
Manifest   AppLocker                 {}
Manifest   BestPractices             {}
Manifest   BitsTransfer              {}
Manifest   PSDiagnostics             {}
Manifest   ServerManager             {}
Manifest   TroubleshootingPack       {}
Manifest   WebAdministration         {}


PS C:\Windows\system32>

El modulo esta disponible. Ahora para importarlo:

Import-Module WebAdministration

Probando algunas características

La lista completa de cmdlets esta disponible en MSDN. No pude probar todos, pues mi objetivo es claro, así que sólo probe unos cmdlets para tener una idea de cómo funciona.

El primer comando que probe fue Get-WebConfigFile. Si lo uso en el sitio por default me dice el directorio y el nombre del archivo de configuración del sitio.

PS C:\Windows\system32> Get-WebConfigFile 'IIS:\Sites\Default Web Site'

    Directory: C:\Windows\system32\inetsrv\config

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         7/23/2014   3:38 PM      83583 applicationHost.config

Se me hizo demasiado mágico por que corrió bién al primer intento, además, ¿Qué es eso de IIS:\? ¿Qué pasa si le doy una ruta que no existe?

PS C:\Windows\system32> Get-WebConfigFile 'IIS:\Sites\Default Web Sit'
Get-WebConfigFile : Cannot find path 'IIS:\Sites\Default Web Sit' because it does not exist.
At line:1 char:18
+ Get-WebConfigFile <<<<  'IIS:\Sites\Default Web Sit'
    + CategoryInfo          : ObjectNotFound: (IIS:\Sites\Default Web Sit:String) [Get-WebConfigFile], ItemNotFoundExc
   eption
    + FullyQualifiedErrorId : PathNotFound,Microsoft.IIs.PowerShell.Provider.GetWebConfigCommand

Creo que voy entendiendo. Ya tengo una aplicacion configurada con el nombre recepcion ¿Cuál será el resultado si pido el archivo de configuración de IIS:\Sites\Recepcion?

PS C:\Windows\system32> Get-WebConfigFile 'IIS:\Sites\Default Web Site\recepcion'

    Directory: C:\inetpub\wwwroot\recepcion

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         7/23/2014   8:55 AM       4753 web.config

Tengo una aplicacion que se llama Recibos actualizada desde el SVN, pero no la he convertido en aplicación desde el IIS Manager ¿Qué pasará si pido el archivo de configuración de esa aplicación que todavía no esta configurada?

PS C:\Windows\system32> Get-WebConfigFile 'IIS:\Sites\Default Web Site\recepcion'

    Directory: C:\inetpub\wwwroot\recepcion

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---         7/24/2014   9:02 AM       4678 web.config

¡Aha! Parece que algunas partes no son tan sofisticadas. Suficientes pruebas.

Ahora quiero saber cómo configurar esa carpeta como una aplicación en el sitio. Una leída rápida a la lista de cmdlets y encuentro ConvertTo-WebApplicacion. Incluso tiene un ejemplo de cómo se usa. Al final, resultó ser muy fácil y son sólamente dos pasos.

Primero, crear un directorio virtual que apunte a la carpeta de Recepción.

PS C:\Windows\system32> New-WebVirtualDirectory -Site "Default Web Site" -Name Recepcion -PhysicalPath C:\InetPub\wwwroot\recepcion

Name                                                        PhysicalPath
----                                                        ------------
Recepcion                                                     C:\InetPub\wwwroot\recepcion

Y luego convertir el sitio virtual en una aplicación:

PS C:\Windows\system32> ConvertTo-WebApplication "IIS:\Sites\Default Web Site\recepcion"

Name             Application pool   Protocols    Physical Path
----             ----------------   ---------    -------------
Recepcion          DefaultAppPool     http         C:\InetPub\wwwroot\recepcion

¡Listo!

Pero falta algo. Hice las cosas al reves, por que ya tengo el comando para configurar el sitio, ahora me falta el comando para desconfigurarlo. Pero no es tan dificil, sólamente hace falta hacer la misma operación que hice al principio, pero al revés. Primero, uso Remove-Application

Remove-WebApplication -Name recepcion -Site "Default Web Site"

Después

Remove-WebVirtualDirectory -Site "Default Web Site" -Application "/" -Name "recepcion"

Ya con eso es suficiente para “desconfigurar” el sitio. Jenkins se encargara de borrar y hacer el checkout del proyecto desde el SVN.


Nota: No recuerdo de donde saque la imagen de portada. Si alguien sabe, avisenme para poner bien los créditos.

Share