Desired State Configuration – Yapılandırma Verisi

   Hatırlayacak olursanız önceki makaleyle birlikte Desired State Configuration’a giriş yapmıştık. Konunun anlaşılması adına örnekleri olabildiğince basit tutarak sadece sunucu üzerinde IIS yapılandırması üzerinden durdum. Öte yandan gerçek hayatta yapılandırmalarımız bu kadar basit olmayacaktır. Gerçek sistemlerde birden çok yapılandırma yapılması gerekecek, birden çok role sahip sunucunun bulunduğu parkura sahip olacaksınız. Sistem gereksinimleri değiştikçe sunucu parkurunuz da büyüyecektir. Bu durumda önceki makalemde paylaştığım yaklaşımda işler biraz karışabilir…

   Böylesi bir karışıklık DSC tasarımı sırasında göz önüne alınmış ve bu yapılandırmaları olabildiğince basit tutabilmek adına sunucu, özellik ve rolleri ile bunlara dair yapılandırmaların ayrılabilmesine olanak sunulmuştur. Bu sayede bir şablon oluşturabilir, bu şablonu farklı yapılandırmalarda kullanabiliriz.

   DSC’nin konuya yaklaşımı oldukça basittir; Yapılandırmanızdaki sunucu, rol v.b. değişken bilgiler bir hash table içerisinde tanımlanabilir ve bu tanımlamaları yapılandırmanız içerisinde kullanabilirsiniz. DSC içerisinde kullanacağınız bu özel hash table’ı örnek olması adına  $ConfigurationData  olarak adlandıracağım; fakat siz herhangi bir geçerli değişken adını da kullanabilirsiniz;

$ConfigurationData  @{
}

   Oluşturduğumuz bu hash table içerisinde bir ya da daha fazla dizi tanımlaması yapabilirsiniz. Burada dikkat etmeniz gereken tek ayrıntı $ConfigData içerisinde en az bir adet $AllNodes adıyla girdi bulunması zorunluluğudur;

$ConfigurationData  @{
    AllNodes = @( 
    )
}

   $AllNodes altında yine hash table’lar ile tanımlamalar yapabilirsiniz. Bu tanımlamalar ile ilgili dikkat etmeniz gereken nokta ise her bir hastable içerisinde NodeName girdisiniz mutlaka bulunması gerektiğidir;

 $ConfigurationData  = @{
  AllNodes = @(
    @{NodeName = 'UygulamaSunucusu1'; Role='Web'}
  )
}

   Buraya kadar yaptığımız aslında temel düzeyde anahtar-değer ikililerini sunuculara atamak. Verdiğim örnekte NodeName girdisi dışındakiler yapılandırmada kullanmadığımız sürece DSC tarafından anlamlandırılmayacaktır. Oluşturduğumuz bu yapılandırma verisini ConfigurationData parametresi yardımıyla aşağıdaki şekilde geçebilirsiniz;

$ConfigurationData  = @{
  AllNodes = @(
    @{NodeName = 'UygulamaSunucusu1'; Role='Web'}
  )
}


Configuration UygulamaSunucusuVarsayimi {    
    Node $AllNodes.NodeName {
        WindowsFeature IIS { 
            Ensure = "Present"
            Name = "Web-Server"
        }
    }
}

UygulamaSunucusuVarsayimi  –ConfigurationData $ConfigurationData

  Önceki makaleden devam ederek verdiğim yukarıdaki örnekte ConfigurationData  hash table içerisi sistem tarafından yorumlanarak yapılandırmamız içerisinde kullanabilmemiz sağlanacaktır. Örneğimizde, AllNodes içerisinde tanımlı her bir sunucunun adı kullanılıyor ve bu sunucuda IIS kurulumu gerçekleştiriliyor. Örneki Node anahtar kelimesinden hemen sonra verdiğim $AllNodes.NodeName girdisine dikkatinizi çekiyorum.

   Şimdi; örneğimizde sisteme yeni bir sunucu daha katılacak olursa yapılması gereken yapılandırma tanımına dokunmadan sadece bu tanıma geçtiğimiz veri üzerinde oynama yapmakta;

$ConfigurationData  = @{
  AllNodes = @(
    @{NodeName = 'UygulamaSunucusu1'; Role='Web'},
    @{NodeName = 'UygulamaSunucusu2'; Role='Web'},
    @{NodeName = 'UygulamaSunucusu3'; Role='Web'}
  )
}


Configuration UygulamaSunucusuVarsayimi {    
    Node $AllNodes.NodeName {
        WindowsFeature IIS { 
            Ensure = "Present"
            Name = "Web-Server"
        }
    }
}

UygulamaSunucusuVarsayimi  –ConfigurationData $ConfigurationData 

  Bu kadar kolay bir şekilde 3 sunucumu web rolünde, üzerinden IIS kurulu şekilde yapılandırmış oluyorum. Buraya kadar herşeyin net olduğunu umarım.

   Şimdi sıra geldi işleri biraz daha karmaşıklaştırmaya. Örneğimize yeni bir sunucu daha ekleyelim. Yeni sunucumuza role olarak web servis sunucusu (WebSrv) rolünü atarken önceki sunucularımızın rolünü de web uygulama sunucusu (WebApp) yapalım;

$ConfigurationData  = @{
  AllNodes = @(
    @{NodeName = 'UygulamaSunucusu1'; Role='WebApp'},
    @{NodeName = 'UygulamaSunucusu2'; Role='WebApp'},
    @{NodeName = 'UygulamaSunucusu3'; Role='WebApp'},
    
    @{NodeName = 'UygulamaSunucusu4'; Role='WebSrv'}
  )
}


Configuration UygulamaSunucusuVarsayimi {    
    Node $AllNodes.NodeName {
        WindowsFeature IIS { 
            Ensure = "Present"
            Name = "Web-Server"
        }
    }
}

UygulamaSunucusuVarsayimi  –ConfigurationData $ConfigurationData 

   Henüz belirttiğimiz role değerini yapılandırma tanımımız içerisinde kullanmadığımız için DSc tüm sunucularımıza IIS’i kuracaktır. Öte yandan web servis makinemizi bunun dışında tutmak isteseydik aşağıdaki şekilde bir tanımlama yapmamız gerekecekti;

$ConfigurationData  = @{
  AllNodes = @(
    @{NodeName = 'UygulamaSunucusu1'; Role='WebApp'},
    @{NodeName = 'UygulamaSunucusu2'; Role='WebApp'},
    @{NodeName = 'UygulamaSunucusu3'; Role='WebApp'},
    
    @{NodeName = 'UygulamaSunucusu4'; Role='WebSrv'}
  )
}


Configuration UygulamaSunucusuVarsayimi {    
    Node $AllNodes.Where{$_.Role -eq "WebApp"}.NodeName {
        WindowsFeature IIS { 
            Ensure = "Present"
            Name = "Web-Server"
        }
    }
}

UygulamaSunucusuVarsayimi  –ConfigurationData $ConfigurationData 

   Örneğimizde sadece web uygulamala sunucuları için işlem yapmak istediğimiz için Where sorgusu ile Role özelliği WebApp olan Node’ları seçerek işlem yapabildik. Örneğimizi biraz  daha karmaşık hale getirelim;

$ConfigurationData  = @{
  AllNodes = @(
    @{NodeName = 'UygulamaSunucusu1'; Role='WebApp'},
    @{NodeName = 'UygulamaSunucusu2'; Role='WebApp'},
    @{NodeName = 'UygulamaSunucusu3'; Role='WebApp'},
    
    @{NodeName = 'UygulamaSunucusu4'; Role='WebSrv'}
  )
}


Configuration UygulamaSunucusuVarsayimi {    

    Import-DscResource -Module xWebAdministration


    Node $AllNodes.Where{$_.Role -eq "WebApp"}.NodeName {
        WindowsFeature IIS { 
            Ensure = "Present"
            Name = "Web-Server"
        }
        
        WindowsFeature AspNet45 {
            Ensure          = "Present"
            Name            = "Web-Asp-Net45"
        }
        
        xWebsite DefaultSite {
            Ensure = "Present"
            Name = "Default Web Site"
            PhysicalPath = "C:\inetpub\wwwroot"
            State = "Stopped"
            DependsOn = "[WindowsFeature]IIS"
        }

        File ABCUygulamaIcerigi {
            Ensure = "Present"
            Type = "Directory"
            SourcePath = "\\KaynakSunucu01\ABCUygulamasi"
            DestinationPath = "C:\Uygulamalar\ABCUygulamasi"
            Recurse = $true
        }

        xWebsite ABCUygulamasi{
            Ensure = "Present"
            Name = "ABCUygulamasi"
            PhysicalPath = "C:\Uygulamalar\ABCUygulamasi"
            State = "Started"
            DependsOn = "[File]ABCUygulamaIcerigi"
        }
    }
}

UygulamaSunucusuVarsayimi  –ConfigurationData $ConfigurationData 

Not: Örneğin çalışması için PowerShell Desired State Configuration Resource Kit içerisinde yer alan xWebAdministration Modulünün yüklenmiş olması gerekmektedir.

   Bu sefer IIS kurulumu, Asp.Net yapılandırması yaparak ardından DefaultWebSite’ı durdurduk. Sonrasında ABC uygulamamıza ait \\KaynakSunucu01\ABCUygulamasi paylaşımında yer alan kodları sunucuda C:\Uygulamalar\ABCUygulamasi klasörü altına kopyaladık. Son olarak bu klasördeki dosyaları IIS’te 80 portu üzerinden sunduk. Tüm bu işlemler sadece rolü uygulama sunucusu olan sunucularımızda gerçekleşecektir.

   Aşağıdaki örnekte yapılandırmayı biraz daha dinamik hale getirdiğimizi görebilirsiniz;

$ConfigurationData  = @{
  AllNodes = @(
    @{
        NodeName = 'UygulamaSunucusu1'; 
        UygulamaAdi = 'ABCUygulamasi';
        KaynakKlasor = '\\KaynakSunucu01\ABCUygulamasi';
        HedefKlasor = 'C:\Uygulamalar\ABCUygulamasi'
    },
    
    @{
        NodeName = 'UygulamaSunucusu2'; 
        UygulamaAdi = 'ABCUygulamasi';
        KaynakKlasor = '\\KaynakSunucu01\ABCUygulamasi';
        HedefKlasor = 'C:\Uygulamalar\ABCUygulamasi'
    },
    
    @{
        NodeName = 'UygulamaSunucusu3'; 
        UygulamaAdi = 'ABCUygulamasi';
        KaynakKlasor = '\\KaynakSunucu01\ABCUygulamasi';
        HedefKlasor = 'C:\Uygulamalar\ABCUygulamasi'
    }
  )
}


Configuration UygulamaSunucusuVarsayimi {    

    Import-DscResource -Module xWebAdministration


    Node $AllNodes.NodeName {
        WindowsFeature IIS { 
            Ensure = "Present"
            Name = "Web-Server"
        }
        
        WindowsFeature AspNet45 {
            Ensure          = "Present"
            Name            = "Web-Asp-Net45"
        }
        
        xWebsite DefaultSite {
            Ensure = "Present"
            Name = "Default Web Site"
            PhysicalPath = "C:\inetpub\wwwroot"
            State = "Stopped"
            DependsOn = "[WindowsFeature]IIS"
        }

        File UygulamaIcerigi {
            Ensure = "Present"
            Type = "Directory"
            SourcePath = $Node.KaynakKlasor
            DestinationPath = $Node.HedefKlasor
            Recurse = $true
        }

        xWebsite Uygulama{
            Ensure = "Present"
            Name = $Node.UygulamaAdi
            PhysicalPath = $Node.HedefKlasor
            State = "Started"
            DependsOn = "[File]UygulamaIcerigi"
        }
    }
}

UygulamaSunucusuVarsayimi  –ConfigurationData $ConfigurationData 

   Örneğimizde klasör ve uygulama isimlerinin dinamik olarak yapılandırma verisi içerisinde nasıl çekildiğine dikkat ediniz. Biraz daha basitleştirmek istersek;

$ConfigurationData  = @{
  AllNodes = @(
    @{ 
        NodeName = "*"; 
        UygulamaAdi = 'ABCUygulamasi';
        KaynakKlasor = '\\KaynakSunucu01\ABCUygulamasi';
        HedefKlasor = 'C:\Uygulamalar\ABCUygulamasi'
    },
    
    @{ NodeName = 'UygulamaSunucusu1'; },
    @{ NodeName = 'UygulamaSunucusu2'; },
    @{ NodeName = 'UygulamaSunucusu3'; },
  )
}


Configuration UygulamaSunucusuVarsayimi {
    Import-DscResource -Module xWebAdministration

    Node $AllNodes.NodeName {
        WindowsFeature IIS { 
            Ensure = "Present"
            Name = "Web-Server"
        }
        
        WindowsFeature AspNet45 {
            Ensure          = "Present"
            Name            = "Web-Asp-Net45"
        }
        
        xWebsite DefaultSite {
            Ensure = "Present"
            Name = "Default Web Site"
            PhysicalPath = "C:\inetpub\wwwroot"
            State = "Stopped"
            DependsOn = "[WindowsFeature]IIS"
        }

        File UygulamaIcerigi {
            Ensure = "Present"
            Type = "Directory"
            SourcePath = $Node.KaynakKlasor
            DestinationPath = $Node.HedefKlasor
            Recurse = $true
        }

        xWebsite Uygulama{
            Ensure = "Present"
            Name = $Node.UygulamaAdi
            PhysicalPath = $Node.HedefKlasor
            State = "Started"
            DependsOn = "[File]UygulamaIcerigi"
        }
    }
}

UygulamaSunucusuVarsayimi  –ConfigurationData $ConfigurationData 

   Dikkat ederseniz AllNodes altındaki ilk girdi içerisinde NodeName olarak * değeri kullanılmakta. Bu, belirtilen yapılandırma verisinin tüm node’lar için varsayılan olarak kullanılacağı anlamına gelmektedir.

$ConfigurationData  = @{
  AllNodes = @(
    @{ 
        NodeName = "UygulamaSunucusu1"; 
        UygulamaAdi = 'ABCUygulamasi';
        KaynakKlasor = '\\KaynakSunucu01\ABCUygulamasi';
        HedefKlasor = 'C:\Uygulamalar\ABCUygulamasi'
    },
    
    @{ 
        NodeName = "UygulamaSunucusu2"; 
        UygulamaAdi = 'ABCServisUygulamasi';
        KaynakKlasor = '\\KaynakSunucu01\ABCServisUygulamasi';
        HedefKlasor = 'C:\Uygulamalar\ABCServisUygulamasi'
    },
  )
}


Configuration UygulamaSunucusuVarsayimi {
    Import-DscResource -Module xWebAdministration

    Node $AllNodes.NodeName {
        WindowsFeature IIS { 
            Ensure = "Present"
            Name = "Web-Server"
        }
        
        WindowsFeature AspNet45 {
            Ensure          = "Present"
            Name            = "Web-Asp-Net45"
        }
        
        xWebsite DefaultSite {
            Ensure = "Present"
            Name = "Default Web Site"
            PhysicalPath = "C:\inetpub\wwwroot"
            State = "Stopped"
            DependsOn = "[WindowsFeature]IIS"
        }

        File UygulamaIcerigi {
            Ensure = "Present"
            Type = "Directory"
            SourcePath = $Node.KaynakKlasor
            DestinationPath = $Node.HedefKlasor
            Recurse = $true
        }

        xWebsite Uygulama{
            Ensure = "Present"
            Name = $Node.UygulamaAdi
            PhysicalPath = $Node.HedefKlasor
            State = "Started"
            DependsOn = "[File]UygulamaIcerigi"
        }
    }
}

UygulamaSunucusuVarsayimi  –ConfigurationData $ConfigurationData 

  Bu örneğimizde ise UygulamaSunucusu1 web uygulamamızın barındığı sunucu, UygulamaSunucusu2 ise web servis uygulamamızın barındığı sunucu olarak yapılandırılmıştır.

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir