Actualizar AzureRM solo cuando sea necesario
El otro día me topé con esta excelente publicación de Ian Farr sobre Mantener automáticamente actualizado el módulo Azure PowerShell. En esta publicación, Ian nos cuenta cómo mantiene actualizados su módulo de ayuda y Azure iniciando un trabajo en segundo plano desde el script de su perfil. Al final, Ian menciona que recientemente agregó el comando Update-AzureRM a su trabajo y que actualiza los módulos de AzureRM cada vez, incluso si ya tiene la última versión.
Ejecuté el comando Update-AzureRM varias veces y noté el mismo hecho frustrante: ¡se tarda casi 40 minutos en ejecutarse incluso si todos mis módulos están actualizados!
Mi solución general a esto ha sido ejecutar Update-Module -Name Azure* y simplemente actualizar todos los módulos con un nombre que comience con Azure (esto también mantiene actualizado AzureAutomationAuthoringToolkit). Pero esta vez sentí curiosidad y pensé: "¿Puedo acelerar las cosas con Update-AzureRM?".
Examinando el comando
Lo primero que hago es examinar el comando usando Get-Command así:
Get-Command -Name Update-AzureRM
Esto me dice que el comando en realidad es una función que forma parte del módulo AzureRM, echemos un vistazo a ese módulo:
Get-Module -Name AzureRM | Select-Object -Property Name, Path
Resulta que este es un módulo de script escrito en PowerShell, por lo que quizás pueda hacer algo al respecto.
Actualización-AzureRM
Al abrir la función, puedo ver que Update-AzureRM está cambiando la política del repositorio, llamando a Install-ModuleWithVersionCheck una vez para cada módulo que debe actualizarse y luego establece mi política de repositorio a la que era antes. Esto me lleva a creer que el problema de la actualización radica en Install-ModuleWithVersionCheck, que reside en el mismo archivo psm1.
Instalar módulo con verificación de versión
Esta función buscará el módulo especificado en mi computadora, si está instalado establecerá la variable $ModuleAction en "actualizado" y ejecutará Install-Module usando el parámetro -Force, si aún no está disponible en mi computadora lo configurará $ModuleAction para “instalar” y ejecutar Install-Module sin usar -Force.
¡Problema encontrado!
Creo que encontré el problema aquí, busquemos el parámetro Force en la ayuda de Install-Module:
Get-Help -Name Install-Module -Parameter Force
Parece que el parámetro Force solo es necesario si quiero sobrescribir un módulo del mismo nombre y versión. Mis propias pruebas con el parámetro también muestran que el uso de -Force anulará el mensaje de confirmación cuando InstallationPolicy para un repositorio esté configurado como No confiable (como se informa en UserVoice). Esto me lleva a concluir que eliminar -Force del módulo de instalación evitaría que descargue y reinstale cualquier módulo que ya esté actualizado. Solo quiero descargar e instalar un módulo a la fuerza si uso el parámetro -Force on Update-AzureRM.
Para cambiar el comportamiento, primero agrego un parámetro Force a Install-ModuleWithVersionCheck y lo llamo desde Update-AzureRM usando -Force:$Force. Esto pasará a través del parámetro Force a Install-ModuleWithVersionCheck.
El segundo paso es hacer lo mismo para Install-Module dentro de Install-ModuleWithVersionCheck.
Para asegurarme de que funciona según lo previsto, ejecuto el comando Update-AzureRm y ahora tarda 2 minutos en lugar de 38. ¡Y todo lo que tuve que hacer fue un pequeño cambio en cinco filas! Una vez que lo hice, también agregué una descripción de ayuda para -Force on Update-AzureRM.
Dado que el módulo AzureRm PowerShell es de código abierto y está publicado en GitHub, envié un problema que describe el problema con las actualizaciones forzadas y mi cambio de código sugerido. Esperemos que todos tengan esta nueva funcionalidad en la próxima versión.
En la próxima publicación describiré el proceso de envío de cambios sugeridos a un proyecto de código abierto.


