Gestión de módulos y paquetes

Introducción

Seguro que alguna vez ha envidiado la "facilidad" con la que los usuarios de Linux actualizan sus aplicaciones, bibliotecas y otros binarios. Todo ello desde un único repositorio alojado. Basta un solo comando para completar el proceso. Le alegrará saber que Microsoft también ha puesto a disposición su propia solución de gestión de paquetes. Llamada NuGet, fue creada en 2010 bajo la licencia Apache 2.0. Proporciona paquetes en formato NUPKG.

NuGet se integró inicialmente en Visual Studio 2012 para gestionar fácilmente las dependencias de bibliotecas y los proyectos interfuncionales. Puede utilizarse mediante líneas de comandos o interfaces gráficas. Desde entonces, ha seguido despertando un gran interés. Como resultado, se lanzó el repositorio Chocolatey. Basado en esta tecnología, puede utilizarse para instalar aplicaciones como 7zip, Adobe Reader, etc. con solo unas líneas de comando.

¿Y qué ocurre con PowerShell? Desde su creación, su principal objetivo ha sido simplificar y automatizar la administración de los sistemas de información. Con este objetivo en mente, y en el contexto de DevOps, el módulo PackageManagement se incluye de forma predeterminada en PowerShell 5.0. Inicialmente denominado OneGet, interactúa con repositorios de tipo NuGet. Por lo tanto, es posible utilizar el módulo:...

Módulo PackageManagement

Para instalar un paquete desde un repositorio, este debe estar registrado como origen en el sistema cliente. Para saber qué fuentes ya están presentes, utilice el comando Get-PackageSource:

PS > Get-PackageSource  
  
Name        ProviderName   IsTrusted  Location  
----        ------------   ---------  --------  
PSGallery   PowerShellGet  False      https://www.powershellga... 

Como ya se ha mencionado, la galería PowerShell está presente de forma predeterminada como origen en PackageManagement. Sin embargo, antes de empezar a utilizarla, hay un último aspecto que debe conocer. Las fuentes añadidas a los clientes tienen cada una un tipo de proveedor específico. Cada tipo de proveedor presenta sus propias características. Para averiguar qué tipos de proveedores están presentes en el sistema, utilice el comando Get-PackageProvider:

PS > Get-PackageProvider  
  
Name             Version       DynamicOptions  
----             -------       --------------  
msi              3.0.0.0       AdditionalArguments  
msu              3.0.0.0  
PowerShellGet    1.0.0.1       PackageManagementProvider, Typ...  
Programs         3.0.0.0       IncludeWindowsInstaller, Inclu... 

Aquí se presentan los cuatro proveedores configurados de forma predeterminada. Hay otros que pueden descargarse e instalarse desde Internet. Para obtener la lista de proveedores disponibles, utilice el comando Find-PackageProvider:

Find-packageProvider -Name * | Format-table Name,Version,Source   
  
Name                      Version    Source  ...

Módulo PowerShellGet

Las versiones 1 y 2 del módulo PowerShellGet se basan en PackageManagement. Su funcionamiento es prácticamente idéntico. Sin embargo, hay algunas diferencias.

Por defecto, PowerShellGet tiene una fuente registrada cuando se instalan Windows 10 y Windows Server 2016. Se trata de la galería de PowerShell. Será la utilizada como referencia a lo largo de esta sección.

La sección Creación de un repositorio explicará cómo organizar su propio proveedor y cómo registrarlo como fuente para el módulo PowerShellGet.

1. Actualización de PowerShellGet para admitir TLS

Desde abril de 2020, Microsoft ha dejado de admitir la compatibilidad con TLS 1.0 en la PowerShell Gallery, y la versión 1 del módulo PowerShellGet, incluida de forma predeterminada en los sistemas, no es compatible con TLS 1.2, necesario para utilizar correctamente la PowerShell Gallery.

En primer lugar, le recomendamos actualizar PowerShellGet a la versión 2.2.5 mediante el siguiente comando:

PS > Install-Module PowerShellGet -RequiredVersion 2.2.5  
-SkipPublisherCheck -AllowClobber -Force 

A continuación, compruebe si su versión de TLS 1.2 está activada. Por defecto, este es el caso de Windows 11.

Para modificar esta configuración, utilice el siguiente comando:

PS > [Net.ServicePointManager]::SecurityProtocol = `  
   [Net.SecurityProtocolType]::Tls12 

Para más información, consulte la siguiente entrada del blog: https://devblogs.microsoft.com/powershell/powershell-gallery-tls-support/

2. Búsqueda de un recurso

Existen cinco comandos específicos para buscar recursos, uno para cada tipo disponible:

PS > Get-Command Find-* -Module PowerShellGet  
CommandType     Name                     Version    Source  
-----------     ----                     -------    ------  
Function        Find-Command             1.0.0.1    PowerShellGet  ...

Creación de un repositorio

La posibilidad de desplegar una aplicación o un recurso PowerShell con unos pocos comandos y actualizarlo con cada nueva versión representa una ventaja considerable. Sin embargo, si trabaja en un entorno con un acceso a Internet bastante restringido (por motivos de seguridad, limitaciones de ancho de banda, etc.), puede resultar esencial contar con su propio proveedor interno.

Hay dos posibilidades:

  • uso compartido de la red

  • un sitio web basado en la tecnología NuGet

La estructura de los paquetes Chocolatey presenta algunas particularidades que pueden resultar confusas. Por ello, en esta sección no se aborda la creación de paquetes desde cero. En el caso de PowerShellGet, la creación del paquete forma parte del proceso de publicación del recurso.

1. A través de una simple red compartida

Los módulos PackageManagement y PowerShellGet pueden utilizar un recurso compartido de red como origen. Los paquetes deben agruparse en carpetas separadas según su tipo respectivo. Esto significa que los paquetes Chocolatey deben estar separados de los paquetes de recursos PowerShell. No es necesario crear un recurso compartido para cada tipo de recurso; basta con indicar la ubicación correcta al añadir el origen en el cliente.

Ejemplo de jerarquía

\\myserver\LocalGet  
  └─MyChocolatey  
         └─<Packages Chocolatey>  
  └─MyPowerShell  
    └─<Packages Ressources PowerShell> 

Para crear el recurso compartido en el servidor:

PS > New-Item -Path `  
C:\LocalGet\MyChocolatey,C:\LocalGet\MyPowerShell `  
-ItemType Directory   
  
    Répertoire : C:\LocalGet  
  
  
Mode                LastWriteTime         Length Name  
----                -------------         ------ ----  
d-----       12/10/2017     15:52                MyChocolatey  ...