Arbeta med privata PowerShellGet-lagringsplatser

PowerShellGet-modulen stöder andra lagringsplatser än PowerShell-galleriet. Dessa cmdletar möjliggör följande scenarier:

  • Stöd för en betrodd, förvaliderad uppsättning PowerShell-moduler för användning i din miljö
  • Testa en CI/CD-pipeline som skapar PowerShell-moduler eller skript
  • Leverera PowerShell-skript och moduler till system som inte kan komma åt Internet
  • Leverera PowerShell-skript och moduler som endast är tillgängliga för din organisation

Den här artikeln beskriver hur du konfigurerar en lokal PowerShell-lagringsplats. Artikeln beskriver även offlinepowershellgetdeploy-modulen som är tillgänglig från PowerShell-galleriet. Den här modulen innehåller cmdletar för att installera den senaste versionen av PowerShellGet på din lokala lagringsplats.

Typer av lokala lagringsplatser

Det finns två sätt att skapa en lokal PSRepository: NuGet-server eller filresurs. Varje typ har fördelar och nackdelar:

NuGet Server

Fördelar Nackdelar
Efterliknar PowerShellGallery-funktioner Multi-tier app kräver driftplanering & support
NuGet integreras med Visual Studio, andra verktyg Autentiseringsmodell och Hantering av NuGet-konton behövs
NuGet stöder metadata i .Nupkg paket Publicering kräver underhåll av API-nyckelhantering &
Tillhandahåller sökning, paketadministration osv.

Filresurs

Fördelar Nackdelar
Enkelt att konfigurera, säkerhetskopiera och underhålla Inget användargränssnitt utöver grundläggande filresurs
Enkel säkerhetsmodell – användarbehörigheter på resursen Begränsad säkerhet och ingen inspelning av vem som uppdaterar vad
Inga begränsningar som att ersätta befintliga objekt

PowerShellGet fungerar med båda typerna och har stöd för att hitta versioner och beroendeinstallationer. Vissa funktioner som fungerar för PowerShell-galleriet är dock inte tillgängliga för grundläggande NuGet-servrar eller filresurser. Det finns ingen differentiering av skript, moduler, DSC-resurser eller rollfunktioner.

Skapa en NuGet.Server-lagringsplats

I följande artikel visas stegen för att konfigurera din egen NuGet-server.

Följ stegen fram till den punkt då paket läggs till. Stegen för att publicera ett paket beskrivs senare i den här artikeln.

För en filresursbaserad lagringsplats kontrollerar du att användarna har behörighet att komma åt filresursen.

Registrera en lokal lagringsplats

Innan en lagringsplats kan användas måste den registreras med kommandot Register-PSRepository . I exemplen nedan är InstallationPolicy inställt Trustedpå , med antagandet att du litar på din egen lagringsplats.

# 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

Notera skillnaden mellan hur de två kommandona hanterar ScriptSourceLocation. För filresursbaserade lagringsplatser måste SourceLocation och ScriptSourceLocation matcha. För en webbaserad lagringsplats måste de vara olika, så i det här exemplet läggs ett avslutande "/" till i SourceLocation.

När du använder ett fildelningsprotokoll, till exempel NFS eller SMB, bör du följa de rekommenderade riktlinjerna för att skydda protokollet. Mer information om hur du skyddar SMB i Windows finns i [SMB-säkerhetsförbättringar][09].

Om du vill att den nyligen skapade PSRepository ska vara standardlagringsplatsen måste du avregistrera alla andra PSRepositories. Exempel:

Unregister-PSRepository -Name PSGallery

Anteckning

Lagringsplatsens namn PSGallery är reserverat för användning av PowerShell-galleriet. Du kan avregistrera PSGallery, men du kan inte återanvända namnet PSGallery för någon annan lagringsplats.

Om du behöver återställa PSGallery kör du följande kommando:

Register-PSRepository -Default

Publicera till en lokal lagringsplats

När du har registrerat den lokala PSRepository kan du publicera till din lokala PSRepository. Det finns två huvudsakliga publiceringsscenarier: publicera din egen modul och publicera en modul från PSGallery.

Publicera en modul som du har skapat

Använd Publish-Module och Publish-Script för att publicera modulen till din lokala PSRepository på samma sätt som du gör för PowerShell-galleriet.

  • Ange platsen för koden
  • Ange en API-nyckel
  • Ange namnet på lagringsplatsen. Till exempel -PSRepository LocalPSRepo

Anteckning

Du måste skapa ett konto på NuGet-servern och sedan logga in för att generera och spara API-nyckeln. För en filresurs använder du valfri icke-tom sträng för NuGetApiKey-värdet.

Exempel:

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

Viktigt

För att säkerställa säkerheten bör API-nycklar inte hårdkodas i skript. Använd ett säkert nyckelhanteringssystem. När du kör ett kommando manuellt bör API-nycklar inte skickas som oformaterad text för att undvika att det loggas. Cmdleten Read-Host kan användas för att på ett säkert sätt skicka värdet för API-nyckeln.

# 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

Publicera en modul från PSGallery

Om du vill publicera en modul från PSGallery till din lokala PSRepository kan du använda cmdleten Save-Package .

  • Ange namnet på paketet
  • Ange NuGet som provider
  • Ange PSGallery-platsen som källa (https://www.powershellgallery.com/api/v2)
  • Ange sökvägen till din lokala lagringsplats

Exempel:

# 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

Om din lokala PSRepository är webbaserad krävs ytterligare ett steg som används nuget.exe för att publicera. Se dokumentationen för att användanuget.exe.

Installera PowerShellGet i ett frånkopplat system

Det är svårt att distribuera PowerShellGet i miljöer som kräver att system kopplas från Internet. PowerShellGet har en bootstrap-process som installerar den senaste versionen första gången den används. OfflinePowerShellGetDeploy-modulen i PowerShell-galleriet innehåller cmdletar som stöder den här bootstrap-processen.

Om du vill starta en offlinedistribution måste du:

  • Ladda ned och installera OfflinePowerShellGetDeploy ditt Internetanslutna system och frånkopplade system
  • Ladda ned PowerShellGet och dess beroenden i det Internetanslutna systemet med hjälp av cmdleten Save-PowerShellGetForOffline
  • Kopiera PowerShellGet och dess beroenden från det Internetanslutna systemet till det frånkopplade systemet
  • Använd det Install-PowerShellGetOffline frånkopplade systemet för att placera PowerShellGet och dess beroenden i rätt mappar

Följande kommandon använder Save-PowerShellGetForOffline för att placera alla komponenter i en mapp 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'

Nu måste du göra innehållet F:\OfflinePowerShellGet tillgängligt för dina frånkopplade system. Kör cmdleten Install-PowerShellGetOffline för att installera PowerShellGet på det frånkopplade systemet.

Anteckning

Det är viktigt att du inte kör PowerShellGet i PowerShell-sessionen innan du kör dessa kommandon. När PowerShellGet har lästs in i sessionen kan komponenterna inte uppdateras. Om du startar PowerShellGet av misstag avslutar du och startar om PowerShell.

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

När du har kört dessa kommandon är du redo att publicera PowerShellGet till din lokala lagringsplats.

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

Viktigt

För att säkerställa säkerheten bör API-nycklar inte hårdkodas i skript. Använd ett säkert nyckelhanteringssystem. När du kör ett kommando manuellt ska API-nycklar inte skickas som oformaterad text för att undvika att det loggas. Cmdleten Read-Host kan användas för att på ett säkert sätt skicka värdet för API-nyckeln.

# 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

Använda paketeringslösningar som värd för PowerShellGet-lagringsplatser

Du kan också använda paketeringslösningar som Azure Artifacts som värd för en privat eller offentlig PowerShellGet-lagringsplats. Mer information och instruktioner finns i dokumentationen om Azure Artifacts.