Werken met PowerShellGet-privé-opslagplaatsen

De PowerShellGet-module ondersteunt andere opslagplaatsen dan de PowerShell Gallery. Deze cmdlets maken de volgende scenario's mogelijk:

  • Ondersteuning voor een vertrouwde, vooraf gevalideerde set PowerShell-modules voor gebruik in uw omgeving
  • Een CI/CD-pijplijn testen waarmee PowerShell-modules of -scripts worden gebouwd
  • PowerShell-scripts en -modules leveren aan systemen die geen toegang hebben tot internet
  • PowerShell-scripts en -modules leveren die alleen beschikbaar zijn voor uw organisatie

In dit artikel wordt beschreven hoe u een lokale PowerShell-opslagplaats instelt. In het artikel wordt ook de module OfflinePowerShellGetDeploy beschreven die beschikbaar is in de PowerShell Gallery. Deze module bevat cmdlets voor het installeren van de nieuwste versie van PowerShellGet in uw lokale opslagplaats.

Lokale opslagplaatstypen

Er zijn twee manieren om een lokale PSRepository te maken: NuGet-server of bestandsshare. Elk type heeft voor- en nadelen:

NuGet-server

Voordelen Nadelen
Mimics PowerShellGallery-functionaliteit App met meerdere lagen vereist operationele planning & ondersteuning
NuGet integreert met Visual Studio, andere hulpprogramma's Verificatiemodel en NuGet-accountsbeheer vereist
NuGet ondersteunt metagegevens in .Nupkg pakketten Voor het publiceren is api-sleutelbeheer & onderhoud vereist
Biedt zoeken, pakketbeheer, enzovoort.

Bestandsshare

Voordelen Nadelen
Eenvoudig in te stellen, een back-up te maken en te onderhouden Er is geen gebruikersinterface die verder gaat dan de basisbestandsshare
Eenvoudig beveiligingsmodel: gebruikersmachtigingen voor de share Beperkte beveiliging en geen registratie van wie wat bijwerken
Geen beperkingen zoals het vervangen van bestaande items

PowerShellGet werkt met beide typen en ondersteunt het zoeken naar versies en installatie van afhankelijkheden. Sommige functies die voor de PowerShell Gallery werken, zijn echter niet beschikbaar voor basis-NuGet-servers of bestandsshares. Er is geen onderscheid tussen scripts, modules, DSC-resources of rolmogelijkheden.

Een NuGet.Server-opslagplaats maken

Het volgende artikel bevat de stappen voor het instellen van uw eigen NuGet-server.

Volg de stappen totdat u pakketten toevoegt. De stappen voor het publiceren van een pakket worden verderop in dit artikel besproken.

Voor een opslagplaats op basis van een bestandsshare moet u ervoor zorgen dat uw gebruikers machtigingen hebben voor toegang tot de bestandsshare.

Een lokale opslagplaats registreren

Voordat een opslagplaats kan worden gebruikt, moet deze worden geregistreerd met de Register-PSRepository opdracht . In de onderstaande voorbeelden is InstallationPolicy ingesteld op Trusted, in de veronderstelling dat u uw eigen opslagplaats vertrouwt.

# Register a NuGet-based server
$registerPSRepositorySplat = @{
    Name = 'LocalPSRepo'
    SourceLocation = 'http://MyLocalNuget/Api/V2/'
    ScriptSourceLocation = 'http://MyLocalNuget/Api/V2'
    InstallationPolicy = 'Trusted'
}
Register-PSRepository @registerPSRepositorySplat

# Register a file share on my local machine
$registerPSRepositorySplat = @{
    Name = 'LocalPSRepo'
    SourceLocation = '\\localhost\PSRepoLocal\'
    ScriptSourceLocation = '\\localhost\PSRepoLocal\'
    InstallationPolicy = 'Trusted'
}
Register-PSRepository @registerPSRepositorySplat

Let op het verschil tussen de manier waarop de twee opdrachten ScriptSourceLocation verwerken. Voor opslagplaatsen op basis van een bestandsshare moeten sourceLocation en ScriptSourceLocation overeenkomen. Voor een webopslagplaats moeten ze verschillend zijn, dus in dit voorbeeld wordt een afsluitende '/' toegevoegd aan de SourceLocation.

Wanneer u een protocol voor het delen van bestanden gebruikt, zoals NFS of SMB, moet u de aanbevolen richtlijnen voor het beveiligen van het protocol volgen. Zie [SMB-beveiligingsverbeteringen][09] voor meer informatie over het beveiligen van SMB in Windows.

Als u wilt dat de zojuist gemaakte PSRepository de standaardopslagplaats is, moet u de registratie van alle andere PSRepositories ongedaan maken. Bijvoorbeeld:

Unregister-PSRepository -Name PSGallery

Notitie

De naam van de opslagplaats 'PSGallery' is gereserveerd voor gebruik door de PowerShell Gallery. U kunt de registratie van PSGallery ongedaan maken, maar u kunt de naam PSGallery niet opnieuw gebruiken voor een andere opslagplaats.

Als u de PSGallery wilt herstellen, voert u de volgende opdracht uit:

Register-PSRepository -Default

Publiceren naar een lokale opslagplaats

Zodra u het lokale PSRepository hebt geregistreerd, kunt u publiceren naar uw lokale PSRepository. Er zijn twee belangrijke publicatiescenario's: het publiceren van uw eigen module en het publiceren van een module vanuit de PSGallery.

Een module publiceren die u hebt gemaakt

Gebruik Publish-Module en Publish-Script om uw module op uw lokale PSRepository te publiceren op dezelfde manier als voor de PowerShell Gallery.

  • De locatie voor uw code opgeven
  • Een API-sleutel opgeven
  • Geef de naam van de opslagplaats op. Bijvoorbeeld: -PSRepository LocalPSRepo

Notitie

U moet een account maken op de NuGet-server en u vervolgens aanmelden om de API-sleutel te genereren en op te slaan. Gebruik voor een bestandsshare een niet-lege tekenreeks voor de waarde NuGetApiKey.

Voorbeelden:

# Publish to a NuGet Server repository using my NuGetAPI key
$publishModuleSplat = @{
    Path = 'c:\projects\MyModule'
    Repository = 'LocalPsRepo'
    NuGetApiKey = $nuGetApiKey
}
Publish-Module @publishModuleSplat

Belangrijk

Om de beveiliging te garanderen, mogen API-sleutels niet in scripts worden vastgelegd. Gebruik een beveiligd sleutelbeheersysteem. Wanneer u een opdracht handmatig uitvoert, mogen API-sleutels niet worden doorgegeven als tekst zonder opmaak om te voorkomen dat deze wordt geregistreerd. De Read-Host cmdlet kan worden gebruikt om de waarde van de API-sleutel veilig door te geven.

# Publish to a file share repo - the NuGet API key must be a non-blank string
$publishModuleSplat = @{
    Path = 'c:\projects\MyModule'
    Repository = 'LocalPsRepo'
    NuGetApiKey = 'AnyStringWillDo'
}
Publish-Module @publishModuleSplat

Een module publiceren vanuit de PSGallery

Als u een module van de PSGallery wilt publiceren naar uw lokale PSRepository, kunt u de Save-Package cmdlet gebruiken.

  • Geef de naam van het pakket op
  • Geef 'NuGet' op als de provider
  • Geef de PSGallery-locatie op als de bron (https://www.powershellgallery.com/api/v2)
  • Het pad naar uw lokale opslagplaats opgeven

Voorbeeld:

# Publish from the PSGallery to your local Repository
$savePackageSplat = @{
    Name = 'PackageName'
    ProviderName = 'NuGet'
    Source = 'https://www.powershellgallery.com/api/v2'
    Path = '\\localhost\PSRepoLocal\'
}
Save-Package @savePackageSplat

Als uw lokale PSRepository op het web is gebaseerd, is een extra stap vereist die wordt gebruikt nuget.exe om te publiceren. Raadpleeg de documentatie voor het gebruik van nuget.exe.

PowerShellGet installeren op een niet-verbonden systeem

Het implementeren van PowerShellGet is moeilijk in omgevingen waarin de verbinding van systemen met internet moet worden verbroken. PowerShellGet heeft een bootstrap-proces waarmee de nieuwste versie wordt geïnstalleerd wanneer deze voor het eerst wordt gebruikt. De module OfflinePowerShellGetDeploy in de PowerShell Gallery biedt cmdlets die ondersteuning bieden voor dit bootstrap-proces.

Als u een offline implementatie wilt opstarten, moet u het volgende doen:

  • Download en installeer de OfflinePowerShellGetDeploy uw met internet verbonden systeem en uw niet-verbonden systemen implementeren
  • Download PowerShellGet en de bijbehorende afhankelijkheden op het systeem dat is verbonden met internet met behulp van de Save-PowerShellGetForOffline cmdlet
  • PowerShellGet en de bijbehorende afhankelijkheden van het met internet verbonden systeem kopiëren naar het niet-verbonden systeem
  • Gebruik de Install-PowerShellGetOffline op het niet-verbonden systeem om PowerShellGet en de bijbehorende afhankelijkheden in de juiste mappen te plaatsen

De volgende opdrachten gebruiken Save-PowerShellGetForOffline om alle onderdelen in een map te plaatsen f:\OfflinePowerShellGet

# Requires -RunAsAdministrator
#Download the OfflinePowerShellGetDeploy to a location that can be accessed
# by both the connected and disconnected systems.
Save-Module -Name OfflinePowerShellGetDeploy -Path 'F:\' -Repository PSGallery
Import-Module F:\OfflinePowerShellGetDeploy

# Put PowerShellGet somewhere locally
Save-PowerShellGetForOffline -LocalFolder 'F:\OfflinePowerShellGet'

Op dit moment moet u de inhoud van F:\OfflinePowerShellGet beschikbaar maken voor uw niet-verbonden systemen. Voer de Install-PowerShellGetOffline cmdlet uit om PowerShellGet te installeren op het niet-verbonden systeem.

Notitie

Het is belangrijk dat u PowerShellGet niet uitvoert in de PowerShell-sessie voordat u deze opdrachten uitvoert. Zodra PowerShellGet in de sessie is geladen, kunnen de onderdelen niet meer worden bijgewerkt. Als u PowerShell per ongeluk start, sluit u PowerShell af en start u deze opnieuw.

Import-Module F:\OfflinePowerShellGetDeploy
Install-PowerShellGetOffline -LocalFolder 'F:\OfflinePowerShellGet'

Nadat u deze opdrachten hebt uitgevoerd, bent u klaar om PowerShellGet te publiceren naar uw lokale opslagplaats.

# Publish to a NuGet Server repository using my NuGetAPI key
$publishModuleSplat = @{
    Path = 'F:\OfflinePowershellGet'
    Repository = 'LocalPsRepo'
    NuGetApiKey = $nuGetApiKey
}
Publish-Module @publishModuleSplat

Belangrijk

Om de beveiliging te garanderen, mogen API-sleutels niet in scripts worden vastgelegd. Gebruik een beveiligd sleutelbeheersysteem. Wanneer u een opdracht handmatig uitvoert, mogen API-sleutels niet worden doorgegeven als tekst zonder opmaak om te voorkomen dat deze wordt geregistreerd. De Read-Host cmdlet kan worden gebruikt om de waarde van de API-sleutel veilig door te geven.

# Publish to a file share repo - the NuGet API key must be a non-blank string
$publishModuleSplat = @{
    Path = 'F:\OfflinePowerShellGet'
    Repository = 'LocalPsRepo'
    NuGetApiKey = 'AnyStringWillDo'
}
Publish-Module @publishModuleSplat

Verpakkingsoplossingen gebruiken om PowerShellGet-opslagplaatsen te hosten

U kunt ook verpakkingsoplossingen zoals Azure Artifacts gebruiken om een persoonlijke of openbare PowerShellGet-opslagplaats te hosten. Zie de documentatie over Azure Artifacts voor meer informatie en instructies.