PowerShell Modül Kurulumu ve Yönetimi: Install-Module Kullanımı

PowerShell ile ciddi işler yapmaya başladığınızda, eninde sonunda modül yönetimiyle yüzleşmek zorunda kalırsınız. Sunuculara yeni özellikler eklemek, bulut servislerini yönetmek ya da üçüncü parti araçlarla entegrasyon sağlamak istediğinizde Install-Module komutu hayat kurtarıcınız olacak. Bu yazıda PowerShell modül ekosistemini, kurulum süreçlerini ve gerçek dünya senaryolarında karşılaşacağınız durumları ele alacağız.

PowerShell Modülü Nedir?

PowerShell modülleri, belirli bir amaca yönelik cmdlet’leri, fonksiyonları, değişkenleri ve diğer kaynakları bir arada paketleyen yapılardır. Microsoft’un kendi modülleri (Active Directory, Exchange, Azure) olduğu gibi topluluk tarafından geliştirilen binlerce modül de mevcuttur.

PowerShell Gallery, Microsoft tarafından işletilen resmi modül deposudur. Tıpkı Linux’taki apt veya yum gibi, PowerShell Gallery de merkezi bir paket yönetim sistemi sunar. Install-Module komutu varsayılan olarak bu depoyu kullanır.

Modüllerin nerede depolandığına bakmak, işin temelini anlamak açısından faydalıdır:

# Modül arama yollarını listele
$env:PSModulePath -split ";"

# Kurulu modülleri listele
Get-Module -ListAvailable

# Belirli bir modülü ara
Get-Module -ListAvailable -Name "*Azure*"

Çıktıda genellikle üç farklı konum görürsünüz: sistem geneli modüller, kullanıcıya özel modüller ve Windows PowerShell’in kendi modülleri. Bu ayrımı aklınızda tutun, ilerleyen bölümlerde işe yarayacak.

PowerShellGet Kurulumu ve Güncellenmesi

Install-Module komutu, PowerShellGet modülünün bir parçasıdır. Windows 10 ve Windows Server 2016 sonrasında bu modül genellikle hazır gelir, ancak eski sürümlerde veya güncel tutulmamış sistemlerde sorun yaşayabilirsiniz.

# PowerShellGet sürümünü kontrol et
Get-Module -Name PowerShellGet -ListAvailable

# PowerShellGet'i güncelle
Install-Module -Name PowerShellGet -Force -AllowClobber

# NuGet provider'ı güncelle (bazen gerekli olur)
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force

Windows Server 2012 R2 gibi eski sistemlerde Install-Module komutu hiç olmayabilir. Bu durumda önce WMF (Windows Management Framework) 5.1 kurmanız gerekir. Bunu atlayıp devam etmeye çalışmak, sonradan baş ağrısına dönüşür.

Kurumsal ortamlarda sık karşılaşılan bir durum daha var: PowerShell Gallery’e internet erişiminin olmadığı, proxy arkasındaki sunucular. Bu için:

# Proxy üzerinden bağlantı ayarla
[System.Net.WebRequest]::DefaultWebProxy = New-Object System.Net.WebProxy("http://proxy.sirket.com:8080")
[System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials

# Sonra normal kurulumu dene
Install-Module -Name PSWindowsUpdate

Install-Module Parametreleri

Install-Module komutunun parametrelerini iyi bilmek, hem güvenlik hem de esneklik açısından kritiktir.

-Name: Kurulacak modülün adı. Zorunlu parametredir.

-RequiredVersion: Tam olarak belirtilen sürümü kurar. Ortamlar arası tutarlılık için önemlidir.

-MinimumVersion: Belirtilen sürüm veya üstünü kabul eder.

-MaximumVersion: Bu sürümü aşmayan modül kurar. Eski API’larla uyumluluk gerektiğinde kullanışlıdır.

-AllowPrerelease: Beta veya RC sürümlerini de dahil eder.

-Scope: CurrentUser veya AllUsers olarak ayarlanır. Admin yetkisi gerektirip gerektirmediğini belirler.

-Force: Zaten kurulu olsa bile yeniden kurar, uyarıları atlar.

-AllowClobber: Çakışan komutlar olsa bile kuruluma devam eder.

-SkipPublisherCheck: Yayıncı doğrulamasını atlar (dikkatli kullanın).

-Repository: Farklı bir kaynak depo belirtir.

-Credential: Kimlik bilgisi gerektiren depolar için kullanılır.

-Proxy: Proxy sunucusu adresi.

-WhatIf: Kurulumu simüle eder, gerçekten yapmaz.

# Belirli sürümü kur
Install-Module -Name Az -RequiredVersion 9.0.0

# Mevcut kullanıcı için kur (admin yetkisi gerekmez)
Install-Module -Name Pester -Scope CurrentUser

# Birden fazla modülü tek seferde kur
"PSReadLine", "posh-git", "oh-my-posh" | ForEach-Object {
    Install-Module -Name $_ -Scope CurrentUser -Force
}

Güvenilir Depo Ayarları

PowerShell Gallery’i ilk kullandığınızda genellikle bir uyarı alırsınız: depo güvenilir değil. Üretim ortamında her seferinde bu onayı vermemek için depoyu güvenilir olarak işaretleyebilirsiniz.

# Mevcut depoları listele
Get-PSRepository

# PowerShell Gallery'i güvenilir yap
Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted

# Doğrulama
Get-PSRepository -Name PSGallery | Select-Object Name, InstallationPolicy

Kurumsal ortamlar için kendi iç deponuzu da kurabilirsiniz. Bu özellikle internet erişimi olmayan “air-gapped” ortamlar için vazgeçilmezdir.

# Yerel dosya paylaşımını depo olarak kaydet
Register-PSRepository -Name "SirketRepo" `
    -SourceLocation "\fileserverPSModules" `
    -PublishLocation "\fileserverPSModules" `
    -InstallationPolicy Trusted

# Yeni depodan modül kur
Install-Module -Name SirketModulu -Repository SirketRepo

Gerçek Dünya Senaryosu 1: Azure Yönetimi

Bir bulut mühendisi olarak günlük işlerinizi PowerShell ile yönetmek istiyorsunuz. Azure modülünü kurmak oldukça basit ama bazı ince noktalar var.

# Az modülünü kur (bu biraz zaman alır, büyük bir modül)
Install-Module -Name Az -AllowClobber -Scope CurrentUser

# Eski AzureRM modülüyle çakışma varsa kaldır
Uninstall-Module -Name AzureRM -AllVersions -Force

# Azure'a bağlan ve abonelikleri listele
Connect-AzAccount
Get-AzSubscription

# Belirli bir aboneliği seç
Set-AzContext -SubscriptionId "your-subscription-id"

# Örnek: Tüm VM'leri listele
Get-AzVM | Select-Object Name, ResourceGroupName, Location, PowerState

Az modülü yüzlerce alt modül içerir. Tümünü kurmak yerine sadece ihtiyacınız olanı kurabilirsiniz:

# Sadece Compute ve Network modüllerini kur
Install-Module -Name Az.Compute -Scope CurrentUser
Install-Module -Name Az.Network -Scope CurrentUser

Modülleri Güncelleme

Kurulu modülleri güncel tutmak, güvenlik açısından da önemlidir. Update-Module komutu bu işi üstlenir.

# Tek modülü güncelle
Update-Module -Name Az

# Tüm kurulu modülleri güncelle
Update-Module

# Belirli bir sürüme güncelle
Update-Module -Name PSWindowsUpdate -RequiredVersion 2.2.0

# Hangi modüllerin güncel olmadığını kontrol et
$kurulu = Get-InstalledModule
foreach ($modul in $kurulu) {
    $galeri = Find-Module -Name $modul.Name -ErrorAction SilentlyContinue
    if ($galeri -and $galeri.Version -gt $modul.Version) {
        Write-Host "$($modul.Name): Kurulu $($modul.Version) -> Mevcut $($galeri.Version)" -ForegroundColor Yellow
    }
}

Bu kontrol scriptini bir zamanlanmış görev olarak çalıştırıp haftalık modül güncelleme raporu alabilirsiniz. Küçük bir yatırım, büyük zaman tasarrufu sağlar.

Gerçek Dünya Senaryosu 2: Windows Update Yönetimi

Sunucu yöneticilerinin en çok ihtiyaç duyduğu modüllerden biri PSWindowsUpdate‘tir. Uzak sunuculara Windows güncellemelerini PowerShell üzerinden itmek için mükemmeldir.

# PSWindowsUpdate modülünü kur
Install-Module -Name PSWindowsUpdate -Scope CurrentUser -Force

# Modülü içe aktar
Import-Module PSWindowsUpdate

# Mevcut güncellemeleri listele
Get-WindowsUpdate

# Güncellemeleri yükle ve gerekirse yeniden başlat
Install-WindowsUpdate -AcceptAll -AutoReboot

# Uzak sunuculara güncelleme it
$sunucular = @("web01", "web02", "db01")
Invoke-WUJob -ComputerName $sunucular -Script {
    Import-Module PSWindowsUpdate
    Install-WindowsUpdate -AcceptAll -AutoReboot
} -Confirm:$false -RunNow

Bu senaryo, 50 sunucuyu tek tek RDP’yle bağlanıp güncelleme yapmak yerine birkaç satır kodla halletmenizi sağlar. Fazla mesai saatlerini kurtaran türden bir iyileştirme.

Modülleri Kaldırma

Artık ihtiyaç duyulmayan ya da sorun çıkaran modülleri kaldırmak için Uninstall-Module kullanırsınız.

# Modülü kaldır
Uninstall-Module -Name PSWindowsUpdate

# Tüm sürümleri kaldır
Uninstall-Module -Name Az -AllVersions -Force

# Belirli bir sürümü kaldır
Uninstall-Module -Name Pester -RequiredVersion 4.6.0

# Eski sürümleri temizle, sadece son sürümü bırak
$moduller = Get-InstalledModule
foreach ($modul in $moduller) {
    $eskiSurumler = Get-InstalledModule -Name $modul.Name -AllVersions |
        Where-Object { $_.Version -ne $modul.Version }
    $eskiSurumler | ForEach-Object {
        Write-Host "Kaldiriliyor: $($_.Name) v$($_.Version)"
        Uninstall-Module -Name $_.Name -RequiredVersion $_.Version -Force
    }
}

Son script, disk alanı israfına neden olan eski modül sürümlerini temizlemek için oldukça işlevsel. Özellikle Az gibi büyük modüllerin birden fazla sürümü varsa GBs mertebesinde yer açabilirsiniz.

Modül Bilgisi Sorgulama

Kurulu modüller hakkında detaylı bilgi almak, sorun gidermede ve envanter çıkarmada işe yarar.

# Belirli bir modülün detaylarını gör
Get-InstalledModule -Name Az | Format-List *

# Tüm kurulu modülleri ve sürümlerini listele
Get-InstalledModule | Sort-Object Name | Format-Table Name, Version, InstalledDate

# Galeri'de modül ara
Find-Module -Name "*VMware*"

# Modülün bağımlılıklarını gör
Find-Module -Name Az -IncludeDependencies

# Bir modülün tüm sürümlerini listele
Find-Module -Name Pester -AllVersions | Select-Object Version, PublishedDate

Gerçek Dünya Senaryosu 3: Toplu Sunucu Kurulumu

Yeni bir sunucu filosu kurarken her sunucuya aynı modül setini hızlıca yüklemek gerekebilir. Bunun için küçük bir kurulum scripti hazırlamak, tekrarlayan işleri ortadan kaldırır.

# sunucu-moduller.ps1 - Standart modül kurulum scripti

param(
    [string[]]$ComputerName = @($env:COMPUTERNAME),
    [switch]$Force
)

$gerekliModuller = @(
    @{ Name = "PSWindowsUpdate"; MinimumVersion = "2.2.0" },
    @{ Name = "Carbon"; MinimumVersion = "2.12.0" },
    @{ Name = "Pester"; MinimumVersion = "5.0.0" },
    @{ Name = "PSScriptAnalyzer"; MinimumVersion = "1.20.0" }
)

foreach ($sunucu in $ComputerName) {
    Write-Host "[$sunucu] Modüller kontrol ediliyor..." -ForegroundColor Cyan

    Invoke-Command -ComputerName $sunucu -ScriptBlock {
        param($moduller, $zorla)

        # NuGet provider kontrolü
        $nuget = Get-PackageProvider -Name NuGet -ErrorAction SilentlyContinue
        if (-not $nuget -or $nuget.Version -lt [Version]"2.8.5.201") {
            Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -Confirm:$false
        }

        Set-PSRepository -Name PSGallery -InstallationPolicy Trusted

        foreach ($modul in $moduller) {
            $kurulu = Get-InstalledModule -Name $modul.Name -ErrorAction SilentlyContinue
            if (-not $kurulu -or $zorla) {
                Write-Host "Kuruluyor: $($modul.Name)" -ForegroundColor Green
                Install-Module @modul -Force -AllowClobber -Confirm:$false
            } else {
                Write-Host "Zaten kurulu: $($modul.Name) v$($kurulu.Version)" -ForegroundColor Gray
            }
        }
    } -ArgumentList $gerekliModuller, $Force.IsPresent
}

Write-Host "Tüm sunucularda kurulum tamamlandi." -ForegroundColor Green

Bu scripti şöyle kullanabilirsiniz:

# Tek sunucuya kur
.sunucu-moduller.ps1 -ComputerName "web01"

# Birden fazla sunucuya kur
.sunucu-moduller.ps1 -ComputerName "web01", "web02", "db01" -Force

Güvenlik Önerileri

Modül yönetimi söz konusu olduğunda güvenlik göz ardı edilemez. Özellikle üretim ortamlarında dikkat etmeniz gereken birkaç nokta var.

Yayıncıyı doğrulayın: Modülü kurmadan önce Find-Module çıktısındaki yazar ve proje URL’sini inceleyin. Popüler modülleri taklit eden zararlı paketler mevcuttur.

Sürümü sabitleyin: Üretim ortamında RequiredVersion parametresini kullanarak belirli bir sürümü hedefleyin. Otomatik güncellemeler bazen breaking change getirebilir.

İmzalı modüllere öncelik verin: Execution Policy’yi AllSigned olarak ayarlarsanız sadece dijital imzalı modüller çalışır. Kurumsal ortamlar için bu ekstra güvenceyi değerlendirin.

Execution Policy’yi doğru ayarlayın:

# Mevcut policy'yi kontrol et
Get-ExecutionPolicy -List

# Uzak imzalı modüllere izin ver
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope LocalMachine

# Sadece imzalı modüllere izin ver (en güvenli)
Set-ExecutionPolicy -ExecutionPolicy AllSigned -Scope LocalMachine

Modül hash doğrulaması: Kritik sistemlerde modülü indirdikten sonra hash değerini resmi kaynakla karşılaştırabilirsiniz.

# İndirilen modülün hash değerini hesapla
$modulPath = (Get-InstalledModule -Name PSWindowsUpdate).InstalledLocation
Get-FileHash -Path "$modulPathPSWindowsUpdate.psd1" -Algorithm SHA256

Bağımlılık Yönetimi

Bazı modüller başka modüllere bağımlıdır. Install-Module genellikle bu bağımlılıkları otomatik çözer, ancak bazen manuel müdahale gerekebilir.

# Bağımlılıklarıyla birlikte kur
Install-Module -Name Az -AllowClobber -Force

# Bağımlılıkları ayrı ayrı kontrol et
$modulBilgisi = Find-Module -Name PowerShellForGitHub -IncludeDependencies
$modulBilgisi | Select-Object Name, Version, Type

# Bağımlılık çakışmasını debug et
Import-Module Az -Verbose 2>&1 | Where-Object { $_ -match "Import|Error" }

Bağımlılık çakışmaları, özellikle farklı ekiplerin farklı modülleri kullandığı ortamlarda ortaya çıkar. CurrentUser scope’unu kullanmak, kullanıcı bazlı izolasyon sağlayarak bu tür çakışmaları azaltır.

Offline Ortamlar için Modül Yönetimi

İnternet erişimi olmayan ortamlarda modül yönetimi biraz daha zahmetli ama imkansız değil. En temiz çözüm, modülleri internete erişimi olan bir makinede indirip içeri taşımaktır.

# İnternete erişimi olan makinede: Modülü indir ama kurma
Save-Module -Name PSWindowsUpdate -Path "C:ModulPaketi" -Repository PSGallery

# Modülü tüm bağımlılıklarıyla birlikte kaydet
Save-Module -Name Az -Path "C:ModulPaketi" -IncludeDependencies

# Offline makinede: Kaydedilen klasörden kur
$env:PSModulePath -split ";" | Select-Object -First 1
Copy-Item -Path "C:ModulPaketiPSWindowsUpdate" `
          -Destination "C:Program FilesWindowsPowerShellModules" `
          -Recurse -Force

# Ya da klasörü geçici olarak modül yoluna ekle
$env:PSModulePath += ";C:ModulPaketi"
Import-Module PSWindowsUpdate

Sorun Giderme

Sık karşılaşılan hataları ve çözümlerini bilmek, saha deneyimini doğrudan etkiler.

“No match was found for the specified search criteria” hatası alıyorsanız önce depo bağlantısını kontrol edin:

# Galeri'ye bağlantıyı test et
Test-NetConnection -ComputerName "www.powershellgallery.com" -Port 443

# Depo kaydını sıfırla
Unregister-PSRepository -Name PSGallery
Register-PSRepository -Default

“Module already exists” hatası için -Force ve -AllowClobber birlikte kullanın.

TLS hatası alıyorsanız (eski sistemlerde yaygın):

# TLS 1.2'yi zorla
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Install-Module -Name Az

Sonuç

PowerShell modül yönetimi, Windows sistem yöneticiliğinin temel taşlarından biridir. Install-Module ile başlayıp Save-Module, Update-Module, Uninstall-Module gibi komutları öğrendikçe, modül ekosistemi size giderek daha fazla güç verir.

Özellikle dikkat etmeniz gereken iki nokta var: güvenlik ve sürüm yönetimi. Üretim ortamında her zaman belirli sürümleri hedefleyin, yayıncıları doğrulayın ve execution policy’nizi bilinçli ayarlayın. Kurumsal ortamlarda kendi iç deponuzu kurmak, hem güvenlik hem de internet bağımlılığını ortadan kaldırma açısından ciddi bir yatırım getirir.

Başlangıç için pratik bir öneri: PSWindowsUpdate ve PSScriptAnalyzer’ı hemen kurun. İlki Windows Update yönetimini kolaylaştırır, ikincisi yazdığınız scriptleri analiz ederek kaliteyi artırmanıza yardımcı olur. Bu ikisiyle bir süre çalıştıktan sonra modül yönetiminin nasıl işlediğini içselleştireceksiniz. Gerisi kendiliğinden gelecek.

Yorum yapın