PowerShell ile SSIS paketlerinin canlı ortamalara kurulumu

Selamlar,

Bu yazımda SSIS paketlerimizi hazırlarken her zaman aklımızın bir ucunda olan fakat ihtiyacımız olana kadar girişmek istemediğimiz bir konuya eğilicem. Genellikle SSIS paketlerimizi hazırladıktan sonra test ve canlı ortamlara kurulumlarını yine biz yaparız. Fakat bankalar gibi kuruluşlarda buna pek izin verilmez. Genel düşünce bir developer olarak bizim bir script hazırlamamızdır. Hazırladığımız bu script sayesinde paketlerimizi test veya canlı ortama aktaracak olan kişi sadece script’i çalıştırarak deployment’ı yapmasıdır. Sizinde tahmin edeceğiniz gibi bu genellikle söylendiği kadar sorunsuz ve basit olmaz. Büyük ihtimalle de bizim yapan kişinin başında durmamız ve ona yardım etmemiz gerekir.

Yine de elimizden geldiğince SSIS paketlerimizin deployment sürecini otomatik hale getirmeliyiz. Aslında otomatikleştirme süreci biz SSIS paketlerimizi tasarlamaya başladığımızda aklımızın bir ucunda her zaman olması gereken bir konu ve bütün geliştirmemizi bunu hedefleyerek yapmalıyız. Örnek olarak SSIS paketlerimizin loglama ayarlamalarını önceden tasarlamamız gerekir. Bunun sebebi, bildiğiniz gibi test ve canlı ortamlarda geliştirme ortamımızda olduğu gibi BIDS (Business Intelligence Development Studio) veya SSDT (SQL Server Data Tools) yok, buna bağlı olarak da paketlerimizi debug etme şansımızda ortadan kalkıyor.

SSIS paketlerinde loglama tamamen ayrı bir yazı olabilir. Şimdilik sadece gelin kurulum script’i üzerine kafa yoralım.

İlk olarak ihtiyaçlarımızı belirlememiz gerekiyor, bunlar;

1- Çözümümüz hazırladığımız SSIS paketlerini SSIS msdb’e atabiliyor olması gerekiyor.

2- Çözümümüz birden çok paket için kurulum yapabiliyor olması gerekiyor.

3- Çözümümüz bizim belirlediğimiz Server ve klasöre kurulum yapabiliyor olması gerekiyor. Ayrıca eğer klasör yoksa otomatik olarak yaratabilmesi gerekiyor.

4- Çözümümüz SSIS paketlerimizin kullandığı SQL Tabloları veya veritabanı varsa onları da SQL Server’a kurulumlarını yapabiliyor olması gerekiyor.

Sanırım bu kadar gereksinim şimdilik yeterli.

İlk gereksinimden başlayalım.  Bize bütün çözümümüzde en büyük yardımı sağlayacak olan PowerShell script’i ile başlayalım. Bir SQL Server Admin ve MVP olan Chad Miller’ın kişisel blogunda bulduğum bu PowerShell script‘i inanılmaz derecede anlaşılması kolay ve sorunsuz çalışıyor. Benim PowerShell konusunda neredeyse hiç bilgim olmamasına rağmen ben hiç zorlanmadan kodu anladım hatta kendime göre biraz özelleştirdim.

Bu script’i direkt olarak bilgisayarınıza buradan indirebilirsiniz. Script’i indirdikten sonra Windows’dan Windows PowerShell’i çalıştırın. Windows 8’de Start ekranında PowerShell diye yazdığınız zaman arama sonuçlarında çıkıyor. Script 3 değişken alıyor. İlki SSIS paketinizin uzantısı ile beraber dosya adı. Ben PowerShell script’ini paketim ile aynı yere koydum bu sayede uzun uzun klasörleri yazmama gerek kalmadı sadece SSISPaketi.dtsx gibi birşey yazmam yeterli oldu. İkinci değişken ise kurulum yapacağınız makinanın adı. Unutmayın kurulum yapacağınız makinada Integration Services instance kurulu olması gerekiyor. Bunu kontrol etmek için makinanızda SQL Server Installation Center çalıştırın. Açılan ekranda sol menüden Tools seçin, sağ menüden Installed SQL Server features discovery report çalıştırarak, makina üzerinde olan bütün SQL Server kurulumlarını görebilirsiniz. Son değişken olarak ise SSIS msdb içersinde paketinizin hangi klasörler altına ve hangi isimle yadedicekseniz onu yazın.

Örnek olarak;

DEPLOYMENT_SCRIPT.ps1 STEP_1_SOMESSISPACKAGE.dtsx someservername FOOFOLDER\STEP_1_SOMESSISPACKAGE

Dikkat ederseniz ben PowerShell script’inin adını DEPLOYMENT_SCRIPT.ps1 olarak değiştirdim. SSIS paketimin dosya sistemindeki ismi ise STEP_1_SOMESSISPACKAGE.dtsx. Kurulum yapacağım makinanın ismi someservername ve SSIS paketimin adına da SSIS msdb’de FOOFOLDER klasörü yarattıryorum ve içine STEP_1_SOMESSISPACKAGE olarak koyuyorum.

PowerShell üzerinde bu tarz bir script çalıştırmayı denediğinizde eğer şu şekilde bir hata alıyorsanız PowerShell “execution of scripts is disabled on this system.” , çözümü bu Set-ExecutionPolicy RemoteSigned komutu çalıştırmak. Aklınızda bulunsun.

Bu script sayesinde aslında istediğimiz ana gereksinimi karşılamış oluyoruz fakat burada olmayan birkaç özelliği de ben scriptin son kısımdaki adımlarını biraz değiştirerek ekliyorum.

İlk adımda eğer SSIS paketim çalışırken dışarıya herhangi bir dosya çıkartıyorsa (yaratıyorsa) veya belli bir klasöre bağlanacaksa o klasörleri hazırlıyorum. İkinci adımda SSIS paketlerimin loglarını koyacağı bir klasör daha hazırlıyorum.

Üçüncü adımda SSIS paketlerimin ihtiyaç duyduğu veritabanını kuracak kodu yazıyorum. Burada dikkat etmemiz gereken kısım Add-PSSnapin SqlServerCmdletSnapin100 ve Add-PSSnapin SqlServerProviderSnapin100 ilk olarak bu ayarları yapmadan PowerShell ile SQL sorgusu çalıştıramıyoruz. Bahsettiğimiz iki kodu ekledikten sonra invoke-sqlcmd ile istediğimiz sorguyu istediğimiz makina üzerinde çalıştırabiliriz. Ben makina ismine değişken atadım kolaylık olsun diye. Sorgu olarak da SSIS paketlerimin kullandıkları veritabanının backup’ını (.bak uzantılı) istediğim makinadaki SQL Server’a Restore eden script’i veriyorum. Bu restore scriptini nasıl elde ederim derseniz kısaca anlatayım.

Restore işlemini yapacağınız SQL Server makinasına SSMS (SQL Server Management Studio) ile bağlanın. Databases klasörüne sağ tuşa basarak Restore Database seçeneğini seçin. Açılan pencerede Source olarak Device seçin ve .bak uzantılı istediğiniz dosyayı seçin. Sol tarafdan Options tabına giderek isterseniz Overwrite the existing database (WITH REPLACE) seçeneğini seçebilirsiniz. Bu sayede eğer serverda bu veritabanı varsa yenisini olanın üzerine yazacaktır. Bunuda ayarladıktan sonra sağ tarafda Script diye bir düğme göreceksiniz yanında da Help düğmesi vardır. Script’e basın, açılan menüden File seçeneğini seçerseniz ayarlamalarını yaptığınız restore işlemi T-SQL dilinde sorgu olarak size dosya sistemine kaydedilecektir. Bu dosyayı ben işte PowerShell scriptinde invoke-sqlcmd ile kullanıyorum.

PowerShell içersinde invoke-sqlcmd komutunu çalıştırmaya çalıştığınızda eğer bu şekilde bir hata alırsanız; The term ‘invoke-sqlcmd’ is not recognized as the name of a cmdlet, function, script file, or operable program. Yukarıda bahsettiğim gibi Add-PSSnapin SqlServerCmdletSnapin100 ve Add-PSSnapin SqlServerProviderSnapin100 komutlarını çalıştırmanız yeterli olacaktır.

Yukarıda 3 adıma kadar anlattım, geri kalan adımlar dikkat ederseniz Chad Miller’in yazdığı orjinal kodlar. Onarda da kısaca ilk olarak SQL Server’ın versiyonunu belirliyor. Çünkü SSIS paketini kurulumunu yapan Dtutil programının dosya  sistemindeki konumu SQL Server versiyonuna göre değişiklik gösteriyor. Daha sonra eğer SSIS msdb’de istenilen klasörler yoksa onlar oluşturuluyor. 7’inci adımda ise SSIS paketi yükleniyor ve son adımda testi yapılıyor.

#1. Create OutPut Directory
New-Item -ItemType directory -Path C:\SSIS_OUTPUT\
#2. Create LOG Directory
 New-Item -ItemType directory -Path C:\SSIS_OUTPUT\LOGS\
#3. Execute SQL Scripts
 Add-PSSnapin SqlServerCmdletSnapin100
 Add-PSSnapin SqlServerProviderSnapin100
invoke-sqlcmd –ServerInstance $ServerInstance -InputFile "RESTORE_DB.sql"
#4. Get Sql Version
$SqlVersion = Get-SqlVersion -ServerInstance $ServerInstance
#5. Set Dtutil Path based on Sql Version
 Set-DtutilPath -SqlVersion $SqlVersion
#6. Get SSIS Folder List, verify exists and create missing folders
Get-FolderList -PackageFullName $PackageFullName |
 where { $(test-path -ServerInstance $ServerInstance -FolderPath $_.FullPath) -eq $false } |
 foreach { new-folder -ServerInstance $ServerInstance -ParentFolderPath $_.Parent -NewFolderName $_.Child }
#7. Install SSIS Package
 install-package -DtsxFullName $DtsxFullName -ServerInstance $ServerInstance -PackageFullName $PackageFullName
#6. Verify Package
 test-packagepath -ServerInstance $ServerInstance -PackageFullName $PackageFullName

Artık PowerShell scriptimiz istediğimiz dosyaları yaratıyor ve paketlerimizi kullanacakları veritabanını SQL Server’da restore ediyor. Daha ne isteriz ki. Son olarak bu PowerShell scriptimizi bütün kurulumunu yapacağımız paketler için çalıştırmamız gerekiyor.

Bunuda eski dostumuz BAT dosyası ile yapabiliriz.

PowerShell.exe -file DEPLOYMENT_SCRIPT.ps1 STEP_1_SOMESSISPACKAGE.dtsx someservername FOOFOLDER\STEP_1_SOMESSISPACKAGE
 PowerShell.exe -file DEPLOYMENT_SCRIPT.ps1 STEP_2_SOMESSISPACKAGE.dtsx someservername FOOFOLDER\STEP_2_SOMESSISPACKAGE
PowerShell.exe -file DEPLOYMENT_SCRIPT.ps1 STEP_3_SOMESSISPACKAGE.dtsx someservername FOOFOLDER\STEP_3_SOMESSISPACKAGE
PowerShell.exe -file DEPLOYMENT_SCRIPT.ps1 STEP_4_SOMESSISPACKAGE.dtsx someservername FOOFOLDER\STEP_4_SOMESSISPACKAGE
@pause

Yukarıda ki BAT dosyası ile her SSIS paketi için PowerShell scriptini çalıştırıyorum ve en sonunda kullanıcıdan herhangi bir tuşa basarak pencereyi kapatmasını söylüyorum.

Evet toparlamak gerekirse elimizde bir SSIS paketini SQL Server’a atan bir PowerShell scripti var biz bunu kurulumunu yapacağımız her paket için çalıştırmamız gerekiyor. Bunun içinde bu script’i sırayla çağıran BAT dosyası hazırlıyoruz. BAT dosyası PowerShell scriptini çağırıyor, PowerShell scripti ise SSIS paketimizi belirlediğimiz makinaya ve klasöre yüklüyor.

Benim özel olarak PowerShell script’ine eklediğim özellikler LOG dosyaları için File System’de klasör yaratması ve paketlerimin ihtiyaç duyduğu veritabanını SQL Server’a Restore eden scripti çağırması.

Umarım bu çözüm işinize yarar. Görüşmek üzere.

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s