Novedades SQL Server

Novedades Joomla

Informática SpectraFutura

 

 

Informatica SpectraFutura

 

 

¡Atención! Este sitio usa cookies y tecnologías similares.

Si no cambia la configuración de su navegador, usted acepta su uso.

Acepto

Configuración compartida en granjas de servidores en IIS7

Publicado en Microsoft Internet Information Server ( IIS ) Martes, 24 Noviembre 2015
Valora este artículo
(0 votos)

Cuando tenemos una granja de servidores Web, en este caso IIS, en la que tenemos publicadas aplicaciones, surgen tareas de mantenimiento o actualizaciones de las mismas que se requiere trasladar a todas las máquinas que forman la granja.

 

Aparte de tener que mantener el código fuente de las aplicaciones homogeneo en todas las máquinas de la granja, tambien nos corresponde mantener igualmente la configuración de cada aplicación igual en todos los nodos.

Sino se tuviera así, las aplicaciones se comportarían de manera diferente, o no funcionarían, según el nodo que te contestara, si existe un balanceador para repartir peticiones entre nodos.

Con el objetivo de preservar la igualdad en la configuración de los sitios en todos los nodos de la granja, se han valorado las siguientes opciones:

 

-    Uso de la Configuración Compartida en un recurso DFS centralizado :


     Descartada en principio por añadir un punto adicional de fallo a la infraestructura IIS: La configuración del IIS se guarda en memoria, en caso de reinicio de un nodo si por alguna razón el recurso compartido no estuviera disponible, la aplicación fallaría. Esto se produce en granjas con Windows Server 2003 y Windows Server 2008. En Windows Server 2008 R2, la perdida de conexión con DFS no produciría fallo en IIS.


-    Uso de la Configuración Compartida del nodo principal en los nodos secundarios:


     Elegimos esta opción ya que no requiere la complejidad de una estructura DFS y elimina la posibilidad de fallo por perdida de conexión con el DFS.

 

 

USO DE LA CONFIGURACIÓN COMPARTIDA DE IIS7 DEL NODO PRINCIPAL EN LOS NODOS SECUNDARIOS

 

El funcionamiento se basa en la ejecución programada de una tarea en la que se ejecutará un script que realizará los siguientes subprocesos:

 

1.    ExportacionConfiguracionIIS7.bat (inicio del proceso)

  1. %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe set-executionpolicy -scope CurrentUser -executionPolicy unrestricted -force
  2. %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe "C:\TareasProgramadas\ExportacionConfiguacionIIS7\ExportacionConfIIS7.ps1"
  3. cscript /B C:\TareasProgramadas\ExportacionConfiguacionIIS7\replica_contenidos.vbs /recurso:webContent /destino1:maquinaIIS1 /destino2:maquinaIIS2 /destino3:maquinaIIS3

 

Este bat es el principal desde donde se irán llamando a los scripts secundarios:

1ª línea donde nos aseguramos libertad para poder ejecutar comandos powershell sin restricciones.

2ª línea ( ExportacionConfIIS7.ps1 ) donde ejecutamos script de powershell dode se hace backup de la configuración y dejamos los archivos resultantes en una ruta dentro de las carpetas de publicación de IIS. Estas carpetas de publicación deberán estár debidamente securizadas.

3ª línea ( replica_contenidos.vbs ) donde replicamos estos archivos de configuración a las carpetas de publicación de los demás nodos.

 


2.    ExportacionConfIIS7.ps1 (exportación de configuración)

  1. Import-Module WebAdministration
  2. $dates= get-date -format ddMMyyyy_HH_mm
  3. Backup-WebConfiguration -Name PRODUCCION-IIS7-INTRANET_$dates
  4. copy C:\Windows\System32\inetsrv\backup\PRODUCCION-IIS7-INTRANET_$dates\administration.config C:\inetpub\webContent\config_nodos
  5. copy C:\Windows\System32\inetsrv\backup\PRODUCCION-IIS7-INTRANET_$dates\applicationHost.config C:\inetpub\webContent\config_nodos
  6. Remove-WebConfigurationBackup -Name PRODUCCION-IIS7-INTRANET_$dates
  7. remove-item -path C:\Windows\System32\inetsrv\backup\PRODUCCION-IIS7-INTRANET_$dates -force -confirm:$False -recurse
  8. set-executionpolicy -scope CurrentUser -executionPolicy restricted -force

 

Hay que tener en cuenta que en el fichero administration.config se guardan referencias de seguridad propias de cada máquina, con lo que en entornos con validación Kerberos, al importar estos ficheros completos en otras máquinas, pudieran observarse comportamientos indeseados. En este caso habría que contemplar la exportación parcial con powershell o appcmd de pools y websites de forma independiente.

 

3.    replica_contenidos.vbs (replicación de los archivos de configuración)

 

  1. ' Replicación de ficheros entre diferentes nodos con Robocopy
  2. on error resume next
  3.  
  4. dim objFSO, wshShell, colArgumentos, strTiempo
  5. dim strRecurso, strFormato, strArg, strDestino, strComando, strOpciones, fechBorrado, contador
  6. Public dia, dia0, mes, ano ' Variables que contendran en todo momento el dia, mes y año actual.
  7.  
  8. CRLF = Chr(13) & Chr(10)
  9.  
  10. const retencion_logs = -5 ' Periodo de retención en días que se guardarán los logs, los anteriores se borrarán
  11. ' a la hora en la que se envíe la estadistica.
  12.  
  13.  
  14. DirLogs = AppPath & "logs"
  15.  
  16.  
  17. ' *************************************************************************************************************
  18. ' PROCEDIMIENTO PRINCIPAL
  19. '*************************************************************************************************************
  20.  
  21. ' Crea el directorio de log en caso de ser necesario
  22. Set wshShell = CreateObject ("wscript.shell")
  23. Set fso = CreateObject("Scripting.FileSystemObject")
  24. Set fslog = CreateObject("Scripting.FileSystemObject")
  25. 'Comprobamos si existe la carpeta de log
  26. If (fso.FolderExists(DirLogs)) Then
  27. 'Msgbox DirLogs & " exists."
  28. Else
  29. fso.CreateFolder(DirLogs)
  30. End If
  31.  
  32.  
  33.  
  34. Set colArgumentos = WScript.Arguments.Named
  35.  
  36. strFormato=wscript.scriptname & " /Recurso: /Destino1: [... /DestinoN:]"
  37.  
  38. strOpciones="/MIR " ' Sincroniza carpetas equivale a /E /PURGE
  39. 'strOpciones=strOpciones & "/SEC " ' copia ficheros con seguridad equivalente a /COPY:DATS
  40. 'strOpciones=strOpciones & "/E " ' Copia subdirectorios incluidos vacios
  41. 'stropciones=strOpciones & "/PURGE " ' Borra ficheros/directorios que no existen en el origen
  42. stropciones=strOpciones & "/COPY:DATOU "' Copia la información de los ficheros indicada
  43. 'strOpciones=strOpciones & "/COPYALL " ' Copia info del fichero: (D=Data, A=Attributes, T=Timestamps, S=Security=NTFS ACLs, O=Owner info, U=aUditing info)
  44. strOpciones=strOpciones & "/NP " ' No Progress. Sin % de evolución
  45. strOpciones=strOpciones & "/W:1 " ' Segundos de espera antes de....
  46. strOpciones=strOpciones & "/R:0 " ' El número de reintentos
  47.  
  48.  
  49. if colArgumentos.Exists("Recurso") Then
  50. strRecurso=colArgumentos("Recurso")
  51. else
  52. Evento "Parámetro 'Recurso' no indicado. Formato correcto: " & strFormato,1
  53. wscript.quit
  54. end if
  55.  
  56. for each strArg in colArgumentos
  57.  
  58. if left(ucase(strArg),7)="DESTINO" then
  59. strDestino=colargumentos(strArg)
  60.  
  61. 'Crea el fichero de log
  62. FechaFormat = Fecha()
  63. LogFile = AppPath & "Logs\" & FechaFormat & "_" & strDestino & ".log"
  64. Set tsTextFile = fslog.CreateTextFile(LogFile, True)
  65. tsTextFile.writeline NOW & "-> Inicio Log"
  66. tsTextFile.Close
  67. EscribeLog("INICIO SINCRONIZACION DE CONTENIDOS ")
  68. EscribeLog("==================================================")
  69. EscribeLog("Recurso: " & strRecurso)
  70. EscribeLog("Destino: " & strDestino)
  71. EscribeLog("Opciones: " & strOpciones)
  72.  
  73.  
  74. '
  75. strOpcion=strOpciones & "/NDL /X /LOG+:" & LogFile ' Fichero de log
  76. '
  77. strComando="cmd /c robocopy C:\inetpub\" & strRecurso & " \\" & strDestino & "\" & strRecurso & " " & strOpcion
  78.  
  79. EscribeLog("Ejecutando... " & strComando)
  80.  
  81. wshShell.run strComando, 0, True
  82. EscribeLog("FIN SINCRONIZACION DE CONTENIDOS ")
  83. EscribeLog("==================================================")
  84. EscribeLog ("Borrado de los ficheros LOG anteriores a " & retencion_logs & " días respecto a hoy " & dia0 & "-" & mes & "-" & ano)
  85.  
  86. end if
  87. next
  88.  
  89.  
  90. ' Borrado de los logs anteriores
  91.  
  92. fechBorrado = DateAdd("d", retencion_logs, dia0 & "-" & mes & "-" & ano)
  93. comando = "cscript //nologo " & AppPath & "borrar-ficheros-hasta-fecha.vbs """ & DirLogs & """ """ & fechBorrado & """"
  94. EscribeLog ("Comando: " & comando)
  95. wshShell.Run comando, 0, True 'Se ejecuta y espera a terminar (True), en modo visible (1) ???
  96.  
  97. EscribeLog("FIN DEL SCRIPT ")
  98. EscribeLog("==================================================")
  99.  
  100.  
  101.  
  102.  
  103. '**********************************************
  104. Function EscribeLog(Linea)
  105. '**********************************************
  106. ' Envía log a fichero y a pantalla
  107. '**********************************************
  108. on error resume next
  109. Set tsTextFile = fslog.OpenTextFile(LogFile, 8, True)
  110. tsTextFile.WriteLine NOW & "-> " & Linea
  111. tsTextFile.Close
  112.  
  113. End Function
  114.  
  115.  
  116. '**************************************************
  117. function Fecha()
  118. '**************************************************
  119. ' Compone el nombre en formato TIPO_X_DDMMYYYY_HHMM
  120. '**************************************************
  121. on error resume next
  122. 'Compone la fecha actual
  123. If oArgs.Count = 0 Then
  124. fech = date
  125. else
  126. fech = oArgs.item(0)
  127. end if
  128. ano = datepart("yyyy",fech)
  129. diaN = datepart("d",fech)
  130. dia = datepart("d",fech)
  131. dia0 = datepart("d",fech)
  132. if len(dia0) = 1 then dia0 = "0" & dia0
  133. if len(dia) = 1 then dia = "0" & dia
  134. mes = datepart("m",fech)
  135. if len(mes) = 1 then mes = "0" & mes
  136.  
  137. 'Compone la hora actual
  138. horaact = time
  139. hora = datepart("h",horaact)
  140. if len(hora) = 1 then hora = "0" & hora
  141. minutos = datepart("n",horaact)
  142. if len(minutos) = 1 then minutos = "0" & minutos
  143. numdiasem = weekday(fech) 'Devuelve el número de día en la semana
  144. diasem = MID("DLMXJVS",numdiasem,1) ' Lo transforma a letra correspondiente
  145.  
  146.  
  147. if diasem = "L" then diasemana = "LUNES"
  148. if diasem = "M" then diasemana = "MARTES"
  149. if diasem = "X" then diasemana = "MIERCOLES"
  150. if diasem = "J" then diasemana = "JUEVES"
  151. if diasem = "V" then diasemana = "VIERNES"
  152. if diasem = "S" then diasemana = "SABADO"
  153. if diasem = "D" then diasemana = "DOMINGO"
  154. CalculaMes( mes )
  155. FechaInforme = "Fecha de informe: " & dia & "/" & mes & "/" & ano
  156. FechaAct = dia & "/" & mes & "/" & ano
  157. DirFecha = dia & "_" & mes & "_" & ano & "_" & diasemana
  158. Fecha = ano & "_" & mes & "_" & dia & "_" & diasemana & "_" & Replace(time, ":", "-")
  159. end function
  160.  
  161.  
  162.  
  163. '********************************************************************
  164. '** Funcion para obtener el nombre del mes **
  165. '********************************************************************
  166. function CalculaMes( mesi )
  167.  
  168. if len(mesi) = 1 then mesi = "0" & mesi
  169. if mesi = "01" or mesi = "1" then
  170. CalculaMes = "ENERO"
  171. elseif mesi = "02" or mesi = "2" then
  172. CalculaMes = "FEBRERO"
  173. elseif mesi = "03" or mesi = "3" then
  174. CalculaMes = "MARZO"
  175. elseif mesi = "04" or mesi = "4" then
  176. CalculaMes = "ABRIL"
  177. elseif mesi = "05" or mesi = "5" then
  178. CalculaMes = "MAYO"
  179. elseif mesi = "06" or mesi = "6" then
  180. CalculaMes = "JUNIO"
  181. elseif mesi = "07" or mesi = "7" then
  182. CalculaMes = "JULIO"
  183. elseif mesi = "08" or mesi = "8" then
  184. CalculaMes = "AGOSTO"
  185. elseif mesi = "09" or mesi = "9" then
  186. CalculaMes = "SEPTIEMBRE"
  187. elseif mesi = "10" then
  188. CalculaMes = "OCTUBRE"
  189. elseif mesi = "11" then
  190. CalculaMes = "NOVIEMBRE"
  191. elseif mesi = "12" then
  192. CalculaMes = "DICIEMBRE"
  193. end if
  194.  
  195.  
  196. end function
  197.  
  198. '***************************************************************************************
  199. '****************** Funcion que me devuelve la ruta que contiene al script *********************
  200. '***************************************************************************************
  201. Function AppPath
  202. AppPath = Replace(WScript.ScriptFullName, WScript.ScriptName, "")
  203. ' Básicamente es "quita del nombre absoluto del script el nombre simple"
  204. ' "c:\tomaya\ejemplo.vbs" - "ejemplo.vbs" = "c:\tomaya\"
  205. End Function
  206.  

 

Este script borrar-ficheros-hasta-fecha.vbs de aqui abajo solo sirve de apoyo para no tener que mantener los logs generados a diario, de autoría desconocida ha sido localizado por Internet.

 4.    borrar-ficheros-hasta-fecha.vbs : mantenimiento automático de logs de la carpeta C:\TareasProgramadas\ExportacionConfiguacionIIS7\logs (dejará los logs de los últimos 5 días)

  1. '* borrar-ficheros-hasta-fecha.vbs *
  2. '* *
  3. '* Basado en un script m? anterior, este script sirve para borrar *
  4. '* ficheros cuya fecha de ?tima modificaci? sea igual o anterior a *
  5. '* una fecha pasada como par?etro. Permite tambi? que el borrado sea *
  6. '* recursivo (no s?o se borran los ficheros de la carpeta pasada como *
  7. '* par?etro, si no tambien todos aquellos que est? en el ?bol cuya *
  8. '* ra? es esa misma carpeta). Por ?timo, permite especificar que *
  9. '* s?o se borren aquellos ficheros con determinadas extensiones o *
  10. '* s?o aquellos que no tienen determinadas extensiones. *
  11. '* *
  12. '* Sintaxis *
  13. '* *
  14. '* cscript [//nologo] borrar-ficheros-hasta-fecha.vbs [/R] *
  15. '* [/E:extensiones] [/X:extensiones] [/?] ruta fecha *
  16. '* *
  17. '* Siendo *
  18. '* *
  19. '* - ruta (Requerido): *
  20. '* Ruta de la carpeta en la que se borrar? los ficheros que *
  21. '* en ella se ubiquen. *
  22. '* *
  23. '* - fecha (Requerido): *
  24. '* Fecha en formato DD/MM/YYYY; todos los ficheros que tengan *
  25. '* su fecha de ?tima modificaci? igual o anterior a ?ta, *
  26. '* ser? los borrados. *
  27. '* *
  28. '* - /R: borrado recursivo (Opcional): *
  29. '* Si se pasa este modificador el borrado ser?recursivo (se *
  30. '* borrar? todos los archivos contenidos en el ?bol de *
  31. '* carpetas cuya ra? es la pasada como par?etro). *
  32. '* *
  33. '* - /E: extensiones (Opcional): *
  34. '* Lista de extensiones, separadas por comas, de los ficheros *
  35. '* que se borrar?; todos los ficheros cuyas extensiones no *
  36. '* est? incluidas en esta lista no ser? borrados. *
  37. '* *
  38. '* - /X: extensiones (Opcional): *
  39. '* Lista de extensiones, separadas por comas, de los ficheros *
  40. '* que no se borrar?; todos los ficheros cuyas extensiones no *
  41. '* est? incluidas en esta lista ser? borrados. *
  42. '* *
  43. '* *
  44. '* Ejemplos: *
  45. '* *
  46. '* - Se borrar? todos los ficheros ubicados en la carpeta *
  47. '* "c:\orcos\difuntos" que tengan como fecha de ?tima modificaci? *
  48. '* una fecha igual o anterior a "20/02/2002": *
  49. '* *
  50. '* cscript //nologo borrar-ficheros-hasta-fecha.vbs *
  51. '* "c:\orcos\difuntos" "20/02/2002" *
  52. '* *
  53. '* - Se borrar? todos los ficheros en el ?bol de carpetas cuya ra? *
  54. '* es la carpeta "c:\orcos\difuntos" que tengan como fecha de ?tima *
  55. '* modificaci? una fecha igual o anterior a "20/02/2002": *
  56. '* *
  57. '* cscript //nologo borrar-ficheros-hasta-fecha.vbs /R *
  58. '* "c:\orcos\difuntos" "20/02/2002" *
  59. '* *
  60. '* - Se borrar? todos los ficheros en el ?bol de carpetas cuya ra? *
  61. '* es la carpeta "c:\orcos\difuntos" que tengan como fecha de ?tima *
  62. '* modificaci? una fecha igual o anterior a "20/02/2002" y cuyas *
  63. '* extensiones sean wmv,asf,mpg: *
  64. '* *
  65. '* cscript //nologo borrar-ficheros-hasta-fecha.vbs /R /E:wmv,asf,mpg *
  66. '* "c:\orcos\difuntos" "20/02/2002" *
  67. '* *
  68. '* - Se borrar? todos los ficheros en el ?bol de carpetas cuya ra? *
  69. '* es la carpeta "c:\orcos\difuntos" que tengan como fecha de ?tima *
  70. '* modificaci? una fecha igual o anterior a "20/02/2002" y cuyas *
  71. '* extensiones no sean doc,txt,xls: *
  72. '* *
  73. '* cscript //nologo borrar-ficheros-hasta-fecha.vbs /R /X:doc,txt,xls *
  74. '* "c:\orcos\difuntos" "20/02/2002" *
  75. '* *
  76. '* *
  77. '* *
  78. '*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  79.  
  80. 'Exigimos la declaraci? de variables
  81. Option Explicit
  82.  
  83. Dim str_Error 'As String
  84. Dim int_Error 'As String
  85. Dim str_Ruta 'As String
  86. Dim dth_Fecha 'As Date
  87. Dim bol_Recursivo 'As Boolean
  88. Dim arr_Incluidas 'As String
  89. Dim arr_Excluidas 'As String
  90.  
  91. bol_Recursivo = False
  92.  
  93. 'Validando los argumentos y almacenando
  94. 'sus valores
  95. If f_RevisarArgumentos( _
  96. str_Error, _
  97. int_Error) Then
  98.  
  99. Call s_Ayuda(str_Error)
  100. WScript.Quit int_Error
  101.  
  102. End If
  103.  
  104. Call s_BorrarFicheros(str_Ruta,dth_Fecha,bol_Recursivo)
  105.  
  106. Sub s_BorrarFicheros(str_Ruta, dth_Fecha, bol_Recursivo)
  107. '***********************************************************************
  108. '* Procedimiento: s_BorrarFicheros *
  109. '* Tipo : Funci? *
  110. '* Devoluci? : Booleana *
  111. '* Prop?ito : Este m?odo borra los ficheros contenidos en la *
  112. '* carpeta especificada por el par?etro str_Ruta, *
  113. '* pero s?o borra aquellos cuya fecha de ?tima *
  114. '* modificaci? sea igual o anterior a la especificada *
  115. '* por el par?etro dth_Fecha. Si el par?etro *
  116. '* bol_Recursivo es pasado, el m?odo realiza una *
  117. '* llamada recursiva, lo que provoca que el borrado se *
  118. '* produzca en todo el ?bol de carpetas cuya ra? es *
  119. '* la que especifica el par?etro str_Ruta. Si se ha *
  120. '* pasado alguno de los par?etros de inclusi? o *
  121. '* exclusi? de extensiones, el m?odo borrar?los *
  122. '* ficheros de extensi? las incluidas o de extensi? *
  123. '* diferente de las excluidas, seg? el caso. *
  124. '***********************************************************************
  125.  
  126. Dim obj_FSO 'As Scripting.FileSystemObject
  127. Dim obj_Carpeta 'As Scripting.Folder
  128. Dim obj_Fichero 'As Scripting.File
  129. Dim bol_Borrar 'As Boolean
  130.  
  131. 'Creamos el objeto FileSystemObject
  132. Set obj_FSO = CreateObject("Scripting.FileSystemObject")
  133.  
  134. 'Comprobamos que la ruta recibida sea v?ida
  135. If not obj_FSO.FolderExists(str_Ruta) Then
  136.  
  137. WScript.Echo "Error 8: La carpeta " & str_Ruta & _
  138. " recibida como par?etro no existe."
  139. Set obj_FSO = Nothing
  140. WScript.Quit 2
  141.  
  142. End If
  143.  
  144. 'Comprobamos que la fecha recibida sea v?ida
  145. If not IsDate(dth_Fecha) Then
  146.  
  147. WScript.Echo "Error 16: La fecha " & dth_Fecha & _
  148. " recibida como par?etro no es una fecha v?ida."
  149. Set obj_FSO = Nothing
  150. WScript.Quit 3
  151.  
  152. End If
  153.  
  154. 'Obtenemos el objeto carpeta
  155. Set obj_Carpeta = obj_FSO.GetFolder(str_Ruta)
  156.  
  157. 'Recorremos los ficheros contenidos en la carpeta
  158. For Each obj_Fichero In obj_Carpeta.Files
  159.  
  160. 'Comprobamos que la fecha de ?tima modificaci? del fichero
  161. 'sea anterior o igual a la recibida como par?etro
  162. If DateValue(obj_Fichero.DateLastModified) <= _
  163. DateValue(dth_Fecha) Then
  164.  
  165. 'Ponemos a true la booleana que nos indica si el fichero
  166. 'ser?o no borrado
  167. bol_Borrar = True
  168.  
  169. 'Si se ha pasado la lista de extensiones a borrar
  170. If WScript.Arguments.Named.Exists("E") Then
  171.  
  172. 'Ponemos la devoluci? de la funci? que mira si la
  173. 'extensi?n est?incluida en el array de extensiones
  174. 'a borrar
  175. bol_Borrar = f_EstaExtension(arr_Incluidas, _
  176. obj_FSO.GetExtensionName(obj_Fichero.Name))
  177.  
  178. ElseIf WScript.Arguments.Named.Exists("X") Then
  179.  
  180. 'Ponemos la inversa de la devoluci? de la funci?
  181. 'que mira si la extensi?n est?incluida en el
  182. 'array de extensiones a no borrar; de esa manera,
  183. 'si la extensi? est?en el array, bol_Borrar
  184. 'quedar?como False y el fichero no se borrar? y
  185. 'en caso de no estar en el array, bol_Borrar
  186. 'quedar?como True y el fichero se borrar?
  187. bol_Borrar = Not(f_EstaExtension(arr_Excluidas, _
  188. obj_FSO.GetExtensionName(obj_Fichero.Name)))
  189.  
  190. End If
  191.  
  192. 'Vemos ahora si el fichero ha de ser borrado o no
  193. If bol_Borrar Then
  194. 'En caso afirmativo, mostramos el nombre y fecha del fichero
  195. 'y lo borramos
  196. WScript.Echo "Borrando " &amp; obj_Fichero.Name &amp; _
  197. ": Modificado el " &amp; _
  198. obj_Fichero.DateLastModified
  199. 'Borramos el fichero incluso en el caso de ser de sistema, si
  200. 'quisi?amos que no se borren los de sistema, tan s?o
  201. 'debemos eliminar el True o sustituirlo por False
  202. obj_Fichero.Delete True
  203.  
  204. End If
  205.  
  206. End If
  207.  
  208. Next
  209.  
  210. 'Si queremos que se recorra todo el sub?bol de carpetas...
  211. If bol_Recursivo Then
  212.  
  213. 'Definimos un objeto para las subcarpetas
  214. Dim obj_Subcarpeta
  215.  
  216. 'Recorremos las subcarpetas en este bucle
  217. For Each obj_Subcarpeta In obj_Carpeta.Subfolders
  218.  
  219. 'Llamada recursiva para borrar los ficheros de la
  220. 'subcarpeta
  221. Call s_BorrarFicheros(obj_Subcarpeta.Path,dth_Fecha, _
  222. bol_Recursivo)
  223.  
  224. Next
  225.  
  226. Set obj_Subcarpeta = Nothing
  227.  
  228. End If
  229.  
  230. 'Nos limpiamos el culito antes de terminar :-))
  231. Set obj_Fichero = Nothing
  232. Set obj_Carpeta = Nothing
  233. Set obj_FSO = Nothing
  234.  
  235. End Sub 's_BorrarFicheros
  236.  
  237. Function f_EstaExtension(arr_Extensiones, str_Extension)
  238. '***********************************************************************
  239. '* Procedimiento: f_EstaExtension *
  240. '* Tipo : Funci? *
  241. '* Devoluci? : Booleana *
  242. '* Prop?ito : Esta funci? recibe un array de extensiones de *
  243. '* fichero y una extension de fichero, y comprueba si *
  244. '* la extensi? est?contenida en el array, *
  245. '* devolviendo en este caso True y en caso contrario *
  246. '* False. *
  247. '***********************************************************************
  248.  
  249. Dim bol_Esta 'As Boolean
  250. Dim int_Elemento 'As Integer
  251.  
  252. 'Marcamos la booleana como que no ha sido encontrado
  253. bol_Esta = False
  254.  
  255. 'Recorremos los elementos del array
  256. For int_Elemento = LBound(arr_Extensiones) To UBound(arr_extensiones)
  257.  
  258. 'Miramos si el elemento actual del array es igual al elemento
  259. 'buscado
  260. If LCase(arr_Extensiones(int_Elemento)) = _
  261. LCase(str_Extension) Then
  262.  
  263. 'Como es igual, marcamos con la booleana que ha sido
  264. 'encontrado y salimos del bucle For
  265. bol_Esta = True
  266. Exit For
  267.  
  268. End If
  269.  
  270. Next 'int_Elemento
  271.  
  272. 'Devolvemos la booleana con el valor que tenga
  273. f_EstaExtension = bol_Esta
  274.  
  275. End Function 'f_EstaExtension
  276.  
  277. Function f_RevisarArgumentos( _
  278. str_Error, _
  279. int_Error _
  280. ) 'As Boolean
  281. '***********************************************************************
  282. '* Procedimiento: f_RevisarArgumentos *
  283. '* Tipo : Funci? *
  284. '* Devoluci? : Booleana *
  285. '* Fecha y Hora : 19/05/2008 10:35:09 *
  286. '* Prop?ito : Esta funci? revisa los argumentos recibidos, *
  287. '* recogiendo los posibles fallos por falta de *
  288. '* argumentos requeridos y almacenando en las *
  289. '* variables correspondientes los argumentos *
  290. '* recibidos. recibe dos par?etros cuyo fin es ser de *
  291. '* salida: una cadena que almacenar?los errores *
  292. '* detectados y un entero que almacenar?el c?igo de *
  293. '* los errores detectados. Hay tres tipos de error; *
  294. '* error 1 para los argumentos sin nombre requeridos y *
  295. '* no encontrados, error 2 para los argumentos con *
  296. '* nombre requeridos y no encontrados, por ?timo, *
  297. '* error 4 para los combos de argumentos opcionales *
  298. '* (un combo de argumentos opcionales es aquel *
  299. '* conjunto de argumentos opcionales que es requerido *
  300. '* que se pase al menos uno de ellos y que si se pasa *
  301. '* m? de uno se ignorar? aquellos que est? detr? *
  302. '* en la prioridad entre ellos; una caracter?tica *
  303. '* clara de lo que es un combo de argumentos es cuando *
  304. '* dos om? argumentos almacenan su valor en la misma *
  305. '* variable). En el caso de producirse m? de un tipo *
  306. '* de error, el n?ero de error ser?la suma de ambos *
  307. '* de los errores recibidos, es decir 3, 5 o 6 *
  308. '***********************************************************************
  309.  
  310. Dim bol_Devolucion 'As Boolean
  311. Dim bol_Error1 'As Boolean
  312. Dim bol_Error2 'As Boolean
  313. Dim bol_Error4 'As Boolean
  314.  
  315. 'Iniciamos los indicadores
  316. bol_Devolucion = False
  317. bol_Error1 = False
  318. bol_Error2 = False
  319. bol_Error4 = False
  320.  
  321. 'Si hay que mostrar la ayuda, se muestra y
  322. 'termina el script
  323. If WScript.Arguments.Named.Exists("?") Then
  324.  
  325. Call s_Ayuda("******************" &amp; vbCrLf &amp; _
  326. "* AYUDA *" &amp; vbCrLf &amp; _
  327. "******************")
  328.  
  329. WScript.Quit 0
  330.  
  331. End If
  332.  
  333. 'Revisamos si est? todos los argumentos
  334. 'sin nombre requeridos
  335. If WScript.Arguments.Unnamed.Count < 2 Then
  336.  
  337. str_Error = "Error 1, falta/n argumento/s sin " &amp; _
  338. "nombre requerido/s"
  339. bol_Error1 = True
  340.  
  341. Else
  342.  
  343. 'Guardamos los argumentos en las variables
  344. 'correspondientes
  345. If _
  346. WScript.Arguments.Unnamed.Count - 1 _
  347. >= 0 Then _
  348. str_Ruta = _
  349. WScript.Arguments.Unnamed(0)
  350.  
  351. If _
  352. WScript.Arguments.Unnamed.Count - 1 _
  353. >= 1 Then _
  354. dth_Fecha = _
  355. WScript.Arguments.Unnamed(1)
  356.  
  357. End If
  358.  
  359. 'Revisamos que est?el argumento
  360. '/R (borrado_recursivo)
  361. If WScript.Arguments.Named.Exists("R") Then
  362.  
  363. bol_Recursivo = True
  364.  
  365. End If
  366.  
  367. 'Revisamos que est?el argumento
  368. '/E (extensiones)
  369. If WScript.Arguments.Named.Exists("E") Then
  370.  
  371. arr_Incluidas = _
  372. Split(WScript.Arguments.Named("E"),",")
  373.  
  374. 'Revisamos que est?el argumento
  375. '/X (extensiones)
  376. Elseif WScript.Arguments.Named.Exists("X") Then
  377.  
  378. arr_Excluidas = _
  379. Split(WScript.Arguments.Named("X"),",")
  380.  
  381. End If
  382.  
  383. 'Preparamos las variables de devolucion:
  384. 'el entero como suma de los posibles errores 1, 2 y 4
  385. int_Error = Abs(bol_Error1) + _
  386. (2 * Abs(bol_Error2)) + _
  387. (4 * Abs(bol_Error4))
  388. 'La devolucion de la funci? ser?True en caso de
  389. 'haber alguno de los errores
  390. bol_Devolucion = (bol_Error1 Or bol_Error2 Or bol_Error4)
  391.  
  392. 'Hacemos la devoluci? de la funci?
  393. f_RevisarArgumentos = bol_Devolucion
  394.  
  395. End Function 'f_RevisarArgumentos
  396.  
  397. Sub s_Ayuda(str_Error)
  398. '***********************************************************************
  399. '* Procedimiento: s_Ayuda *
  400. '* Tipo : Sub *
  401. '* Devoluci? : *
  402. '* Prop?ito : Este procedimiento muestra la ayuda en l?ea. *
  403. '* Recibe un par?etro de tipo cadena que si viene *
  404. '* ser?mostrado antes de la l?ea; pensado para que *
  405. '* se muestre un error que se haya detectado. *
  406. '***********************************************************************
  407.  
  408. 'Si hay que mostrar alg? texto previo a la ayuda, lo hacemos
  409. If Len(str_Error) > 0 Then
  410.  
  411. WScript.Echo str_Error &amp; vbCrLf &amp; vbCrLf
  412.  
  413. End If
  414.  
  415. 'A continuaci?, mostramos la ayuda por pantalla
  416. WScript.Echo "Basado en un script m? anterior, este script sir" &amp; _
  417. "ve para borrar ficheros cuya"
  418. WScript.Echo "fecha de ?tima modificaci? sea igual o anterior" &amp; _
  419. " a una fecha pasada como"
  420. WScript.Echo "par?etro. Permite tambi? que el borrado sea rec" &amp; _
  421. "ursivo (no s?o se borran los"
  422. WScript.Echo "ficheros de la carpeta pasada como par?etro, si " &amp; _
  423. "no tambien todos aquellos que"
  424. WScript.Echo "est? en el ?bol cuya ra? es esa misma carpeta)" &amp; _
  425. ". Por ?timo, permite"
  426. WScript.Echo "especificar que s?o se borren aquellos ficheros " &amp; _
  427. "con determinadas extensiones o"
  428. WScript.Echo "s?o aquellos que no tienen determinadas extensiones."
  429. WScript.Echo ""
  430. WScript.Echo "Sintaxis"
  431. WScript.Echo ""
  432. WScript.Echo "cscript [//nologo] borrar-ficheros-hasta-fecha.vb" &amp; _
  433. "s [/R] [/E:extensiones]"
  434. WScript.Echo "[/X:extensiones] [/?] ruta fecha"
  435. WScript.Echo ""
  436. WScript.Echo "Siendo"
  437. WScript.Echo ""
  438. WScript.Echo "- ruta (Requerido):"
  439. WScript.Echo "Ruta de la carpeta en la que se borrar? los fich" &amp; _
  440. "eros que en"
  441. WScript.Echo "ella se ubiquen."
  442. WScript.Echo ""
  443. WScript.Echo "- fecha (Requerido):"
  444. WScript.Echo "Fecha en formato DD/MM/YYYY; todos los ficheros q" &amp; _
  445. "ue tengan su"
  446. WScript.Echo "fecha de ?tima modificaci? igual o anterior a ? &amp; _
  447. "sta, ser? los"
  448. WScript.Echo "borrados."
  449. WScript.Echo ""
  450. WScript.Echo "- /R: borrado recursivo (Opcional):"
  451. WScript.Echo "Si se pasa este modificador el borrado ser?recur" &amp; _
  452. "sivo (se"
  453. WScript.Echo "borrar? todos los archivos contenidos en el ?bo" &amp; _
  454. "l de carpetas"
  455. WScript.Echo "cuya ra? es la pasada como par?etro)."
  456. WScript.Echo ""
  457. WScript.Echo "- /E: extensiones (Opcional):"
  458. WScript.Echo "Lista de extensiones, separadas por comas, de los" &amp; _
  459. " ficheros que"
  460. WScript.Echo "se borrar?; todos los ficheros cuyas extensiones" &amp; _
  461. " no est?"
  462. WScript.Echo "incluidas en esta lista no ser? borrados."
  463. WScript.Echo ""
  464. WScript.Echo "- /X: extensiones (Opcional):"
  465. WScript.Echo "Lista de extensiones, separadas por comas, de los" &amp; _
  466. " ficheros que"
  467. WScript.Echo "no se borrar?; todos los ficheros cuyas extensio" &amp; _
  468. "nes no est?"
  469. WScript.Echo "incluidas en esta lista ser? borrados."
  470. WScript.Echo ""
  471. WScript.Echo ""
  472. WScript.Echo "Ejemplos:"
  473. WScript.Echo ""
  474. WScript.Echo "- Se borrar? todos los ficheros ubicados en la c" &amp; _
  475. "arpeta ""c:\orcos\difuntos"" que"
  476. WScript.Echo "tengan como fecha de ?tima modificaci? una fech" &amp; _
  477. "a igual o anterior a"
  478. WScript.Echo """20/02/2002"":"
  479. WScript.Echo ""
  480. WScript.Echo "cscript //nologo borrar-ficheros-hasta-fecha.vbs " &amp; _
  481. """c:\orcos\difuntos"""
  482. WScript.Echo """20/02/2002"""
  483. WScript.Echo ""
  484. WScript.Echo "- Se borrar? todos los ficheros en el ?bol de c" &amp; _
  485. "arpetas cuya ra? es la"
  486. WScript.Echo "carpeta ""c:\orcos\difuntos"" que tengan como fec" &amp; _
  487. "ha de ?tima modificaci? una"
  488. WScript.Echo "fecha igual o anterior a ""20/02/2002"":"
  489. WScript.Echo ""
  490. WScript.Echo "cscript //nologo borrar-ficheros-hasta-fecha.vbs " &amp; _
  491. "/R ""c:\orcos\difuntos"""
  492. WScript.Echo """20/02/2002"""
  493. WScript.Echo ""
  494. WScript.Echo "- Se borrar? todos los ficheros en el ?bol de c" &amp; _
  495. "arpetas cuya ra? es la"
  496. WScript.Echo "carpeta ""c:\orcos\difuntos"" que tengan como fec" &amp; _
  497. "ha de ?tima modificaci? una"
  498. WScript.Echo "fecha igual o anterior a ""20/02/2002"" y cuyas e" &amp; _
  499. "xtensiones sean wmv,asf,mpg:"
  500. WScript.Echo ""
  501. WScript.Echo "cscript //nologo borrar-ficheros-hasta-fecha.vbs " &amp; _
  502. "/R /E:wmv,asf,mpg"
  503. WScript.Echo """c:\orcos\difuntos"" ""20/02/2002"""
  504. WScript.Echo ""
  505. WScript.Echo "- Se borrar? todos los ficheros en el ?bol de c" &amp; _
  506. "arpetas cuya ra? es la"
  507. WScript.Echo "carpeta ""c:\orcos\difuntos"" que tengan como fec" &amp; _
  508. "ha de ?tima modificaci? una"
  509. WScript.Echo "fecha igual o anterior a ""20/02/2002"" y cuyas e" &amp; _
  510. "xtensiones no sean doc,txt,xls:"
  511. WScript.Echo ""
  512. WScript.Echo "cscript //nologo borrar-ficheros-hasta-fecha.vbs " &amp; _
  513. "/R /X:doc,txt,xls"
  514. WScript.Echo """c:\orcos\difuntos"" ""20/02/2002"""
  515. WScript.Echo ""
  516. WScript.Echo ""
  517. WScript.Echo ""
  518.  
  519. End Sub 's_Ayuda

 

 

 Una vez detallados los scripts que van a intervenir en el proceso, nos falta lo mas importante que es configurar el IIS para que comparta la configuración. Vamos a verlo...

 

Pasos previos

 

1.    Exportación de configuración y generación de clave de encriptación en el nodo principal.

Tendremos un nodo que etiquetaremos como principal y en el que realizaremos las labores administrativas de cambios de configuración, a nivel de IIS, y del cual cederemos la configuración a los demás nodos secundarios.
Previo a la ejecución de la tarea, y solo una vez, en este nodo principal hemos tenido que exportar la configuración de forma manual para generar un fichero de clave cifrada de la siguiente manera:

 ConfiguracionCompartidaIIS7 1

ConfiguracionCompartidaIIS7 2

 

Como vemos en las imágenes de arriba, la ruta de exportación será : C:\inetpub\webContent\config_nodos, dentro de las rutas de publicación.

Utilizaremos las credenciales de un usuario de dominio y en la clave de encriptación una password.

El resultado serán tres archivos: (administration.config, applicationHost.config y configEncKey.key). El archivo configEncKey.key permanecerá siempre igual y los otros dos se iran actualizando con el proceso diario de backup de configuración lanzado por ExportacionConfiguracionIIS7.bat.

 

2.    Cargado de la configuración en los nodos secundarios.

Una vez terminado el paso 1, ejecutamos el proceso ExportacionConfiguracionIIS7.bat para que replique los archivos a los demás nodos y procedemos a cargar la configuración en estos nodos secundarios.

 ConfiguracionCompartidaIIS7 3

 

Como vemos en la foto anterior, aquí se configura la ruta local C:\inetpub\webContent\config_nodos, donde el proceso anterior dejará los archivos de configuración.
Meteremos el usuario con permisos para cargar la configuración, que hemos utilizado anteriormente.Y nos solicitará la clave de cifrado con la que creamos el archivo configEncKey.key, en el paso anterior. Al darle Apply, cargará la nueva configuración.

Realizaremos este último paso en los demás nodos que intervienen en la granja y ya tendremos funcionando la configuración compartida a nivel de granja de servidores.

 

 Versión de Software utilizado en este artículo: Internet Information Server 7.0 , Windows Server 2008 R2

 

 

Visto 1843 veces Modificado por última vez en Viernes, 15 Enero 2016

Artículos Internet Information Server

  • Appcmd en IIS 7.5
      Appcmd.exe , es la herramienta de administración de IIS a nivel de comando. Es una herramienta que aún se usa, pero con tendencia a desaparecer sustituida por la potencia y flexibilidad que nos brinda PowerShell. Nos permite gestionar mediante scripting, la mayor parte de la funcionalidad de IIS.
    en Microsoft Internet Information Server ( IIS ) Leer más...
  • Script de mantenimiento de Logs
    En este artículo vamos a presentar un script para mantener logs, evitando que puedan colapsar el almacenamiento y repercutir en el funcionamiento general del sistema. Existen multitud de aplicaciones que por su naturaleza y uso, registran detalles de su funcionamiento o de acceso a las mismas, que en algunos casos puedan tener un gran peso y ocupar mucho espacio. Por ejemplo en el caso de IIS, segun el site, su volumen de accesos y carga que soporta, puede llegar a…
    en Microsoft Internet Information Server ( IIS )
    Leer más...
  • Cache Global de Esamblados (GAC) en Sistemas Windows
    GAC o lo que es lo mismo Global Assembly Cache, es el lugar en donde los sistemas windows almacenan las librerías que van a ser compartidas por aplicaciones. Cuando el desarrollador prevé que una serie de funciones de programación almacenadas en una librería vas a ser necesitadas por más de una aplicación y con el objeto de no duplicar ese archivo dll en los binarios de las X aplicaciones, se registra esa librería en la Cache de Ensamblados Global y…
    en Microsoft Internet Information Server ( IIS ) Leer más...

Más Puntuados