Skip to main content

· 5 min read
Hasan Gural

Bildiğiniz gibi artık API kullanımının meşhur olduğu bir dünyada yaşıyoruz. Hemen hemen her incelediğim projede bir yerinde bir ucunda API ile iletişim haline geçip iş yapmaya çalışıyoruz. Bu yazı içerisinde biraz eğlenceli ve tuhaf ama keyifli bir konuyu aktarmak istiyorum. Microsoft Graph API bizlere Azure Active Directory, Office 365 Bileşenleri, Intune, Planner etc, içerisindeki istediğimiz kullanıcının özniteliklerine ulaşmayı ve bunları alarak raporlar oluşturmamıza olanak sağlanıyor. Bunu sadece kullanıcı bazında sınırlamamak lazım, Intune, Mobile Device Report gibi genişletebiliriz. Her türlü raporları bu API sorgular yaparak alma şansınız var. Office 365 tarafı ile ilgilinen arkadaşlar için, şimdilerde Powershell Module geçişleri yapıyorlar, ya da daha önceki yazdıkları kod bloklarını dönüştürmeleri lazım. Bunun başında, MSOnline adındaki module artık, AzureAD adındaki olan ve arka tarafta Microsoft Graph API v2.0 ( Beta ) olarak kullanılan sürüme dâhil edilerek geliştirilmiştir. Bu yüzden iki farklı Powershell Modulunu kullandığınız zaman farklı öznitelikler(propertyler) görebilirsiniz.

Powershell ile Microsoft Graph API kullanırken yukarıda bahsettiğim sadece belirli bir objeleri değerlerini getirmek ve raporlamak için değil daha farklı yöntemler içinde kullanabilirsiniz. Microsoft Graph API en basit haliyle REST API olarak Azure Active Directory erişim sağlayabilirsiniz. Bu sayede Azure Active Directory içerisindeki Applicationlar ( App Registrations) verdiğiniz izinlere göre, Azure Active Directory içerisindeki verileri okur, nesneler oluşturur, onların değerlini okur ve güncelleme ve silme işlemlerini gerçekleştirmek tamamiyle Azure AD Graph API'sini kullanabilir. Örneğin, Microsoft Graph API'na sorgu yaparak bir kullanıcı nesnesi için aşağıdaki değerleri döndürebilirsiniz; Bunları bir süreç olarak düşenebilirsiniz.

  • User oluşturma, lisans ve manager atama, mobile device provision etmek,
  • Assign to Office 365 Groups or Assign to Azure Active Directory Groups etc.

Özetle bu API sayesinde bir süreç haline getirip hayatımızı kolaylaştırabilirsiniz. Microsoft Graph API ile erişebileceğiniz servislerin hepsini özetlemek gerekir ise,

  • Azure Active Directory
  • Office 365 services
    • SharePoint, OneDrive, Outlook/Exchange, Microsoft Teams, OneNote, Planner, Excel
  • Enterprise Mobility and Security services
    • Identity Manager, Intune, Advanced Threat Analytics, Advanced Threat Protection
  • Windows 10 services
    • Activities, Devices
  • Education

Daha farklı bir senaryo ise, siz Software as a Service veren bir firma olarak bu API müşterleriniz için kullanarak onların süreçleri için değişik uygulamalar geliştirme şansınız var. Daha önce farklı isimler ile duymuş olabilirsiniz, yada yukarıdaki tüm servislere farklı şekilde API sorgulamaları yapmış olabilirsiniz, artık Microsoft Graph API' olarak geliştirmeye devam edecek. Yavaştan nasıl bağlanacağımızı Powershell ile REST API sorgular yaparak neler yapabildiğimizi görelim, öncelikle bir adet Service Principal ihtiyacımız var. Bunu oluşturmak için, Azure Active Directory içerisinde, App Registration sekmesine giderek oluşturabilirsiniz, Aslında bu yaratacağımız Application ile Microosft Graph API RestFull istekler yaparak istediğimiz oluşturma, silme, güncelleme gibi talepleri gönderiyor olacağız.

Yukarıdaki resimde adımları anlatmak için bir ekran görüntüsü paylaşıyorum, yeni bir adet Application Registration oluşturmak çok zor bir süreç değil. Sadece oluşturduktan sonra gereken yetkileri vermeniz gerekiyor. Dilerseniz şu makaleyi takip ederek yapabilirsiniz. Link : Microsoft Graph API Started. Benim hali hazırda oluşturduğum kendi Azure Active Directory için bir adet Application Registration bilgilerim var ve bu Application için Azure Active Directory üzerinde Graph API ve diğer servisler için gereken yetkilendirmeleri yaptım. Şimdi Powershell tarafında ilk başta nasıl bir değişkenlere ihtiyacımız var hızlıca tanıyalım.

$tennantid        = 'tenantId'         ## Tenant bilginiz
$ApplicationID = 'AppClientdId' ## Application Id ( App Registration )
$ApplicationKey = 'AppClientSecret' ## Application Secret
$TokenEndpoint = {https://login.windows.net/{0}/oauth2/token} -f $tennantid
$ARMResource = "https://graph.microsoft.com"

Yukarıdaki değişkenleri oluşturduktan sonra karşınıza gerekli değerleri girmeniz gerekmektedir. Çünkü bu değerlerin hepsini Powershell içerisinden Rest API istek yaparken kullanıyor olacağız. Aşağıdaki örnek içerisinde nasıl bir değerler geldiğini anlayabilirsiniz.

Aslında bu tarz istekleri yapmadan önce PostMan veya HttpMaster kullanarak test etme şansınız var. Ayrıca Microsoft bu kısımda devreye giriyor ve bize Microsoft Graph API Explorer sunuyor. Bu sayede yapacağınız sorguları daha öncesinden anlamanıza yardımcı olur ve nasıl parametreler kullanamanız gerektiğine karar verebilirsiniz. Aşağıdaki sayfaya giderek yukaıdaki belirttiğimiz tüm servisler için sorgulamalar yapma şansınız var. Eğer Microsoft Idniz ile oturum açarsanız ve izin verdikten sonra çok daha farklı deneyimler yaşabilirsiniz. Burası işin tamamen kendinizi bu API kullanımında ne tür bilgiler ve aksiyonlar alabileceğiniz için sizlere yol göstermesi için hizmet vermektedir.

Powershell tarafında kaldığımız yerden devam edelim, Application Id ve Application Secret bilgilerini aldıktan sonra artık API içerisine authorization/authentication olmak için gereken değerlerimizi gönderelim. Bu işlemleri hepsi tamamen token alıp Microsoft Graph API erişmeye devam etmek olacak.

$tennantid        = 'tenantId'         ## Tenant bilginiz
$ApplicationID = 'AppClientdId' ## Application Id ( App Registration )
$ApplicationKey = 'AppClientSecret' ## Application Secret
$TokenEndpoint = {https://login.windows.net/{0}/oauth2/token} -f $tennantid
$ARMResource = "https://graph.microsoft.com"

#request Body for Microsoft API
$Body = @{
'resource'= $ARMResource
'client\_id' = $ApplicationID
'grant\_type' = 'client\_credentials'
'client\_secret' = $ApplicationKey
}

Yukarıdaki kod bloğundan sonra aşağıdakileri yazıp artık REST API üzerinende gereken token alma işlemizi tamamlayalım.

$tennantid        = 'tenantId'         ## Tenant bilginiz
$ApplicationID = 'AppClientdId' ## Application Id ( App Registration )
$ApplicationKey = 'AppClientSecret' ## Application Secret
$TokenEndpoint = {https://login.windows.net/{0}/oauth2/token} -f $tennantid
$ARMResource = "https://graph.microsoft.com"

#request Body for Microsoft API
$Body = @{
'resource'= $ARMResource
'client\_id' = $ApplicationID
'grant\_type' = 'client\_credentials'
'client\_secret' = $ApplicationKey
}

$params = @{
ContentType = 'application/x-www-form-urlencoded'
Headers = @{'accept'='application/json'}
Body = $Body
Method = 'Post'
URI = $TokenEndpoint
}

$token = Invoke-RestMethod @params

Yukarıdaki Powershell satırları sayesinde Microsoft Graph API istek yaptığınız zaman token almış olacaksınız. Bu token yine gördüğünüz gibi '$token' değişkenine atanmış olacak. Şimdi ise artık bu token alıp başına authorization sürecini bitirmek için, Header ekleyip Rest API tarafına göndereceğiz. Bu sayede artık sorgulamak istediğimiz herşeye sahip olacağız.

$headers = @{}
$headers.Add("authorization","Bearer $($token.access\_token)")

Neredeyse API tarafında istek yapabilir konumdayız. Serimizin bir sonraki bölümünde birkaç sorgular ve istekler ile Microsoft Graph API kullanımı örnekler ile genişletmeye çalışalım.

· 2 min read
Hasan Gural

İlk bölümünüzde Powershell ile Microsoft Graph API üzerinde nasıl auhentication olacağımızı ve tüm ön gereksinimleri inceledik. Artık ilk isteğimizi gerçekleştirelim ve nasıl bir mantığı olduğuna bakalım.

Çalıştırdığımız Invoke-RestMethod cmdlet çıktısını 'responsUser' adındaki değişkene atamasını gerçekleştirdim. Fakat bunun öncesinde, ne tür parametler gönderdik ona bakalım. Microsoft Graph API URI kısmına dikkat çekmek istiyorum. Bu kısım aşağıdaki şekilde iki farklı bölüme ayrılıyor.

İki farklı versiyon bulunuyor şuan, v1 çok eski kaldı diyebilirim. Beta olan v2 olarakda duyabilirsiniz ama hala beta olarak devam ediyor. Bu yüzden v1 ve v2 iki arasında sorgulamalar yaptığınız zaman farklı sonuçlar dönecektir. V2 karşımıza gelen sonuçlar yukarıda görebilirsiniz. İlgili Graph URI içerisinde '/users/userNameorPrincipalName' olarak gönderdiğiniz zaman kullanıcı, authenticate olduğunuz App Registrations yetkisi dâhilinde tüm nitelikleri görebilirsiniz. Bu yaptığımız sadece Invoke-RestMehod içerisine, Method olarak Get gönderip sadece birşeyleri getirmemiz, faydalanmamız için belirttik. Daha farklı methodlar bilebileceğiniz gibi var, ( POST, PATCH, GET, DELETE) şeklinde görebilirsiniz.

Hemen farklı bir örnek yapalım bu kullanıcının tüm özeliklerini listeledik. Bunları belirtiğimiz gibi güncelleme, silme hakkına sahibimiz, Rest API yapacağınız isteklere ve ihtiyacınız göre değişkenlik gösterir. Farklı bir örnek ile devam edelim, bu sefer sorguladığımız kullanıcının memberOf tarafına istek yapacağım ve üye olduğu groupları beraber görelim.

$responsUser = Invoke-RestMethod -Headers $headers -Method Get 
-Uri "https://graph.microsoft.com/beta/users/cloudshell@hasanguralhotmail515.onmicrosoft.com" `
-ContentType "application/json"

$responsUserGroup = Invoke-RestMethod -Headers $headers -Method Get
-Uri "https://graph.microsoft.com/beta/users/cloudshell@hasanguralhotmail515.onmicrosoft.com/memberOf" `
-ContentType "application/json"

Bu yaptığımız son örnekte ise belirttiğimiz gibi kullanıcının üye olduğu groupları listeledik. Powershell ile Microsoft Graph API Kullanımının tadını çıkarmak için aşağıdaki birkaç örnek daha sizler için bırakıyorum. Bunları sizde test ederek, hayal gücünüzün ötesine gidebilirsiniz.

$getUserInfo     = Invoke-RestMethod -Headers $headers -Method Get 
-Uri "https://graph.microsoft.com/beta/users/cloudshell@hasanguralhotmail515.onmicrosoft.com" `
-ContentType "application/json"

$getUserPhoto = Invoke-RestMethod -Headers $headers -Method Get
-Uri "https://graph.microsoft.com/beta/users cloudshell@hasanguralhotmail515.onmicrosoft.com/photo/$value" `
-ContentType "application/json"

$updateUserPhoto = Invoke-RestMethod -Headers $headers -Method PUT
-Uri "https://graph.microsoft.com/beta/users/cloudshell@hasanguralhotmail515.onmicrosoft.com/photo/$value" `
-ContentType "application/json"

· 6 min read
Hasan Gural

Bu yazı içerisinde Azure Route Table veya diğer adıyla bilnen User-Defined Route Table konusu hakkında detaylı bir şekilde bahsetmek istiyorum. Temel olarak User-Defined Route Table yaratılmasındaki gaye, Azure üzerinde konumlandırdığınız Network Virtual Appliance (WAN Accelator, Firewall ) cihazlarına trafiğin yönlendirilmesine yardımcı olur. Bildiğiniz gibi Azure üzerinde bir Virtual Network oluşturduğunuz zaman bunun yönetimi tamamen Software-Defined Networking olduğunu (SDN) için Microsof tarafından yapılmaktadır. Her oluşturacağınız Address Space, Subnet aynı Virtual Network içerisinde ise doğuştan ( temel olarak ) birbirleriyle haberleşirler.

Öncelikle şunu çok iyi anlayalım. Neden Azure tarafında User-Defined Route tablolarına ihtiyacımız var. Artık birçok şirket artık Azure üzerindeki kaynaklarının İnternet trafiğini inbound veya outbound tamamıyla Network Virtual Appliance üzerine devretmek istiyor. Microsoft Azure bizlere Marketplace üzerinde sunduğu ve desteklediği birçok çözüm var. Bunlar sırasıyla, Fortigate, Juniper, Cisco ve Checkpoint olarak adlandırabiliriz. Bunun yanı sıra Microsoft artık Azure Firewall adında tamamıyla bir firewall as a service hizmeti sunmaktadır. Bu kısımda maliyet yönetim ve esneklik devreye giriyor. Eğer siz third-party bir Network Virtual Applaince kiraladığınız zaman BYOL ve Core başında kullandığınız kadar ödeme modeli çıkmaktadır. Açıkcası bunlar benim kafamda oturtamadığım kadar pahalı gözükmektedir. Tercih meselesi ve ihtiyaçlardan oluşan bir durum işin özeti aslında. Tek bir Network Virtual Appliance koyma şansınız ne yazıkki çok gözükmüyor bu seferde Single Point of Failure kavramına takılıyor olacaksınız. Bu yüzden en az iki adet Availbility Set içerisinde Network Virtual Appliance konumlandırmalısınız ki hizmetiniz kesinti yaşamasın. Bunun dışında SNAT ve DNAT sorunlarına detaylandırıp canınızı hiç sıkmak ve anlatmak istemiyorum, orası yeni yeni Azure Load Balancer tarafında destekleniyor.

User-Defined Route Tables – System Routes Örnekleri

En basit haliyle, Azure tarafından atanan Virtual Network yönetiminde, Default Routes veya System Routes olarak adlandırabileceğim bir durum var. Bu Route tabloları tamamiyle Microsoft Azure tarafından yönetilir. System Route Table, temel olarak Sanal Sunucular arasındaki trafiği, On-Premises Network Trafiğini ve Internet'e giden trafik içindir. Bunları biraz daha özetlemek gerekirse aşağıdaki maddeleri şu şekilde açabiliriz.

Aynı Subnet içerisinde bulunan Sanal Sunucular Farklı Subnet içerisinde bulunan Sanal Sunucular Sanal sunucu üzerinden internete akan trafik VNet to VNet VPN kullanılarak Sanal Sunucu üzerinden akan trafik VPN Gateway üzerinden geçen Site to Site veya ExpressRoute iletişimi

Örneğin aşağıdaki bu sanal ağı iki alt ağ ile düşünün. Bunlar gördüldüğü üzere Front-End ve Back-end olarak çağrılmaktadır. Bu yüzden bunların tamamıyla yönetimi System Route ( Default Routes) tarafından yönetilmektedir.

Yukarıdaki senaryoyu biraz açmak gerekir ise, Sistem Routes hakkındaki bilgiler Route tablosuna kaydedilir. Route tablosu, paketlerin sanal bir ağda nasıl yönlendirilmesi gerektiğini belirten bir dizi yönlendirme kurallarından oluşmaktadır. Bunun dışında yine bildiğiniz üzere, Azure içerisinde herhagi bir Virtual Machine veya PaaS bir hizmetin belirli bir Next Generation Firewall ( Network Virtual Appliance ) üzerinden geçmesini istiyorsanız, User Defined Route tablolarını kullanmanız gerekmektedir. Bu Route tabloları subnet ile ilişkilendirilir ve subnet içerisinden ayrılan her paket, ilişkili route tablosuna temel alarak veya dayanarak işlenir. Paketler, hedefi kullanarak Route Tabloları eşleştirerek yön verilir. Gönderilen paket bir IP Adresi Aralığı belirtilerek gönderilen paket Virtual Network, Virtual Network Gateway, Virtual Appliance veya Internet olabilir. Eşleşen bir rota bulunamazsa, paket bırakılır.

User-Defined Route Tables Nasıl Oluşturulur?

Şimdi süreci tekrar gözden geçirelim. Nasıl bir akış içerisinde Route Table tanımlamaları yapılmaktadır. Önce bir Route Table oluşturmalısınız, daha sonra oluşturduğunuz Route Table içerisine tanımlamak istediğiniz 'Routes' (yönlendirme tablolarının) detaylarını girmeniz gerekmektedir. Bu Route Tabloları, belirttiğiniz bir Adress Aralığı için olmalıdır. Örneğin; '192.168.10.0/24' Network üzerine bir trafik gider ise bunu Virtual Appliance yönlendir şeklinde tanımlamalar yapabilirsiniz. Daha farklı yapmak isterseniz, bütün trafiği yine yönlendirmek için '0.0.0.0/0' olarak girilebilir. Azure Portal içerisinden adımları beraber inceleyelim. Portal üzerinde oturum açalım ve 'Route Table' yazarak ilk Route Tablomuzu oluşturalım.

Route Table üzerine tıkladımtan sonra bizlere hangi Resource Group içerisinde oluşturmak istediğinizi ve Region gibi bilgileri soruyor olacak. Bu kısımda dolduracağınız bilgiler tamamen sizin takip ettiğiniz naming convention yapısına bağlıdır.

Create Route Table ekranında karşımıza çıkan alanda BGP Route Propagation kısmı var, bu kısım defauly olarak Enabled olarak gelmektedir. Ama bunun ne tür bir işe yaradığını merak ediyorsanız, en temel hali ile Autonomous System mantığına göre çalışan bir protokoldur. Autonomous System Number aralığı 1 – 65535 e kadar gitmektedir. Bu numaralardan bazıları Azure tarafından defualt olarak kullanılmaktadır. BGP Number temel olarak VPN Gateway üzerinden Active-Active senaryolarında, Express Route kullanıyorsanız ortamınızda BGP de bir hedef networke giderken atlayacağı Autonomous System sayısına inceleyerek ve en verimli olan Autonomous System sayısını kullanarak hedef networke erişmeye çalışacaktır.

Artık Route Table oluşturduğunuz ve içerisine ilk önce bu Route Table hangi subnet tarafından kullanılacak bunun tanımlamasını yapalım.

'Associate' butonuna basarak üzerinde olduğunuz Route Table istediğiniz Virtual Network içerisindeki Subnet bağlayabilirsiniz. Tekrar hatırlatalım, Route Table birden fazla subnet atanabilirler, fakat sadece subnet seviyesinde atama yapabilirsiniz. Bu yüzden bu detaya çok dikkat etmelisiniz, örneğin o subnette birden fazla workload veya başka servisleriniz varsa bu route tablo içerisindeki kurallardan etkilenecektir.

Yukarıda görebileceğiniz üzere Subnet sekmesinde 'Subnet-Internal' isimli Virtual Network içerisinde bulanan Subnet tanımlamasını yaptım. Bundan sonra oluşturacağım tüm Route tabloları için bu 'Subnet-Internal' etkileniyor olacak. Şimdi ise örnek bir route oluşturalım bakalım nasıl gözüküyor olacak. Bu kısma geçmeden önce birkaç detay aktarmak istiyorum. Senaryo gereği, Azure üzerinde bulunan Virtual Network Address Space detaylarımız, '192.168.10.0/24' olarak tanımladım ve istediğim şekilde farklı subnetlere böldüm. Bu kısımdaki tasarım size ait bir konu, bunun dışında yazımızın başında Virtual Network içerisinde bulunan subnetler kendi aralarında native olarak konuşurlar. Bizim yapmak istediğimiz bu örnek üzerinde, 'Subnet-Internal' içerisinden herhangi bir Adress aralığına örneğin, '0.0.0.0/0' bu CIDR notasyonu tüm trafik için belirleyeceğiniz Next Hop tipine göre değişebilir. Şimdi gelin beraber hangi tür tipler karşımıza çıkmaktadır bunlara bakalım.

Virtual appliance: Azure üzerinde konumlandırdığınız ve aynı network içerisinde olan Network Virtual Appliance veya Azure Firewall olabilir. Eğer herhangi bir Next Generation Firewall ( Network Virtual Appliance ) konumlandırması yaptıysanız, ilgili cihazın Network Interface özelliklerinde 'IP Forward' özelliğini açık olduğuna emin olunuz. Temel olarak göstereceğiniz IP Adresi olacak ve Network Virtual Appliance cihazının internal ip adresi olmalıdır. Bu tasarıma göre Azure Internal Load Balancer olabilir.

Virtual Network Gateway: İhtiyacınız göre belirlediğiniz network aralığının Azure Virtual Network Gateway gitmesini yönlendirebilirsiniz. Bu kısımda dikkatli olunması gereken nokta, eğer virtual network gateway VPN – Route Based tipinde ise bunu yapabiliyorsunuz fakat Express Route kullanıyorsanız BGP devreye giriyor ve Route Tabloları işlemiyor.

None:İhtiyacınız göre belirlediğiniz network aralığının Virtual Network içerisinde durdurulmasını sağlayabilirsiniz.

Virtual Network: Bu bölüm odukça önemli aslında biraz Subneting detaylarına kadar gidiyor ama en basit hali ile Virtual Network içerisindeki varsayılan yönlendirmeyi ne zaman geçersiz kılmak istediğinizi belirtin. Bazı durumlardan Network içerisinden tüm paketleri çıkarmak istersen kendi Network içerisinde dönmesi gereken paketleri bırakabilirsiniz. Örneğin yukarıda '0.0.0.0' detayında route örneğinde herşeyin Virtual Appliance üzerine gitmesi tercih etmeyebilirsiniz. ( Kendi Network aralığınız olsa bile, işte bu yüzden Virtual Network tanımı yaparak network içerisinde kalsın deme hakkında sahipsiniz.)

Internet: Tahmin edebileceğiniz gibi istediğiniz adres aralığı için Azure tarafından size sunulan gateway sayesinde internete kavuşabilirsiniz. Bir sonraki yazımıda birkaç route oluşturma örneği portal üzerinden ve Powershell ile gerçekleştireceğiz.

· 5 min read
Hasan Gural

Yazımızın ilk bölümünde temel anlamıyla Route Tablolarını ve ne tür yönlendirmeler yapabileceğimizin üzerinden geçtik. Makalenin sonunu Route Tablosu oluşturma kısmında bitirmiştik. Şimdi ise artık beraber Route Tablosu oluşturalım ve ne tür detayları bizi karşılıyor görelim. Mevcut Route Tablomuzun üzerine gelelim ve Routes sekmesinden Add butonuna basalım ve artık başlayalım.

Add butonuna tıkladıktan sonra, bir takım bilgiler doldurdum. Bunları sırasıyla anlamaya çalışalım.

Route Name: Oluşturacağınız Route isim vermek isteyeceksiniz ve bu isimler daha sonra tanımladığınız routelar içerisinde anlamlı olmalıki karmaşıklığa sebep olmasın.

Address Prefix: Virtual Network içerisinden çıkan herhangi bir trafik bu adres ile ilişkilenir ise Next Hop Type ile belirlediğiniz cihaza, kaynakağa veya network içerisine doğru yönlenecektir.

Next Hop Type – Adress: Bu kısmı bir önceki yazımızda farklı tipler olabileceğini ve ne amaçla kullanıldığını anlattım. Bu örnekte Network üzerinde bir Virtual Network Appliance cihazımıza yönlendirmeyi seçtim. Temel amacım, tüm trafiğin Virtual Network Appliance üzerinden geçmesini sağlamak.

'Tamam' butonu ile oluşturma işlemini tamamladım. Artık Route Table üzerinde gelince özet halinde ne tür User Defined Route tanımlaması yaptığımı görebilir durumdayım.

Yukarıda görüldüğü üzere, 'Subnet-Internal' üzerinden giden herhangi bir trafik network üzerinden Virtual Network Appliance üzerine giriyor olacak ve bu cihaz sayesinde ilgili yerlere yönlendirilmesi yapılıyor olacak. Bu kısımda aklımıza gelen soru, ilgili subnet içerisinde bulunan herkes ortalam 60 saniye içerisinde etkilenmeye başlayacaklardır. Fakat bunu Subnet içerisindeki herhangi bir sanal sunucu nasıl etkilediğini veya sunucunuz arıtk nasıl bir route tablosuna sahip olduğunuzu anlamanız için Azure tarafında sizlere 'Effective Routes' adında bir kısım sunuluyor. Bunun sayesinde, ilgili sunucusunun Network Interface özelliklerinde bu alana giderek sunucu üzerinde hangi Route Tabloları işlenmiş görebilirsiniz. Bu örnek için hemen herhangi bir Network Interface üzerine gidelim ve detaylara beraber göz atalım.

Subnet içerisinde herhangi bir sanal sunucunun Network Interface sekmesine gittiğiniz zaman aşağıdaki gibi bir seçenek göreceksiniz.

Network Interface detayına gittiğimiz zaman 'Effective Routes' kısmında etki eden tüm routes detaylarını görebileceğiz. Fakat bu network kartının herhangi bir sanal sunucuya bağlı olması ve ilgili sanal sunucunun 'Running' durumda olması gerekmektedir. Aksi halde detayları göremeyeceksiniz.

Yukarıdaki gördüğünüz çıktı üzerindeki kırmızı alanda Source sekmesinde 'User' olarak yazan Route detayında bizim tanımladıklarımızı anımsayabilirsiniz. Bu Route tamamen User tarafından tanımlanmış ve Network Interface etki etmiştir. Diğer Default olarak gördükleriniz ise yazımızın başında bahsetmiş olduğum, System – Default Routes olup Azure tarafından yönetilmektedir. Microsoft Azure bizlere, Network içerisinde Routing yapmak istersek bunu bize aşmamız için, Route Tables kullanmamız gerektiğinden bahseder.

Şimdi gördülüğü üzere her süreci Portal üzerinden yaptık fakat yazımızın son kısmını Bonus olarak adlandıracağım ve Powershell ile yapmak isterseniz, aşağıdaki adımları takip ederek başarabilirsiniz.

En temel olan Azure üzerinde oturum açma işlemiyle başlıyoruz. Bunun detaylarını değinmek istemiyorum, blog üzerinden detaylı bir şekilde bulabilirsiniz. Aşağıdaki gibi komutları paylaşıyorum.

#region Login Azure Account
Login-AzureRmAccount
Select-AzureRmSubscription -Subscription 'e39ba2ed-xx-xx-xx-xx'

#endregion Login Azure Account

Oturum açma işlemini tamamladıktan sonra, sırasıyla sürecimize devam edelim. Sıradaki işimiz yeni bir adet Azure Route Table oluşturmak ve sonuçlarını beraber görelim. Bunun için kullanacağımız değişkenler ve command-lets bulunmaktadır. Lütfen bunların karşısındaki değerlere dikkat ederek çalıştırınız. Özellikle değişken tarafı oldukça önem arz etmektedir.

#region Create User Define Route Table

#region define Variables

$routeTableName = 'rt-prg-02'
$routeTableRGName = 'RG-NV'
$routeTableLocation = (Get-AzureRmResourceGroup -Name $routeTableRGName).Location

#endregion define Variables

New-AzureRmRouteTable -Name $routeTableName `
-ResourceGroupName $routeTableRGName `
-Location $routeTableLocation `

#endregion Create User Define Route Table

Powershell çıktısının verdiği sonuca göre başarılı bir şekilde Powershell üzerinden kaynaığımızı oluşturduk. Azure Portal içerisinden belirlediğiniz Resource Group seçtiğiniz zaman detayları oluştuğunu teyid edebilirsiniz. Şimdi ise, Azure Route Tablosu içerisine Route tanımlaması yapalım.

#region Create Routes

#region define Variables
$routeTableName = 'rt-prg-02'
$routeTableRGName = 'RG-NV'
$routeTableLocation = (Get-AzureRmResourceGroup -Name $routeTableRGName).Location
$routeName = 'RouteAllTrafic'
$routeDestPrefix = '0.0.0.0/0'
$routeNextHopType = 'VirtualAppliance'
$routeNextHop = '192.168.10.10'

#endregion define Variables

$routeConfig = Get-AzureRmRouteTable -ResourceGroupName $routeTableRGName -Name $routeTableName | `
Add-AzureRmRouteConfig -Name $routeName -AddressPrefix $routeDestPrefix `
-NextHopType $routeNextHopType -NextHopIpAddress $routeNextHop
#setConfig to existing Resources
Set-AzureRmRouteTable -RouteTable $routeConfig

#endregion Create Routes

Başarılı bir biçimde Azure Routes tanımlamasını yaptık. Yazımızın başında yaptığımız maneul işlemlerin hepsini Powershell üzernde döktük yeni bir Azure Route Tablosu oluşturarak. Son kısıma geldik, artık bu oluşturduğumuz tabloyu Subnet atamasını gerçekleştirebiliriz. Örnek olması açısından yine aynı Subnet atamasını yapacağım. Daha önce atamış olduğum Route Tablosunun bu subnet ile ilişkilendirilmesini sonlandırdım.

#region Associate a route table to a subnet

#region define Variables
$routeTableName = 'rt-prg-02'
$routeTableRGName = 'RG-NV'
$routeTableLocation = (Get-AzureRmResourceGroup -Name $routeTableRGName).Location
$routeName = 'RouteAllTrafic'
$routeDestPrefix = '0.0.0.0/0'
$routeNextHopType = 'VirtualAppliance'
$routeNextHop = '192.168.10.10'
$virtualNetwork = 'vn-prg-01'
$subnetName = 'Subnet-Internal'
$subnetAddPrefix = '192.168.10.128/28'

#endregion define Variables

$getVirtualNetwork = Get-AzureRmVirtualNetwork -Name $virtualNetwork -ResourceGroupName $routeTableRGName
$getRouteTable = Get-AzureRmRouteTable -ResourceGroupName $routeTableRGName -Name $routeTableName

Set-AzureRmVirtualNetworkSubnetConfig -VirtualNetwork $getVirtualNetwork `
-Name $subnetName `
-AddressPrefix $subnetAddPrefix `
-RouteTable $getRouteTable

#endregion Associate a route table to a subnet

Yukarıda görüldüğü gibi son olan işlemimizi başarıyla tamamladık. Artık Powershell atama sürecini kavramış bulunmaktayız. Bunu neden göstermek istediğimi aktarmak istiyorum, çok büyük yapılarda birden fazla User Defined Route Table yönettiğinizi hayal edin ve bunların bazen update edilmesi veya zorunlu değişiklik yapılması gerekmektedir. Yukarıdaki Powershell komutları sizlere bu açıdan yol gösterecektir. Son olarak dilerseniz Effective Routes tamamen Powershell üzerinden görmek için, 'Get-AzureRmEffectiveRouteTable' cmdlet faydalanmanız mümkün.

Yazımızın sonua geldik, bu yazı içerisinde temel anlamıyla Azure Route Table yönetimini ve detaylarına değinmeye çalıştık. Bir başka seride görüşmek üzere.

· 6 min read
Hasan Gural

Artık Array hakkında baya bir bilgi edindiğinimizi düşünüyorum ama yetmez diyebilirim. Geliştirdiğiniz Script, Workflow vd süreçlerde kesinlikle kullanacağınız farklı modeller olacaktır. Şimdi ise, Array içerisinden filter yapma sürecine değinelim.

Array ile Where kullanımı

En basit haliyle, Where-Object veya Where olarak bilinen bu cmdlet bizlere Pipeline sürecinden gelen değerleri filtreleme yapmamıza imkân sağlar. Daha yalın haliyle, Array içerisinde birçok elemanınız var bunların içerisinde çok özel bir karakteri olan veya belirli bir değere eşit olanları bulmak isteyebilirsiniz.

Bildiğiniz gibi yukarıdaki şekilde bir Array kollekisyonumuz bulunmaktaydı. Bunun üzerinden devam ederek Where kullanımı incelleyeceğim. İlk örnek '$myfirstArray' array tipindeki değişken içerisinde 'Where' methodunu çağırarak bir Script Block içerisinde değerimi gönderip filtreleme işlemini yapmak. Yukarıdaki örnek içerisinde sadece 'remote-pc4' eşit olmayan değerleri dönmesini istedik. Eğer Powershell özelinde karşılaştırma operatörlerini bilmiyorsanız lütfen göz gezdirin. Mevcut bir programlama diline göre biraz farklılıklar var. Örnek olarak '==' yerine '-eq' olarak kullanılmaktadır. Bunun gibi detayları için önce karşılaştırma operatörlerini öğrenmenizi tavsiye ederim.

# Array içerisinde nesne tanımlamak
$myObjectArray = @(
[pscustomobject]@{ArticleName='HasanGural-ARMTemplate';ArticleNumber='152'}
[pscustomobject]@{ArticleName='HasanGural-AzureDevops'; ArticleNumber='199'}
)

$myObjectArray | Where-Object ArticleNumber -eq 152

$myObjectArray | Where-Object ArticleName -like '*Devops*'

Yukarıdaki örnekleri detaylı bir şekilde inceleyelim. İlk yaptığımız önrek içerisinde bildiğiniz gibi bir önceki yazımızda Array içerisinde Object ( Nesne ) tanımlamayı görmüştük. Array içerisinde tanımladığımız nesne içerisinden ArticleNumber değeri '152' eşit olan değerleri bize döndürmesini sağladık. 'Where-Object' alias olarak Powershell içerisinde 'Where' olarak veya '?' olarakta bilinmektedir. Hemen altındaki örnekte ise, farklı bir karşılaştırma operatörü olan 'like' kullanarak içerisinde 'DevOps' kelimesi geçen değeri döndürdük.

Farklı Array grupları ile çalışmak.

Senaryo gereği farklı Array grupları ile çalışabilirsiniz. Bunların en başında farklı yerlerden Array şeklinde veri aktığını hayal ediniz. Örneğin; A servisinden tarafına gelen veriler var, bununla beraber B Servisinden aynı şekilde akan veriler olduğunu hayal ediniz. Bu verileri tek Array içerisinde birleştirip veya mevcut Array içerisine eklemeniz gerekebilir. Çok sık karşılacağınız bir durum olabilir o yüzden ne kadar örnek yapsak az ama ben en basit haliyle örnek vereceğim.

# 1. Array tanımlamak
$myfirstArray = @(
'remote-pc1'
'remote-pc2'
'remote-pc3'
'remote-pc4'
)

# 2. Array tanımlamak
$mysecondArray = @(
'remote-pc5'
'remote-pc6'
'remote-pc7'
'remote-pc8'
)

$myfirstArray + $mysecondArray

Farklı iki Array grubunu birleştirip bir sonuç elde ettik. '$myfirstArray + $mysecondArray' bu birleşimin sonucu bize Console üzerine yazdırdı. İstersek bir değişkene atayıp tüm Array sonucunu orada toplayabilirdik. Bu şekilde yapmanızın sebebi bir döngü içerisinde toplayıp işlem yaptırmanız olabilir. Esas önemli olan Array oluştururken arka tarafta neler döndüğünü anlamak gerekiyor. En basit haliyle diziler bellekte bir yeri vardır. Bu yüzden Array oluştururken veya değişiklik yaparken neler olduğunu çok iyi bilerek yapmamız gerekiyor. Bizim yaptığımız örnekler çok ufak eleman sayısı içermektedir fakat uzun ve çok fazla işlem olan Powershell Scriptleriniz Memory de oldukça tüketime sebep olacaktır.

Array içerisine eleman eklemek

Bu noktada, bir diziye nasıl öğe ekleneceğini merak etmeye başlıyorsunuz. En hızlı cevap olarak malasef yapamazsınız. Daha öncede söylediğim gibi diziler bellekte sabit bir boyuttur. Dizi sayısını arttırmanız veya tek bir öğe eklemeniz gerekirse, yeni bir dizi oluşturmanız ve tüm değerleri eski diziden kopyalamanız gerekir. Kulağa biraz ters bir işlem gibi geliyor ama ancak PowerShell yeni diziyi yaratmanın karmaşıklığını gizliyor ve siz farketmiyor olabilirsiniz. En son yaptığımız örnekte ise bunu detayı mevcut, iki farklı Aray oluşturduk ve bunları birleştirdik. Şimdi ise çok karşılaşılan bir kullanımı inceleyelim.

# 1. Array tanımlamak
$myfirstArray = @(
'remote-pc1'
'remote-pc2'
'remote-pc3'
'remote-pc4'
)

$myfirstArray += 'remote-pc5'

Anlatmak istediğim nokta, yukarıdaki örnekte mevcut. Dizi içerisine bir eleman eklemek istedik fakat dizideki tüm değerleri kopyalama işlemini yaptık. Bu kısımdaki '+=' işlemi aslında bunu ifade ediyor. Her ne kadar bir yeni eleman ekleniyormuş gibi gözüksede arkada tarafta tüm elemanlar kopyalanıp atama yapıldığını bilmekte fayda var. Bu yüzden uzun döngüler içerisinde bunu kullandığınız zaman çok dikkat etmeniz gerekmektedir. Bu kısımda '$myfirstArray.Add('newItem')' şeklinde 'Add method'u ile ekleme yapılamaz çünkü bizim Array tipimiz fixed size olarak karşımıza gelmektedir.

İç içe Array kullanımı

Bu örneği yazıp yazmama arasında çok gidip geldim. Aslında hiç kullandığım bir şey değildir kendileri fakat karşılaşırsanız kesinlikle anlamanız için faydalı olacaktır.

#nested Array kullanımı

$myfirstNestedArray = @(@('Azure','Powersell','VSCode'),@(155,222,600),@(400,123,559))

#nested Array kullanımı farklı bir dizim şekli
$mysecondNestedArray = @(
@('Azure','Powersell','VSCode'),
@(155,222,600),
@(400,123,559)
)

Gördüğünüz gibi iç içe Array tanımlamaları yaptık. Dediğim gibi çok kullanacağımız bir senaryo değil fakat bilmekte fayda var. Elbet bir gün hazır Script kullandığınız zaman karşınıza çıkabilir veya işiniz ile ilgili tanımlamaya ihtiyacınız olur. Çok kullanışlı olmasada bu şekilde bir tanımlaması var.

Veri tipini belirleyerek Array kullanımı

Bu konu biraz karmaşık olasada bu zaman kadar Array içerisinde her türlü verileri koyabileceğimiz üzerinden konuştuk. Bunlar Interger, String Boolean vd. Fakat dilerseniz Powershell içerisinde belirlediğiniz veri tipi örnek olarak 'String' tipinde bir veri talep ettiğinizde sadece String Array olarak tanımlama yaptırabilirsiniz. Böylelikle oluşturacağınız Array içerisinde sadece belirlemiş olduğunuz veri tipinde değerler bulunur. Unutmayın bunu kullanırken Array içerisine akan verinin belirlediğinz tipte olmasına dikkat etmeniz gerecektir. Aksi takdirde Error Handling ile süreci ile uğraşmanız gerecektir.

Yukarıdaki örneği biraz açıklayalım. Öncelikle String Array yapısı oluşturduk. Bunu yapmak için değişkenin başına '[string]' olarak tanımlama yaptık fakat '[]' iki adet köşeli parantez ile String tipinde bir Array olduğunu Powershell içerisinde tanımladık. Gördüldüğü üzere bu 'String Array' içerisine verilerimize koyduk. Hepsinin tipi String olarak gözlenmektedir. Farklı bir veri tipine ait Array oluşturalım. Şimdi örnek ise, Integer tipinde bir Array olsun.

Bu konyla ilgili olan bu son örmeğim olan, Integer tipinde olan Aray sonuçlarını yukarıda görebilirsiniz.

Array içerisinde bir veriyi RegEx kullanarak aratmak

Bu aslında en can alıcı nokta olarak söyleyebilirim. Bölüm içerisinde RegEx sağladığı faydaları tek tek yazmayacağım çünkü zaten birçok dilde kullanılıyor. Regular Expression ( RegEx) bir metni düzenlemek ya da metin içerisinden belli kurallara uyan alt metinler elde etmek için kullandığımız bir dildir. Powershell içerisinde zaman zaman '-like' ile '-match' arasında tam bir anlam karşıklığı olmaktadır. İşte en basit ayrımı '-match' kullandığınız zaman RegEx dâhil ederek basit bir şekilde Array içerisinde aradığınız sonuçlara ulaşabilirsiniz.

# 1. Array tanımlamak
$myfirstArray = @(
'remote-pc1-Id-{80523626-3ed7-458b-a53b-109c37b63bc4}'
'remote-pc2-Id-{000x1111-}'
'remote-pc3-Id-{80523626-3ed7-45cc-a53b-109c37b63bc4}'
'remote-pc4-Id-{11000x11-}'
'remote-pc5-Id-{15500x11-}'
)

#Match Kullanımı
$regExDefination = '{\w{8}-\w{4}-\w{4}-\w{4}-\w{12}}'
$myfirstArray -match $regExDefination

Array içerisinde RegEx kullanarak arama yapmak çok önemli bir konudur. Sebebi bazen akan verilen anlamsız içerik ile dolacak ve siz istediğiniz veri değerini filtrelemeye tabi tutmanız gerecektir. Bu yüzden örneğimizde 'match' operatörünü kullandık ve bu sayede RegEx tanımlamasını yapabildik. Görüldüğü üzere, Array içerisinde birçok bilgisayar adı ve bununla beraber GUID tanımlamaları var. Fakat bu bazılarının GUID tanımlamalarında sorun var ve siz sadece GUID tanımalaması düzgün olanları filtrelemek istiyorsunuz. İşte yukarıdaki örnekte RegEx defination içerisinde tanımlamamızı görebilirsiniz. Bu sayede 'Match' operatörü ile filtreleme sürecini başarıyla tamamladık. Farkındayım uzun bir yazı serisi oldu, Array hakkında birçok konu ve detaya girmeye çalıştık. En azından yeni başlayanlar için güzel bir adım olacaktır. Array hakkında merak ettiklerinizi lütfen yorumlar bölümüne yazınız ve talebiniz üzere daha farklı konulara değinebiliriz.

· 5 min read
Hasan Gural

Uzun zamandır yazmak istediğim yazının ilk adımını atmış bulunuyorum. Powershell ile çok fazla zamanı geçiyorum fakat deneyimimi aktaracak derli toplu bir yazı olmadığını farkındayım bu yüzden Level 100 bir seri ile olan Powershell ile Diziler ( Array ) konusuna değineceğim. Konuya başlamadan önce kesinlikle bir uyarı yapmam gerekiyor, bunun en başı temel programlama bilgisinde olan değişken nedir, nasıl atanır gibi konulara göz gezdirmeniz olacaktır. Bu yazı hiçbir şekilde Değişken ( Variable ) gibi detayları kapsamıyor. Sizin bildiğinizi en azından Powershell içerisinde değişken nasıl oluşturulur, nasıl atanr gibi konulara ucundan hâkim olmanız yeterlidir.

Powershell Diziler Nedir, Ne için kullanmayalıyız?

En basit haliyle 'Diziler' nedir bunu bir anlayalım. Diziler, birden fazla aynı veya farklı tipte veri tipinin bir araya gelmesiyle oluşur. Bu veriler String, Integer, PSObject vd. gibi tipler olabilecegi gibi, kendi yazdigimiz nesneler de olabilir. Buna ek olarak birden fazla değişkeninde bir araya gelmesiylede oluşabilir diye tanımlayabiliriz. Çok geçmise gidersek, Matematikteki sonlu dizi adında bir konu var, oraya dönüp hafızayı pekiştirebilirsiniz. Yazımında devamında artık Dizilere ( 'Array' ) olarak sesleniyor olacağım bu yüzden kafanız karışmasın.

Array, birden çok öğenin bir koleksiyonu olarak işlev gören bir veri yapısıdır. Koleksiyon kelimesi çok önemli bunu lütfen aklınızda yer etmesini sağlayın. Koleksiyon dediğimiz zaman aklınıza elinizde birden fazla erişebildiğiniz bir değerler bütünü olduğunu hayal ediniz. Array'ler üzerinde yeni eleman ekleyebilir veya Array içerisinden belirlediğiniz bir elemana erişebilirsiniz.

Array oluşturmaya ilk adım

Powershell içerisinden değişken bildiğiniz üzere '$' işareti ile başlanarak oluşturulmaya başlanır. Vereceğiniz değişken adını '$' işaretinden sonra yazarsınız ve Powershell tarafından otomatik olarak algılanır ve '=' eşittir ile atamasını gerçekleştirirsiniz. Hemen aşağıdaki basit kullanım ile başlayalım.

Yukarıda görüldüğü üzere, ilk Array tanımlamımızı yaptık. '$myfirstarray' adındaki değişkeniz var fakat karşına '@()' girerek kendisinin bir Array olduğunu Powershell'e söylemiş olduk. Şimdilik bu bizim için boş bir Array yani içerisinde herhangi bir eleman yok. Şimdi ise Array içerisine eleman atayalım ve neler olduğunu anlayalım.

Görüldüğü üzere üsteki resim içerisinde Array içerisine elemanlar yazdık ve ilgili satırı çalıştırarak memory içerisine aktarmış olduk. Daha sonra değişkeni, çağırdığımız zaman karşımıza tüm elemanları döküldüğünü görüyor olacaksınız. Üste gördüğünüz resim içerisinde tüm anlattığım adımları yaptım, bir Array oluşturup içerisine elemanlarımı tanıttım ve daha sonra Array çağırdığımda tüm elemanlarımı görebiliyorum. Dilerseniz bunun dışında şu şekilde tanımlama yapabilirsiniz. Aşağıdaki örnek farklı bir tanımlama şeklidir.

Yukarıdaki örnekte her bir satırda eleman tanımlaması yaptık. İki şekilde kullanabilme şansınız var, ben günlük hayatta yazdığım kodların okunabilmesi için en son gerçekleştirdiğim şekilde yazmayı tercih ediyorum. İlk yaptığımız örnek fena değil ama Array içerisinde çok fazla elemanınız olunca görüntü ve okunabilirlik açısından çok zor olmaktadır. Birçok tanımlama yöntemi var Array tanımı yaparken, bunlardan en ilgiç olanı birazdan aşağıda göreceğiniz normalde ben hiç kullanmıyorum ama karşınıza çıkar ise bir Array tanımlanıza yardımcı olan cmdlet 'Write-Output' unutmayız. Aşağıdaki son örnek farklı bir açıdan Array tanımlamak. Dikkat ettiyseniz elemanlar arasında herhangi bir virgul ile tanımlama yok, ama bu şekilde tanımlamaya rastlarsanız unutmayın bu komut ise Array oluşturmanızdaki en değişik yöntemlerden bir tanesidir.

Array içerisindeki elemana erişmek

Öncelike Array içerisindeki elemanlara neden erişmek istediğimizi bir anlayalım. Tanımlı olan elemanlarınızın içerisinden değişiklik yapmak isteyebilirsiniz veya var olan bir elemana erişip onunla ilgili bir bilgiye edinmek isteyebilirsiniz. Array içerisinde bulunan her elemanın bir Index değeri vardır. Yani o dizi içerisinde sırasını belirten bir değer. Aşağıdaki örnek içerisinde tanımlamış olduğumuz elemanların Array içerisindeki Index değerli mevcuttur. Her programlama dilinde ilk Index değeri yani o elamanın yerinin belirtildiği yer SIFIR ile başlar. Bu yüzden Array içerisindeki ilk elemanınız çağırmak isterseniz her zaman index değerinin sıfır'dan başladığını bilmeniz gerekiyor.

Elemanlarımıza erişmek için aşağıda gösterilen şekilde köşeli parantez '[]' içerisine Index numaranızı yazarak erişebilirsiniz.

Array içerisindeki elemana erişmek istiyorsak yukarıdaki gibi gösterildiği şekilde tanımlama yapmamız gerekiyor. Tanımladığımız Array içerisinden bir eleman çağırma işlemiyle başlayalım. Bildiğiniz üzere toplamda 4 adet elemanım var bunlardan 'remote-pc2' olanı çağırmak istiyorum Array içerisinden, bunun Index değeri yani basit haliyle dizi içerisinde onu gösteren veya tanımlayan sırası 1 olarak gözlenmektedir.

Yukarıdaki resim içerisinde 'remote-pc2' isimli elemanımı çağırmak için şu şekilde bir '$myfirstArray[1]' tanımlama kullandım. Bu sayede istediğim elemana Array içerisinden erişmiş oldum. Eğer sizde diğer yazılım dillerine hâkim iseniz çok zorluk çekmeyeceksiniz, hemen hemen aynı mantık ve syntax yapısına sahip olduğunu görebilirsiniz.

Array içerisindeki birden fazla elemana erişmek

Başka bir durum ise yine farklı bir kullanımı olan belirlediğiniz birden fazla Index değeri ile birden fazla elemana ulaşma şansınız bulunmaktadır. Örneğin, 'remote-pc1', 'remote-pc3' aynı anda ukaşmak istiyorsanız kullanım şeklini aşağıda görebilirsiniz.

Hatırlarsanız, köşeli parantezler içerisine bir Index numarası girerek istediğimiz elemanı ilgili Array içerisinden çağırabileceğimizden bahsetmiştik. Bu örnekte ise, birden fazla 'Index' numarasını 'virgül' koyarak erişebildiğiniz bir senaryo olarak düşünebilirsiniz.

Örneklerimizde farklı detaylara değinmeye çalıştık. Array kullanımının farklı özelliklerinden bahsettim aklıma gelenler ve temel olanlar şimdilik bu kadar, Array içerisindeki elemana erişmenin birçok yöntemi bulunmaktadır. Yukarıdaki son resimdeki sonuçları lütfen inceleyerek anlayamaya çalışınız.

Array içerisindeki elemanları güncellemek

Array içerisinde tanımlı olan elemanları bazı sebeplerden dolayı güncellemek veya içeriğinde bir değişiklik yapmak isteyebilirisiniz. Bunu yapmak için bilmeniz gereken ilgili elemanın Index değerini ve Array içerisinde o elemanı aramak.

Gördüğünüz gibi yukarıdaki resim içerisinde Array içerisindeki sırası ilk yanı Index numarası (0) sıfır'a eşit olanı güncellenmesini yaptım. Array tekrar çağırdığım zaman son güncel halinin sonucu görebilirsiniz. Index numarası sıfır'a eşit olanı güncelledim ve sonuç görüldüğü gibi, eleman sayısımız 4 adet falan ben farklı bir örnek yaparak hata almaya çalışacağım ve neden hata aldığımıda anlayamaya çalışalım.

Array içerisinde Index numarası 4'e eşit olan elemanın update etme işlemine kalkıştık, fakat bildiğiniz gibi bizim toplam 4 adet elemanımız var ama Index numarası 0(sıfır)'dan başladığı için en son elemanımızın Index numarası 3(üç)'e eşit olmaktadır. Index numarası 4 olan bir elemanımız yok, güncelleme işlemini yaptığım zaman bir hata almaktayım. Birçok kişinin yanıldığı veya öyle düşündüğü bir nokta var aslında, eleman Index sayısına eşit olmasa bile Array içerisine o elemanı ekleyecekmiş gibi düşünüyor fakat Array içerisine Index sayısını gönderdiğiniz için 'Outside the bounds of the array' hatası almaktasınız. Bu sebepten ötürü dikkatli olmanızı öneririm. Uzun döngüler, içerisinde hatanın nerede olduğunu anlarken kaybolmak istemiyorsanız ne zaman Array yapısı kullandığınıza çok dikkat etmelisiniz.

Serimizin devamında, Iteration konusu ile devam edeceğiz.

· 2 min read
Hasan Gural

I've been working Azure Resource Templates for consistency deployment process.This GitHub repository offers test platform who wants to deploy quickly Active Directory Environment which will be placed on Windows Server 2016 OS for Azure deployments. All of the templates in this repository have been developed for who needs this structure. This repository contains just Standalone Active Directory deployment templates that have been tested. The templates for Microsoft Learning Partner who wants to demonstrate quickly Azure Resource Manager Templates

This template allows you to create these resources.

  • Virtual Machine - ADDS Service
    • Network Security Group with RDP Rule
    • Public Ip Address - Static
    • Desired State Configuration Extension - ADDS
    • BGInfo Extension
    • Diagnostic Storage
  • Virtual Network
    • 2 subnets: Application, Management
    • DNS Server : ADDS Server

Also you can deploy this template with the Powershell. Before you have to login with your Azure Admin Account on the Azure Powershell. However, you can use Azure Cloud Shell.

# --- Set resource group name and create
$ResourceGroupName = "pr-prod-rg"
New-AzureRmResourceGroup -Name $ResourceGroupName -Location "West Europe" -Force

# --- Deploy infrastructure
$DeploymentParameters = @{
envName = "msft"
vNETAddress = "172.10.0"
userName = "prAdmin"
userPassword = "mike!s10!q"
domainName = 'msft.com'

}

New-AzureRmResourceGroupDeployment -Name "deployment-01" -ResourceGroupName $ResourceGroupName -TemplateFile .\\examples\\example-linked-template.json @DeploymentParameters

Also you can reach my GitHub Profile here; https://github.com/hasangural

· 5 min read
Hasan Gural

There are several ways to connect Azure Subscriptions. Before, we were using VPN gateway for connecting different subscriptions Virtual Network to Virtual Network. We can use VNet Peering to connect virtual networks in the same Azure region or different Azure regions. The virtual networks can be in the same Azure subscription or in different subscriptions, as long as they share the same Azure AD tenant. Also now, we can use VNet Peering to connect different Azure AD Tenants. VNet Peering also allows you to connect two virtual networks created by using different deployment models. In this article, I'm going to explain how can we implement VNet Peering across different Azure Active Directory Tenants.

Before we start this article, what exactly we need to implement for this feature. We can configure VNet Peering by using the Azure portal, Azure PowerShell, Azure CLI and also Azure Resource Manager templates.

As you can see the above picture, need requirements which will be used for VNet Peering to connect Azure subscriptions.

Contents of this article;

  • Clarify VNet to VNet Peering
  • Creating and Configure VNet in the CompanyA with Powershell
  • Creating and Configure VNet in the CompanyB with Powershell
  • Configuring VNet Peering for each Virtual Network.
  • Conclusion

Clarify VNet to VNet Peering

As we mentioned before, If you want to use VNet peering for your project or production environments, you can find below requirements which should have for each user.

  • At least one user who has got access on all subscription.
  • If you want to use multiple users for each subscription, each user should have to reach all subscriptions
  • Users should verify to access each subscription on the different Azure AD Tenants.
  • Take notes subscriptions.

In this article, I'm going to use just one user which has got permission for each subscription. On the best practices case, you should use specific users which have got permission for each subscription. Note that, in this article, we use the AZ Powershell Module which is new.

Creating and Configure VNet in the Company-A with Powershell

Now I have one user and it has permission for each subscription which placed different tenants. We are going to build new infrastructure resources because I want to show you step by step how can we manage this action. In this example, we have two companies. We call them Company-A and Company-B. The first Step is needed to login Powershell with the accessed user. Thereafter, We will create new resources, Virtual Network. We will do these actions each subscription. Because As I said before, we will be created new infrastructure resources.

Connect to Azure Connect-AzAccount

Create Resource Group for Company-A

New-AzResourceGroup -Name "RG-Company-A" -Location "West Europe" -Tag @{Company="A"}

# Create Virtual Network for Company-B

New-AzVirtualNetwork -Name "companyA-VNET" `
-ResourceGroupName "RG-Company-A" `
-AddressPrefix "192.168.10.0/24" `
-Location 'West Europe' -Tag @{Company="A"}

As you can see the results say us, we have executed our command lets for creating Resource Group, Virtual Network. We did all the steps into the Company-A Subscription.

Creating and Configure VNet in the Company-B with Powershell

Now we can log in to "Company-B Subscription". We are creating same resources which are Resource Group and Virtual Network. Afterwards, now we are ready to peer two different Virtual Network.

# Create Resource Group for Company-A

New-AzResourceGroup -Name "RG-Company-B" -Location "West Europe" -Tag @{Company="B"}

# Create Virtual Network for Company-B

New-AzVirtualNetwork -Name "companyA-VNET" `
-ResourceGroupName "RG-Company-B" `
-AddressPrefix "10.10.10.0/24" `
-Location 'West Europe' -Tag @{Company="B"}

As you can see clearly, we have created Resource Group and Virtual Network on each subscription. Now can skip configuring VNet to VNet Peering steps. I think that it is the easiest way to implement Azure subscriptions which placed on different Azure Active Directory Tenant.

Configuring VNet Peering for each Virtual Network.

We are going to use two command-lets which are "Get-AzureRmVirtualNetwork" and "Add-AzureRmVirtualNetworkPeering". Also As we said before, we have to take a note each subscription Id. Because We will use them into the Powershell Command-Lets.

# Peer company-A-VirtualNetwork to company-B-VirtualNetwork
# Select Company-A Subscription - Select-AZSubscription.

$vNetA = Get-AZVirtualNetwork -Name companyB-VNET -ResourceGroupName RG-Company-B

Add-AZVirtualNetworkPeering \`
-Name 'companyA-VNET' \`
-VirtualNetwork $vNetA \`
-RemoteVirtualNetworkId "/subscriptions/26e1b27f-\*\*\*\*\*\*\*\*8829-cacfc62/resourceGroups/RG-Company-A/providers/Microsoft.Network/virtualNetworks/companyA-VNET"

In the script lines, I did mention red lines which should be referred to Resource Group, Virtual Network, and SubscriptionId. We should use the above script for Company-A side. You have to execute the same scripts for the company-B site before you should be sure using "Company-B". If you used to the same script for the Company-B side now we can test peering connections status. Also, you can see the above picture, "PeeringState" column which explains to us peering status.

Conclusion

End of the article, we are going to test what is connection status for VNet Peering. There are two ways to control status VNet Peering. As you may know, the first one is Azure Portal also we can check with Powershell Command Lets. We used to Powershell Scripts for VNet Peering because Azure Portal does not support this implementation. You can see the below picture two ways.

· 3 min read
Hasan Gural

Packer serimize Provisioners' ile devam ediyoruz. Packer Image Template'leri içerisinde, 'Provisioners' bölümü en çok dikkat çeken kısım olarak karşımıza çıktığını daha önce belirtmiştim. Packer ile oluşturmak istediğiniz imaj için öncesinde içerisinde olmasını istediğiniz yazılımı yüklemek veya işletim sistemini yapılandırmak için kullanması gereken bir özelliktir. Basit olarak bunu kullanmanızda birçok aşama var. Öncelikle bildiğiniz gibi bir imaj alırken, Sysprep önem arz eder, bunun dışında belki o imaj içerisinde belirli bir yazılım olsun, Registry içerisinde şu şekilde bir kayıt olsun, bunu değeri bu olsun, hatta Package Management üzerinden bir yazılım yüklensin gibi her türlü detayı belirtebiliryorsunuz. Öncelikle 'Provisioners' isteğe bağlıdır. Bir şablon içinde hiçbir hazırlayıcı tanımlanmamışsa, sonuçta ortaya çıkan makine görüntülerine varsayılanlardan başka hiçbir yazılım yüklenmeyecektir. Bununla birlikte, bu tipik değildir, çünkü Packer'ın değerinin çoğu önceden yapılandırılmış yazılımın çoklu özdeş resimlerini üretmektir. Provisioners genellikle bir Powershell Script, bash script vb. nitelikler ile tanımlanır.

Yukarıda görüleceği gibi basit bir haliyle mevcut imaj için tanımladığımız JSON dosyamızın son bölümüne, 'Provisioners' adında yeni bir nitelik tanımladım ve artık bunun içerisinden Powershell, Shell gibi komut satırları aracılığı ile istediğimi yapabileceğim. İstediğim derken? Hayal gücünüze kalan bir detay burası, tamamıyla size ait, isterseniz, bir Web Server install edebilir, isterseniz Scale Set kullanıyorsanız, Scale Set sonrası image içerisinde yapılması gerekenleri script içerisinde yazarak hızlı bir şekilde image haline getirebilirsiniz. Şimdi ise basit bir Powershell Script tanımlaması yapalım ve neler olduğunu görelim.

Kırmızı alan içerisine aldığım satırlarda örnek olması için Provisioners bölümünü ekledim ve 'type' olarak Powershell yazdım. Tekrar söylemek gerekirse, Provisioners olmadan bir imaj yaratmanız neredeyse imkansız, biz Builders içerisinde Microsoft kütüphanesi içerisinden hazır bir imajdan faydalandık. Fakat bizim için sadece clean bir Windows Server vermekte, fakat biz bunun üzerine bir ihtiyacımız olan kısmı ekleyerek imajımızı kurumumuza göre geliştirebiliriz. Şimdi sizinle bir Powershell Script dosyası oluşturup içerisine birkaç satır yazacağız. Bunun amacı tamamen image içerisine yapılması gerekenleri belirtmek. Örneğin bu image'ın adını WebServerIIS olarka vermiş idik ve anlamlı hale gelmesi için Windows Server içerisindeki IIS ve birkaç daha features ekleyecek script geliştirelim.

Features.ps1 isimli bir script geliştirdik. Şimdi bu Script içerisinde Windows firewall kapatmak için bir cmdlet yazdık ve bununla beraber Windows Server Feature aracılığı ile" Web-Server, Telnet-Client" vd role ve features kurulumunu yapması için gerekli Powershell Script yazdık. Peki şimdi bunu mevcut image template içerisine nasıl koyacağız. Bir önceki resim içerisinde bir Powershell satırlarını direk template içerisine yazmıştık. Şimdi ise bizim Powershell Scriptimizi ekleyeceğiz. Bunun için hemen template içerisine belirleyelim.

Yukarıdaki resim içerisinde görüleceği üzere, yeni bir satır ekleyerek Powershell ve mevcut scriptimizi tanımlamasını yaptık. Sizinle beraber yazmaya başladığımız bu Image dosyası ( JSON) oldukça karmaşık ve istediğimiz seviyelere geldi. Bir sonraki yazımızda packer aracının kullanım şeklini ve nasıl çalıştığına değiniyor olacağız.

· 4 min read
Hasan Gural

Packer, HashiCorp tarafından sunulan tek bir kaynak konfigürasyonı ile birden fazla farklı platformlar için Virtual Machine veya konteyner imajları oluşturmak için kullanılan bir araçtır. Bu yazı serisinde Azure özelinde custom image'lerin nasıl oluşturulacağını açıklayacağım ancak önce Packer nedir kendisi tanıyalım. Kısacası Packer, Microsoft Azure'da spesific image oluşturmak, tanımlamak için kullanılabilen açık kaynaklı bir araçtır. HashiCorp tarafından bizlere sunulan bu araç ile Ansible, Powershell DSC etc. İle birlikte kullandığınız zaman Infrastructure as code yönetimini başka bir boyuta taşıyor olacaksınız. MsHowto üzerinde bulabileceğiniz, Mustafa Kara tarafından yazılan Ansible yazı serisi okumanızı tavsiye ederim. Packer, birden fazla platformda çalışır, Bu yazı serisinde Microsoft Azure üzerinde custom image'ler oluşturmak ve saklamak için örnekler gerçekleştirip, Packer'in Azure Resource Manager (ARM) bütünleşip, Azure Managed Image ile harika ve sorunsuz bir uyum içinde çalıştığına şahit olacaksınız.

Öncelike yazı serimize başlamadan önce, sürecin nasıl ilerleyeceğini aşağıdaki adımlar ile özetleyelim. Bu örnek senaryo içerisinde Windows Server bir image oluşturup içerisinde Web Server hizmetini aktif hale getireceğiz. Neden ve niçin böyle bir senaryo yaptığımızı ilerleyen kısımlarda anlatacağım. Sırasıyla adımlara göz gezdirelim.

  1. ) Packer aracının yüklenecek. ( HashiCorp sayfasından elde edilebilir.)
  2. ) Azure Active Directory Hizmet üzerinde Service Principal Name oluşturulacak.
  3. ) Mevcut bir Azure Marketplace içerisinde bulunan OS imajı referans alınıp, özelleştirecek ve imaj için şablon kullanılacak. Bu şablon JSON formatında olacak.
  4. ) Imaj oluşturmak için JSON formatı belirtilen nitelikler sayesinde imaj oluşturun (İhtiyaç duyduğunuzda deploy edilebilir durumda sizi bekliyor olacak.)
  5. ) Packer ile ilk imaj oluşturma sonrası test amaçlı deploy üzerinden yeni bir VM deploy ederek sonucu görmek.

Packer Edinme ve detaylı dökümantasyon için HasciCorp sayfası bizlere çok güzel ve detaylı açıklamalar vermektedir. Packer edinmek için şu sayfa üzerinden ilgili 'Packer.exe' indirebilirsiniz. Download Link : https://www.packer.io/downloads.html

Packer aracını artık edindik ve bir sonraki adımımıza geçebiliriz, bunun için Azure Active Directory üzerinden Service Principal oluşturmamı gerekmektedir. Service Principal kısaca, Azure uygulamanız için bir identity tanımlamak veya oluşturmak ve doğal olarak subscription içerisinde yetki alarak işlemler yapmak olarak tanımlayabiliriz, Packer, bir imaj oluştururken Azure aboneliğinizdeki kaynakları oluşturmak ve silmek için bir takım izinlere ihtiyaç duyar. İşte bunların tamamı için, Azure Active Directory üzerinden Service Principal oluşturup Service Principal'a gereken hakları atayarak elde edilir. Bu genellikle tek seferlik bir şeydir, bu adımı bir kez yaparsınız ve yeni bir imaj oluşturmak istediğinizde Service Principal'ı yeniden kullanırsınız.

Bu işlemleri için süreci kolaylaştırmak adına sizinle bir script paylaşıyor olacağım. Bu sizin için koaly ve hızlı bir şekilde yeni bir Service Principal oluşturmanızı sağlayacak. Makale serisi boyunca, tüm yazdığım kod bloklarının hepsini Visual Studio Code üzerinden gerçekleştiyor olacağım. Bu yüzden Visual Studio Code üzerinde bulunan çalışma dosyamın hepsini son seride indirebilir olacaksınız.

Yukarıda çalıştırdığım "MsHowto-PackerPrep.ps1" adlı Powershell Scripti sayesinde Azure Active Directory üzerinden Service Principal oluşturma işlemini tamamladık, Ekranı ortadan ikiye böldüm, sol tarafta Powershell Script içerisindeki satırlar içerisinde yaptığımız adımları özetlemek gerekirse, Bir takım değerleri parametrik hale getirerek, Resource Group Name, Location, Image Name, Role Assignment ve Service Principal Password gibi değerleri istediğiniz gibi değiştirebilirsiniz. Script çalıştıktan sonra, Ekranından sağ tarafında en alta bulunan yeşil alan içerisinde, oluşan Service Principal Name için, tüm detayları görebilirisiniz, gizlilik açısından bazı alanları ben kapattım, siz çalıştırdığınıza size özel değerler üretecektir. Bu değerli daha sonra Packer ile oluşturmak istediğimiz image için geliştireceğimiz JSON içerisine yazıyor olacağız. Bu değerleri not alalım ve saklayalım. Ayrıca yukarıda yaptığımız tüm işlemleri isterseniz Azure CLI ile yapma şansına sahipsiniz, bu yüzden tamamen sizin tercihiniz.

Makalemizin adımlarına tekrar baktığımızda Packer ve Azure Active Directory üzerinde, Packer özelinde bir adet Service Principal oluşturma sürecini tamamladık. Visual Studio Code içerisinde görebildiğiniz üzere projemin içerisinde 'Packer.exe' görebilirsiniz.Şimdi ise proje dosyam içerisinde imaj dosyamı tanımlamak için bir adet JSON dosyası oluşturup bir takım tanımlamalar yapacağız ve bunları tek tek açıklamaya çalışacağım. Makale boyunca kullanacağım JSON dosyasının adı, "packerimage.json" olarak kullanmaya özen göstereceğim ve bunun yazım şeklinden tutun ne gibi özellikler göndererek kullandığımıza değineceğim.

Yukarıda görüldüğü üzere packerimage.json adında bir dosya oluşturdum ve içerisinde bir JSON formatında key-value şeklinde tanımlamalar yaptım fakat JSON formatından anlıyacağınız gibi, ikinci satırda görebileceğiniz üzere Variable nesnesinin alt kısmına bir takım key-value şeklinde tanımlamlar yaptım ve bu tanımların hepsi değişken olarak JSON dosyasının ilerleyen aşamalarında kullanılıyor olacak. Bu tanımlamalar içerisindeki tüm satırları nasıl dolduracağımızı bir sonraki yazımda bulabilirsiniz.