Skip to main content

43 posts tagged with "PowerShell"

View All Tags

· 5 min read
Hasan Gural

Many organizations seek to understand the cost impact when they want to use Azure Defender For Cloud (ADfC). I have been working on price estimates when I need to enable Azure Defender for Cloud services for specific resources in a tenant. However, I developed a PowerShell script that estimates the overall cost according to the ADfC resource coverage per subscription that does not include all estimation options.

Microsoft recently released a new Price Estimation Dashboard using the Azure Resource Graph and Resource metrics in order to provide a forecast for the candidate of ADfC Customers.

· 2 min read
Hasan Gural

Infrastructure as Code(IaC) is a crucial technique when you need to automate your environment end-to-end. If you're familiar with Terraform, you are probably familiar with the functionality of terraform plan. You might want to see the same capability before deploying Bicep or Azure Resource Manager templates. In order to have this functionality in your environment, you must have AZ CLI or Azure PowerShell. What-if is supported for the resource group, subscription, management group, and tenant-level deployments.

· 4 min read
Hasan Gural

If you haven't already used kind for deploying local Kubernetes, I strongly suggest you explore it and use it for testing the Kubernetes cluster itself. In this article, I am not going to dive into kind tool because this article is not intented to focus on this. If you are willing to learn kind tool, please search on the blog and get practice on it.

We will be primarily focusing how we can connect kind kubernetes cluster to Azure Arc. As you know, this demonstration is not for production usage but it will give you insights when you have connected kubernetes cluster to Azure Arc.

· 4 min read
Hasan Gural

In this article series, I will write about how we can migrate Azure Firewall Standard to Premium sku using PowerShell or Azure Resource Manageer Template. If you are using Azure Cloud, You are probably using Azure Firewall Standard in your Hub and Spoke topogolty to protect ingress and egress traffic for your services.

This article guides you with the required steps to manually migrate your Standard firewall and policy to Premium.

Before you start the migration, understand the migration tasks and plan ahead for the required maintenance window. Typical down time of 20-30 minutes is expected.

· 3 min read
Hasan Gural

You might be managing a very complex or non-complex environment in your organization. At some point, your organization would probably have Azure Resources such as Public IP Address(s), Network Security Group(s), Traffic Manager, Virtual Network Peerings, VPN Gateway(s), etc.

I have seen this challenge in many Azure Environments. The leading question is, what is the attack surface of my organization, that can be exploited by an attacker. Identifying this type of endpoint can be complex sometimes. For all kind of these questions, we will claim the help of the Network Security Dashboard from Microsoft Azure.

· 5 min read
Hasan Gural

The following article will explain how to register an existing physical or virtual machine running Windows to Azure Arc Control Plane using a fundamental PowerShell Script.

In order to start registering existing Windows Servers to Azure Arc, we need to install the Azure Connected Machine agent on each machine that you plan to connect using Azure Arc. Before starting this, we should ensure that we have the things below.

· 3 min read
Hasan Gural

In our last article, I tried to explain how we can get a report for Secure Score details and assignments of Defender for Cloud Plans for each subscription. I will now expand these type of queries mainly for Virtual Networks.

If you are managing multiple Azure Hub environments, at some point, you will need to report the status of Virtual Network Peerings as well as Peering Flags for the connectivity side of it. As we said before, there are various ways to obtain it. If you have over a hundred subscriptions, I wouldn't prefer to use PowerShell for these types of reports for generating them. In my personal opinion, Azure Resource Graph is a solid and decent way to get results as an object in PowerShell, and then you can use data for generating HTML, CSV, Table Storage or updating SQL Table.

· 2 min read
Hasan Gural

In our last article, we tried to understand Azure Resource Graph queries and use them for particular example scenarios. This part of our article series will cover Secure Score information on subscription levels. There are many different ways to accomplish this aim, but the easiest way to do this is by creating queries with Resource Graph.

Secure Secure information on Subscription level

You can find Secure Score details under the Later on, you can get the information that you wanted as a table with every property.

· 3 min read
Hasan Gural

In the first part of our article series, we tried to understand the Azure Resource Graph service. Now with executing sample queries, let's try to detail and implement them. For example, let's suppose that we have a scenario like this: an organization with up to 500~ Azure Subscriptions that one person manages. And this person has to list all of the storage accounts.

We mentioned plenty of different ways to complete the scenario above before. If you wish, you can access this information from Azure Portal or use the Get-AzStorageAccount cmdlet on PowerShell by visiting every subscription. Of course, there is an easier way, and it is using Azure Resource Graph Query. Let's try this to get information in a more accessible way.

· 3 min read
Hasan Gural

With this article, we will start an article series that will cover Azure Resource Graph and the particular features that make it different. You might never used or you might have never heard Azure Resource Graph before, but you will have a grasp of it with this article series. In this series, we will try to create and improve solutions that needed for real scenarios. Now without getting into detail, let's jump into our article.

What is Azure Resource Graph?

We can define Azure Resource Graph as an Azure service extension of Azure Resource Manager for absolute beginners. To answer what it provides and why we should use it, we need to look at the examples like the actions that we can execute in subscriptions in our organization by using Azure Resource Graph. These examples are:

· 4 min read
Hasan Gural

In the last article of our series, we will try to access the endpoint of Pipelines, and we will list pipelines expressions of all projects.

First of all, we need to look at the list of endpoint types down below.

Operation types for Pipelines

Operation NameOperation Detail
CreateCreate a pipeline.
GetGets a pipeline, optionally at the specified version
ListGet a list of pipelines

· 4 min read
Hasan Gural

In our previous article, we did some pre-coding to access Azure DevOps REST API. We got all the projects of a DevOps Organization as a list by executing an elementary request. Now, we should enlarge our knowledge with further examples.

Let's do an example where we try to access all the repositories as a list in an Azure DevOps Project. This is how the repository list looks from the interface of the AzDo.

· 4 min read
Hasan Gural

In this article series, we will focus on how and why Azure DevOps API can be usable with Powershell with emphasizing critical details in the latter parts. Before heading to the article, it is vital to notice that this article series requires a solid understanding of REST API. With the REST API's page down below, you can access all the endpoints and create requests with necessary methods such as GET, POST, PATCH

AzDo Rest API Documentation

· One min read
Hasan Gural

Azure Custom Resource Provider kullanım örneklerini blog üzerinde uzun bir seri ile paylaşmıştık. Fakat GitHub üzerinde belirttiğim repository üzerinden devamlı bir şekilde güncel tutmaya özen göstereceğim. Eğer talep ederseniz sizde Pull Request gönderip kendi Custom Resource Provider'larınızı paylaşırsanız örnekleri tek noktada toplayabileceğimiz bir yere sahip oluruz. Daha fazlası için aşağıdaki GitHub Repository incelemenizi tavsiye ederim.

· 6 min read
Hasan Gural

Bir önceki yazımızda Visual Studio Code üzerinde ilk fonksiyonumuzu oluşturduk. Hatırlarsanız fonksiyonumuzun adı getResourceStatus olarak belirlemiştik. Fonksiyon bize Azure sanal sunucuların hakkında anlık raporlar (html output olarak) üretmesini sağlamak temel hedefi idi. Bu fonksiyon RESTful isteklerin kabul ediyor olacak ve istediğimiz zaman abonelik içerisinde bulunan sanal sunucuların yapılandırma bilgilerini anlık ve her yerden bir web request ile raporlayabileceğiz.

Fonksiyonumuzu deploy etmeden önce bildiğiniz gibi Azure Subscription içerisine Azure Function App deploy etmemiz gerekiyor. Bunu dilerseniz Azure Portal, ARM Template, VSCode, Powershell yapabilirsiniz. Bu yazı içerisinde size aşağıdaki Powershell Script'ini takip ederek Azure Function App oluşturmanızı yardımcı olacak olan kod bloğunu paylaşıyorum.

· 6 min read
Hasan Gural

Artık ilk Event-Based Automation çözümümüzü beraber geliştirebiliriz, senaryomuzu basit ve anlaşılır yapmak için hemen beraber belirleyelim. Başlangıç seviyesi için kesinlikle basit bir senaryodan ilerleyeceğiz. Örneğin, Azure Function 'HTTP' trigger (tetikleyicisini) kullanarak parametrik olarak gönderilen sanal sunucunun adına göre Azure Function bizim için HTML bir Report oluşturmasını isteyelim. Giriş yazımızı hatırlarsanız, o kısımda 'HTTP' kullanırsak bize bir RESTful HTTP uç noktaları sunar API gibi davranacağından bahsetmiştik. Şimdi ön gereksinimlerimiz neler bunlara bir göz gezdirelim.

· 5 min read
Hasan Gural

Fonksiyonlarımız için ne tür Triggers ( tetikleyiciler) kullanabileceğimizden bahsettik ve örneklerini anlattık. Şimdi hız kesmeden Bindings (tam türkçeye çeviremiyorum. Bağlar/Bağlantılar) kavramına açmak istiyorum. Bindings size fonksiyonunuz içerisinden verilere bağlanmanız için bir yol veya yöntem için yardımcı olurlar. Bir önceki yazımızda bildiğimiz gibi Triggers ( tetikleyicilerin ) bize geliştirdiğimiz fonksiyonun hangi servisler tarafından tetiklenebileceğini söyleyebiliyorduk. Örneğin, Azure Queue Servisi ile fonksiyonunuz tetiklenmesini ( yani çalışmasını/aksiyon almasını ) sağlayabiliyoruz. Fakat bu tetiklemeden sonra Storage Queue servisinden gelen veri bizim için fonksiyonun içerisindeki parametreye atanıyor. Bindings kullanmak zorunda değiliz fakat kullanma senaryomuzu biraz daha açmak ister isek, Storage Queue'den bir mesaj geldiği zaman tetiklenecek olan Azure Fonksiyonumla beraber Storage Table tuttuğum transcation verileriminde bindings kullanarak bir parametreye atanması sağlayıp, daha sonra bu verileri karşılaştırabilir ve fonskiyonumun onun sonuca göre çalışmasını sağlayabilirim. Bindings tamamen isteğe bağlıdır. Bu yüzden karşımıza farklı Bindings türleri çıkıyor olacak. Bir önceki yazımızda herhangi bir kod yazmadan tetikleyen servise erişmemizi sağlayacağından bahsetmiştik. Bindings sayesinde yine farklı servislere kod yazmadan erişip bir parametreye atayıp veriler elde edebilir ve onları değerlendirebiliriz.

· 5 min read
Hasan Gural

Öncelikle bu yazı serisine başlamadan şunu göz önünde bulundurmanızı tavsiye ediyorum, yazı içerisinde geçen Azure servislerin detaylı bir biçimde neler yaptığını anlatmayı düşünmüyorum. Bunları anlamak ve kavramak için internet üzerinde örn:'Microsoft Docs' sınırsız kaynaklara erişme şansınız var. Genel anlamıyla servislerin nerede, ne zaman ve niçin kullanılması gerektiğine değinip servisleri sırası geldikçe ve kullanıma başladıkça sizinle paylaşıyor olacağım. Bu servisleri kullanırken temel veya yüzeysel bir açıklama görebilirsiniz. Fakat bu yazı serisinin temel amacı Serverless hizmetlerini kullarank ve bunlar ile beraber Cloud veya Hybrid otomasyonunun nerelere doğru yelkenler açtığını, son olarakta Powershell Core'un tüm Azure Serverless hizmetlerinde ne/nasıl bir şekilde aktif şekilde röl aldığını anlamanıza yardımcı olmaya çalışacağım.

· 5 min read
Hasan Gural

Bu bölüm içerisinde, Secure DevOps Kit for Azure – Bölüm 2 isimli makalemizi okuyup, temel abonelik seviyesinde Azure Kaynaklarının güvenliğini tarama komutlarını kullandığınızı düşünerek biraz daha ileriye götürecek senaryolar üzerinde durmaya çalışacağım. Temel tarama komutlarını kullandık ve kavramaya çalıştık artık bundan sonra neler yapabileceğimize odaklanacağız. Bildiğiniz gibi , 'Get-AZSKSubscriptionSecurityStatus' kullanılarak manuel bir tarama başlattığımızda, (otomatik olarak) açılan klasör içerisinde CSV dosyasının detaylarına baktığımız zaman AzSK ile yaptığımız taramada değerlendirilen tüm kaynaklar için elde edilmiş bir rapor ve log dosyası sağladığını unutmayalım. Elde ettiğimiz bu dosyaların tümünün detayına ve ne işe yaradıklarını bir önceki yazımızdan ulaşabilirsiniz.

AzSK ile yaptığımız güvenlik kontrollerinde, kontrol hatasını düzeltmek için gereken düzeltme(leri) otomatikleştirilebiliriz. AzSK bu senaryoyu 'FixControls' özelliği ile desteklemektedir. Bu özelliğin mevcut yapılan kontroller için AzSK tarafından kullanıcıların talebi ile bu düzeltmeleri uygulayabilmesi için otomatik bir şekilde oluşturabileceği Powershell Script'i yeteneğine sahiptir. Tahmin edebileceğiniz gibi pek çok yapılan kontrol için eğer sorun bulunduysa ve düzeltilmek isteniyorsa, bunların otomasyonu her zaman uygun değildir, çünkü yapılan kontrollerin düzeltilmesiyle ilgili iş akışı veya çalışan servislerin bağımlılıkları karmaşık olabilir. Sonuç olarak, bu özellik tüm kontroller için mevcut olmayabilir veya geçerli olmayabilir. Bu özelliği 'Get-AZSKSubscriptionSecurityStatus' komutuna '-GenerateFixScript' parametresini eklediğimiz zaman bizim için abonelik içerisinde bulunan tüm kaynakları güvenlik kontrollerinden geçirir ve herhangi bir uyumsuzluk bulur ise bunlar için Powershell Script oluşturur ve bunu çalıştırmamız, bulunan sorunları düzeltmemiz için yeterlidir.

Yukarıdaki resim içerisindeki gibi kullandığımız zaman bizim için tüm kontrolleri yapıp otomatik bir Script oluşturacağından bahsetmiştik. Eğer bu komutu çalıştırırsanız sizin için otomatik olarak ilgili output dosyasını açacak ve Powershell Script'e erişebileceksiniz. Daha önceki yazılarımızdan hatırlayacağınız gibi, bir output klasörü oluşuyordu ve onun altında Securtiy Report adında bir CSV ve Log dosyalarının oluşturduğunu görüyorduk. Farklı bir klasör daha farkedeceksiniz. 'FixControlScripts' parametresini ekledikten sonra yeni bir klasör olacak ve bunun adını 'FixControlScripts' olarak görebilirsiniz. Bunun altında sizin için yaratılan Powershell Script bulunuyor ve bunu çalıştırarak bir AzSK yapmış olduğu denetimlerde eksiklik var ise Script sayesinde düzetlebileceklerinin detaylarını bulabilirsiniz.

'FixControlScripts' adında bir klasörümüz oluştu ve onun altında 'FixControlConfig.json' adında bir dosyamız var. Bu Json dosyasının içerisinde yapılan kontrollerin sonucu, eksikliklerin nasıl tamamlanması gerektiğini, ne tür parametreler alması gerektiğini görebilirsiniz.Bunun dışında 'RunFixScipt.ps1' adında bir adet Powershell Script dosyasıda bulunmakta, isteğinize bağlı olarak direk çalıştırabilir ve sizden talep edilen değerleri parametrik olarak isteyebilir veya FixControlConfig dosyası içerisine sizin doldurarak Script içerisinden otomatik bir şekilde işlenir ve işlemlere başlayabilir.Şimdi beraber JSON dosyası içerisine göz gezdirelim.

Resim içerisinde görmüş olduğunuz 'RunFixScript.ps1' isimli Powershell Script'inin içerisini incelediğiniz zaman parametre olarak 'ParameterFilePath' kesinlikle belirtilmesi gerektiğini fark edeceksiniz ve otomatik olarak bu dosyayı aradığını ve parametrik olarak aldığını göreceksiniz. 'RunFixScript.ps1' isimli Script'in detaylarına bakıyor olacağız ama öncesinde Config File detaylarını anlayalım. Yeşil ile çizdiğim alanlar aslında yapılan kontrolün ne amaçla yapıldıgını açıklamakta ve Description kısmında daha fazla detaylarını bulabilirsiniz. Ama bu Config file oluşmasının sebebi bulunan güvenlik kontrol kriterlerinin JSON içerisine yazılması ve parameters bloğu içerisindeki değerlerin, 'RunFixScript.ps1' dosyası çalıştırıldığı zaman girilen değerleri alarak iş yapmasını sağlamak.

"RunFixScript.ps1" isimli Powershell script'i içerisinde aslında kullanılan komutun "Repair-AzSubscriptionSecurity" olduğunu farkedebilirsiniz. Bu komut aslında bizim "FixControlConfig.Json" dosyasını alarak düzeltme çalışmalarına başlayacak. Talep ederseniz direk bu Powershell Function çağırıp FixControlConfig dosyasını gönderebilirsiniz."RunFixScript.ps1" script'ini çalıştırdığımız zaman yukarıdaki resim içerisinde farkedebileceğiniz gibi yeşil alan kısmında yeni bir "FixControlConfig.timestamp" şeklinde yeni config oluşturdu. Bunun sebebi ise bu Powershell Script'i çağırdığım zaman o config dosyasını alıp parametrik olarak bana bir takım tamamlamam gereken verileri sordu bunlar ( SecurityContactEmails,SecurityPhoneNumber,Tags) şeklinde değerler. Bunların neden gerektiğini CSV dosyası içerisine bakarak anlayabilirsiniz. Script çalışmaya devam ederken bizim için bu değerleri baz alarak abonelik içerisinde otomatik bir şekilde tamamlayabileceği eksik güvenlik kontrollerini tamamlayacak. Script çalışmayı tamamladığı zaman aşağıdaki gibi bir sonuç görmeniz mümkün.

Script çalışmayı tamamladı ve bizim için parametrik olarak talep edilen değerler için güvenlik kontrollerinin eksiklerini tamamladı. Yukarıda görebildiğiniz gibi, "RunFixScript.ps1" isimli script içerisinde "Repair-AzSubscriptionSecurity" fonksiyonu ile Secure DevOps Kit for Azure bizlere, Azure Policy ve Azure Alerts tanımlamalarını yaptı. Azure hesabınız üzerinden bunların tüm detaylarına erişebilirsiniz. Örneğin; AzSK oluşturacağı Alert'in için bize abonelik içerisinde belirli resource tiplerinde herhangi bir aksiyon alındığı zaman bizleri bilgilendiriyor olacak.Bu işlemi yapılmak için, 'AZSKRG' adında bir resource group oluşturup içerisine 'Activitylogalerts' ve 'ActionGroup' için tüm detayları barındıran tanımlamaları sizin için yapıyor olacak. Peki bu Alert'ların ne tür, hangi tip kaynaklar özelinde çalıştığına bakalım.

Bahsettiğimiz ActivityAlerts ve ActionGroups detayları 'AZSKRG' resource group içerisinde bulabilirsiniz.Resource Group'un "Tags" kısmına dikkat ederseniz, en son ne zaman AzSK tarafından oluşturulduğunu, hangi AzSK versiyonun kullanıldığını ve "Alert" versiyonunu görebilirsiniz. Ayrıca isterseniz, 'Azure Monitor' > 'Alerts' basarak neler olduğunu anlama şansınız var. Gördüğünüz üzere Networking, Database, Storage, Web, Analytics gibi farklı resource tiplerine ait activity uyarıları/alarmları yaratılmış. Bunların detayları incelemek için, script çalışmayı tamamladıktan sonraki log dosyasında ( Details.LOG) bakarakta anlama bulabilirsiniz. Aşağıdaki örnekte "AZSK_Networking_Alert' detaylarını ve hangi resource tipleri için alert tanımlamaları yapıldığını görebilirsiniz.

Özetle bu makale içerisinde, Secure Azure DevOps for Kit kullanarak abonelik üzerinde AzSK tarafından bulunan/tamamlanması önerilen güvenlik kontrollerinin nasıl otomatik bir şekilde yapılabileceğini öğrendik. Daha öncede bahsettiğimiz gibi AzSK tarafından otomatik bir şekilde çözülebilen denetim veya güvenlik kontrollerinin, '-GenerateScript' parametresi ile nasıl yapacağımızı anlamış olduk. Diğer serilerimizde Secure DevOps Kit for Azure serisinin Subscription seviyesindeki denetim/kontrol kullanım örneklerine devam edeceğiz.

· 7 min read
Hasan Gural

Secure DevOps Kit for Azure araçının kullanıma artık yavaştan girelim. Öncelikle AzSK için Powershell Module nasıl sahip olacağımıza ve ne tür ön gereksinimler olduğuna beraber inceleyelim. Core MS Engineering tarafından bize aktarılan en az aşağıdaki işletim sürümüne ve powershell versiyonuna sahip olmanız gerekiyor.

  • PowerShell 5.0 veya üstü.
  • Windows OS

Not: Bildiğiniz gibi Powershell Core sayesinde cross platform üzerinde Powershell'e sahip olma imkanı bizlere sunuluyor. Bu sayede Windows veya Linux, macOs farketmeksizin Powershell'i kullanabilirsiniz ama bir takım özelliklerinden yararlanma şansınız olmayabilir. Bu yüzden dökümantasyon tarafında henüz resmi bir detay göremedim özellikle Core veya Desktop sürümü olarak yaptığım bir çok testler de Windows üzerinde Powershell Core tarafında pek sorun yaşamadım. Ancak bu yüzden kendi edindiğim tecrübelerim ile paylaşabilirim ki AzSK Powershell Modülünü sorunsuz kullandığımı söyleyebilirim. Bu detay belki önem arz edebilir. Mümkün oldukça Powershell Core kullanarak hayatımı sürdürüyorum. Hızlıca bu Powershell modülüne nasıl sahip olabiliriz beraber görelim.

Bildiğiniz gibi Powershell üzerinden herhangi bir Modülü dahil etmek istersek bize yardımcı olan cmdlet "Install-Module" olarak karşımıza çıkıyor. Fakat bu komutu yazmadan önce bir konuyu sizinle paylaşmak istiyorum. AzSK Powershell modülü aslında arka tarafta Azure Powershell modülüne ihtiyaç duymaktadır. Bunun temel sebebi ise, AzSK Powershell modülüne sahip olduğunuz ve onun detaylarını incelediğiniz zaman bir çok geliştirilmiş 'advanced-powershell-function'larının olması ve bunların arkasında devamlı Azure Powershell Module ile birlikte gelen cmdlet'ler sayesinde ilgili kaynakların özelliklerini talep ederek iş yapabilmesidir. Örneğin, Azure Subscription seviyesindeki detaylara Secure DevOps Kit for Azure (AzSK) Powershell modüllü erişmek ister ise, Azure Powershell Modülüne ihtiyaç duyacak ve tüm yapılandırma detaylarını bu modül içerisinde bulunan komutlar sayesinde edinecektir. Yukarıda gördüğünüz "Find-Module -Name AzSK -IncludeDependencies -Repository PSGallery" aslında bize AzSK Powershell modülünün ne tür bağımlılıkları olduğunu anlatmaktadır.

Artık AzSK Powershell modülünü Powershell Gallery üzerinden talep edebiliriz. Yukarıda gördüğünüz satır içerisinde (9) kullandığım Powershell komut satırı, benim için AzSK'yı sahip olduğum bilgisayar üzerine indirecek ve bunu sadece sahip olduğum oturum içerisinde kalacak şekilde belirtmiş bulunmaktayım. Scope olarak 'CurrentUser' parametresi bana bu konuda yardımcı oluyor. Repository parametresi ise belirtmek zorunda değilsiniz, çok farklı Repository'ler kullandığım için özellike belirttim eğer tanımlamazsanız PSGallery yani Microsoft'un Windows üzerinde default tanımlamış olduğu Powershell Gallery üzerinden modüle sahip olmaya başlayacaksınız. En sonda kullandığım '-Verbose' parametresi ise 'Install-Module' komutu çalışırken bana arka tarafta yapılanlar hakkında detaylı bilgiler almamı sağlıyor.

Gördüğünüz gibi artık AzSK Powershell Modülüne sahibiz. Modüle içerisinde toplam şimdilik 55 adet cmdlet mevcut ama bir çoğunu bu yazı serisinde tanımaya çalışacağız. Şimdi en temelleri olan Subscription seviyesi bazında Security taramaları gerçekleştireceğiz ve bunun için şimdilik sadece abonelik ile ilgili olanlar ile ilgileneceğim.

İlk bölümde bahsettiğimiz ve konumuzun en temel önem arz eden başlığımız olan 'Subscription Security' yani Azure Aboneliğinin güvenliğinin detaylarına göz gözdirelim. Abonelik içerisinde tarama işlemi başlatmak için, 'Get-AZSKSubscriptionSecurityStatus' function kullanarak bir takım çıktılar/sonuçlar elde edebiliriz. Kullanmaya başladığımız zaman göreceksiniz ki bir çok detayın bu Powershell fonksiyonu tarafından irdelendiğini şahit olacaksınız. Herhangi aboneliği incelemek için bir dizi otomatik tarama gerçekleştirir ve çeşitli güvenlik sorunları, yanlış yapılandırmalar veya eski eserler / ayarlar nedeniyle aboneliğinizin daha yüksek bir risk altında olabileceğinin göstergesi olan koşulları/bulguları sizlere işaretler. Bu fonskiyon aşağıdaki kısımlara tek tek bakarak size bir sonuç oluşturmaya çalışıyor.

Access Control ( IAM ) Erişim kontrolü yapılandırması – abonelik seviyesinde kimlik ve erişim yönetimi ile ilgili sorunlar. ( Abonelik üzerinde bulunan admins/owners, custom-rbac roles, MFA, PIM, SPNs)

Alert Configuration – Azure Aboneliği ve çeşitli azure kaynakları için hassas eylemler için etkinlik uyarılarının yapılandırılması. (Securtiy Center )

Azure Security Center - Azure Güvenlik Merkezi yapılandırması detayları – (Point of contact, VMs Updates, Malware, Extension vb.)

Azure Policy ve Resource Lock- konfigürasyonu – Belirli bir düzeyde tanımlanan Azure Policyler ( Region, VM Size, belirli resource tiplerinin yasaklanması), Resource Lock ve diğer tüm Policy ile yapılabilecek diğer aksiyonlar.Bunun dışında şahsi olarak kullandığım ve sizinde güvenli bir abonelik için Azure Policy ile birlikte çalışan Guest Configuration bakmanızı önerebilirim.

Note: Daha fazla detay için lütfen paylaştığım sayfa üzerinden neden önemli oldukları ve ne seviyede önem gerektirdiklerini anlayabilirsiniz. Lütfen şu sayfaya göz gezdirin.

Yukarıdaki resim üzerinde görüldüğü üzere ilk health check işlemini 'Get-AZSKSubscriptionSecurityStatus' function ile başlattım. Bu komutu çalıştırmadan önce doğal olarak Az Powershell üzerinde tarama başlatalabilmek için ilgili aboneliklere yetkili hesap ile oturum açmanız gerekmektedir. SubscriptionId değerini bu function içerisine gönderdip çalıştırdıktan sonra yukarıda özetle bahsettiğimiz kontrolleri tek tek yapıyor ve sizin için bir sonuç belirlemeye çalışıyor olacak.

İlgili Powershell fonksiyonu bizim için başarılı bir şekilde çalıştı. Yapılan kontroller sonucu ne tür testlerden geçemediğimizin detaylarını Powershell bize Console üzerine yazmış bulunmakta bununla kalmayıp bunları "High", "Critical","Medium" olarak ayırdı. Bunların tüm detayları yukarıda belirttiğim sayfa üzerinde var. İlgili sayfa içerisinde neden seviyelerinin "High",Medium",Critical" olarak ayrıldığını anlayabilirsiniz. Health Check işlemini başlatmak istediğim aboneliğim MSDN olarak belirlemiştim. Üzerinde sadece yaptığım testler olan birazda dağınık bir hesap, yukarıdaki tablo içerisinde bazı adımlardan 'Failed' aldığımı görüyorum. Bunların bazıları "High" ve "Medium" olarak iki kısıma ayrılmış durumda. Yukarıdaki resim içerisinde ayrıca belirttim fakat Powershell fonksiyonu çalışmayı bitirdiği zaman size bir "Windows Explorer" otomatik olarak açıyor olacak ve karşınıza bir takım log dosyaları ve çalıştırdığımız tarama sonucunun daha fazla detaylarını 'CSV' dosyası içerisinde bulabileceksiniz.

Bizim için otomatik bir şekilde output çıktısı oluşturdu, bu dosyalardan en önemlisi CSV detayları ve buna baktığımız zaman hangi tür testlerden başarılı/başarısız olduğumuzu görebileceğiz. Bunun dışında 'Etc' ve 'Visual Studio Enterprise – MCT' folderında Azure aboneliği için tutulan bir takım bilgiler ve Powershell Function çalıştığı süre boyunca Powershell transcript özellğinden faydalanarak console yazılan herşeyin bir çıktısınıda görebiliyorsunuz. İşin özeti bizim için en önemli dosya şimdilik Security Report adındaki dosya olduğunu söyleyebilirim. Şimdi biraz da bu dosya içeriğini inceleyelim.

CSV Dosyasını açtım ve artık içerisindeki değerleri görebiliyoruz. Bizim için nelerin kontrol edildiğini beraber daha rahat anlayabiliriz. Çalıştırdığımız Powershell Function yaptığı tüm testlerin detayları bu kısımda bulunmakta ve CSV dosyasının en sağ tarafında 'Recommendation' kısmına giderek neler yapmanız gerektiğini bulabilirsiniz. Ekran görüntüsü olarak paylaşmadım ama abonelik içerisinde hangi Resource'dan dolayı başarısız sonuçları anlamanız içinde 'CSV' üzerinde 'ResourceId' kısmına bakarak kaynağınızı direk tanıyabilme ve bulma şansınız vardır. Daha fazla detay öğrenmek için lütfen "Visual Studio Enterprise – MCT"(Sizin aboneliğinizin ismi yazacaktır) klasörü içerisinde bulunan 'Subscription.LOG' isimli dosyayı özellikle incelemeyi unutmayın.

Daha farklı bir kullanama yöntemi olan ve parametrik olarak değerler alabilen bu komut, istersek bizlere 'PDF' olarak yukarıda gördüğünüz raporları sunabiliyor. Aslında fikir ve kullanım açısından çok hoş, eğer biden çok farklı aboneliğiniz var ise hepsi için tek tek 'PDF' çıktıları alıp ilgili iş birimlerini bilgilendirebilirsiniz. Gelin beraber kullanım şeklini inceleyelim.

Yukarıda görebildiğiniz gibi yaptığım sadece 'GeneratePDF' parametresini otomatik oluşacak rapor için yatay mı dikey mi olmasına karar vermem oldu. Talep ederseniz ilk kullandığımız komut ( CSV ) sonuna '-DoNotOpenOutputFolder' parametresini eklersek, bizim için herhangi bir 'Windows Explorer' açmayacaktır.

Elde ettiğimiz raporların detaylarına baktığımız zaman bir çok güvenlik kriterleri ele alınmış durumda. Fakat ilgili Powershell komutu içerisine parametrik değerler göndererek almak istediğimiz arama standlarına göre (bunların belirli bir anahtar kelime listesi var örneğin; RBAX, SOX, AuthN) bu değerleri gönderdiğimiz zaman o spesifik bölümler için tarama/health check başlatabiliyorum. Gönderebileceğimiz parametreler ve anlamları aşağıdaki gibidir.

İlk başta bahsetmek istediğim iki adet parametre var. Bunların detaylarını yukarıdaki açıkladım. Paylaştığım bilgi doğrultusunda, bu parametrelerin alabileceği çok fazla değer var ve aşağıda bulunan liste içerisinde parametreleri kullanmaya karar verdiğinizde bu güvenlik etiketlerini kullanarak 'Get-AZSKSubscriptionSecurityStatus' parametre gönderip sadece belirlediğiniz güvenlik denetimine göre sonuç alabilirsiniz.

'FilterTags' ve 'ExcludeTags' alabilecek parametrik değerler yukarıdaki gibi olmalıdır. Şimdi beraber bir örnek yapalım ve gelin nasıl kullanabildiğimizi beraber görelim.

Yukarıda yapmış olduğumuz iki adet farklı örnek bulunuyor. Bu örneklerde görebileceğiniz gibi iki adet farklı tag isimleri göndererek sadece belirlediğimiz güvenlik kriterlerine göre aramalar yaptık. 'SOX' – uyum ve denetimi için 'Get-AZSKSubscriptionSecurityStatus' çalışacak ve ona uygun bir şekilde kontroller yapacaktır.

Diğer farklı bir kullanım yöntemi olan ve parametrik olarak gönderebileceğimiz bölüm ise 'ControlIds' parametresi bize Secure DevOps Kit for Azure için yapılan Control kriterleri bazında filtereleme şansı verecektir. Kullanım şekline beraber bakalım;

Yapmış olduğumuz örnek içerisinde görebileceğiniz üzere, 'ControlIds' parametresi 'Azure_Subscription_AuthZ_Limit_Admin_Owner_Count' eşit olan güvenlik kontrollerine göre rapor oluşturmasını talep ettim ve sadece onun özelinde bana tarama sonucu olan 'CSV' dosyasını yaratıyor olacak.Bu yaptığım aramanın sonucu yine Powershell Console üzerinde görebiliyorum ve ayrıca talep istersem, CSV ve PDF olarak çıktı alma şansım var.

Bu yazımız içerisinde AzSK Powershell modülünün sadece bir komutu olan 'Get-AZSKSubscriptionSecurityStatus' kullanarak nasıl health check raporları almamız üzerine konuştuk. Bir sonraki yazımızda bu Powershell fonksiyonun nasıl kullanıldığına ve ne tür farklı yetenekleri olduğunu anlatmaya devam edeceğiz.

· 6 min read
Hasan Gural

Öncelikle bu yazı serisi içerisinde DevOps ve SecOps kavramlarının ne olduklarının detaylarını girmek istemiyorum, bunların ne tür çalışma prensiplerine sahip olduklarının MsHowto üzerinden veya Internet üzerinden kolayca bulabilirsiniz. Secure DevOps Kit for Azure hakkında bilmemiz en önemli durum, bu araç/tool artık nasıl isimlendirmek isterseniz Microsoft'un geliştirmiş olduğu resmi bir ürünü değil, MS Core Services Engineering & Operations (CSEO) tarafından uygulanan en iyi pratikleri, yapılandırmaları ve güvenlik politikalarını topluluklar ile paylaşma girişimidir. Secure DevOps Kit for Azure (AzSK), Microsoft BT'nin Azure'u benimsemesini hızlandırmaya yardımcı olmak için Microsoft'taki MS Core Services Engineering & Operations (CSEO) bölümü tarafından geliştirildi ve bizlere kullanıma sunuldu. Az Secure DevOps Kit, Yönetim ve Güvenlik üzerindeki kontrolleri sıkı sıkıya korurken, DevOps kültürünün farklı aşamalarında bulut kaynaklarını hızlı bir şekilde taramak, güvenli bir şekilde dağıtmak ve yönetmek için rehberlik sağlamak üzere AzSK ve onun belgelerine herkesin kolaylıkla erişebileceği bir araç veya yol gösterici olarak kullanılmaktadır.

Azure için Secure DevOps Kit'i (bundan böyle 'AzSK' olarak kısaltacağım), DevOps ekipleri için Azure Subscriptions ( Azure Abonelikleri ) ve Resource ( Azure Kaynakları – herhangi bir dağıttığınız kaynak, Storage Account, WebApp, VMs, Key Vaults vb. olabilir) güvenlik gereksinimi gereken her noktayı destekleyen Powershell scriptler, araçlar, eklentiler, yol gösteren dökümanlar ve otomasyon gibi yöntemler sunar. Daha kapsamlı otomasyon kullanmak ve güvenliği alışıla gelmiş/gelmeye çalışan kültürümüze yani DevOps içerisine iş akışlarına sorunsuzca entegre edebiliriz. MS Core Services Engineering & Operations (CSEO) tarafından önemli başlıklar altında derğelendirme açısından ayrılan Secure DevOps Kit for Azure, 6 adet farklı odak noktasıyla nasıl güvenli bir Azure ortamını elde etmemiz gerektiği konusunda yardımcı olmak için tasarlanmıştır. Sırayla bu başlıkları beraber inceleyelim.

Azure Subscription: Güvenli bir Azure Subscription(aboneliği) elde etmek için aslında temel olarak dikkat etmemiz gereken bir takım bileşenler var. Bunların en başında çok iyi ve düzenli bir biçimde tasarlanmış Access Control yani Role-Based Access Control ( Management Group ) gibi konular gelmektedir. Daha sonra yine sizin Subscription ( Azure Aboneliği ) seviyesinde olan Azure Policy mekanizmasının yine çok iyi bir şekilde yapılandırmanız gerekmektedir. Aralarında önemli ilişki olan konular özellikle Subscription, Management Group, Role-Based Access Control ve bunlarla yakından ilişkisi olan tasarım açısından Azure Policy unutmamak gerekir. Bununla beraber Azure AD'nin içerisinde Privilige Identity Management ( Azure Active Directory Premium gereksinimi doğmaktadır.) ise size daha farklı güvenlik katmanı katabiliyor. Abonelik seviyesinde işlem görmeyen Azure Security Center bizlere Free olarak sunuluyor fakat bu hizmet Tenant seviyesinde olduğu için ve güvenlik tarafından sorumlu olduğumuz en önemli hizmet olduğu için Security Center ile ilgili detaylı Policy'ler yazmamız neredeyse şart. Bunun içinde Microsoft sizi Azure Security Center – Standard seviyesine ( Ücretli ödeyerek elde ettiğiniz ) yönlendirmektedir. Tenant seviyesinden yapacaklarımıza ve Abonelike seviyesinde dikkat etmemiz gereken konuları konuştuk aslında diğer bir konu ise, kaynak seviyesindeki güvenlik detayları işte tam bu noktada sizi Azure Resource Lock yapılandırması göstermektedir. Bunun dışında olmazsa olmaz olan Azure Alerts çok faydalı olduğunu unutmamak gerekiyor. Tüm bu yapılandırmaların sonucunda Azure Subscription seviyesinde güvenlik temeline uyum sağlamış olacağız (Secure DevOps Kit for Azure bize sunduğu denetim detaylarına göre, bunların hepsi aslında, bir çok uyum denetimi standardları takip edilerek geliştirilmiş.) .Aynı zamanda yapılan tüm ayarların güvenli bir temele uygun olup olmadığını kontrol etmek mümkün olmalıdır. Özetle, bir çok Security BaseLine takip edilmelidir. ( Five Disciplines of Cloud Governance, CIS Microsoft Azure Foundations Benchmark)

Enable secure development: Herhangi bir uygulama/hizmetinizi develop ederken, varsayalım ki daha kuluçka döneminde veya orta seviye aşamalarında iken, Secure DevOps Kit for Azure bizlere developer ekibinin Cloud-Based bir hizmetin/ürün özelinde nasıl güvenli kod yazmalarının gerektiğini ve bulut uygulamalarının güvenliğinin nasıl sağlanacağını minimum seviyede bilmesi, yapılandırmasını test etme becerisine sahip olmaları gerektiğini bahsediliyor. MS Core Services Engineering & Operations (CSEO) ekibi bu kısımda bizler için Azure'da çeşitli kaynak türlerinin güvenliğini kontrol edebilen bir kavramı hayatımıza sokuyor ve buna Security Verification Tests (SVTs) adını veriyor. Bu yöntemi Microsoft tıpkı bir Software Development sürecindeki Build Verification Tests ( BvT) benzetiyor aslında, Build Verification Tests ( BvT) en yalın haliyle daha ayrıntılı ve titiz test prosedürleri ile yüzleşmeyi ve bu yüzleşmeye hazır olup olmadığını değerlendirmek ve doğrulamak için her yeni yazılım sürümünde yapılan bir testler dizisidir. Ayrıca bu kısımda kesinlikle developer'lar için 'Security IntelliSense- VS Extension' eklentisinin kullanmasını öneriyor.

Integrate security into CICD: Benimde inandığım ve MS Core Services Engineering & Operations (CSEO) ekibi tarafından da bahsedilen en önemli nokta, Test Automation Mühendisi, DevOps kültürünün temel yapı taşlarından olduğunu düşünüyorum. Secure DevOps Kit for Azure bizlere Azure DevOps'un bir parçası olmasını olanak sağlıyor ve bu sayede Azure DevOps içerisinde bahsettikleri Security Verification Test özelliği ile tüm test süreçleri için bir task oluşturup yazılan artefact'leri kolaylıkla test süreçinden geçirebiliyoruz. Bu tanımlanan Security Verification Test'leri, herhangi bir veya geliştirmiş olduğunuz bulut uygulamasını dağıtmak için kullanılan hedef aboneliğin veya uygulamanın dayandığı Azure kaynaklarının güvenli bir şekilde kurulmasını sağlamak için kullanılabilir durumdadır. DevOps özelinden bir örnek verelim, uygulamamı Azure üzerine dağıtmak için Azure Resource Manager Template'leri (Infrastucture as Code olarak) bunun testini yapabilme imkanım var.Bununla beraber kendi Unit Test'lerinizi Pester ile geliştirebilirsiniz harika olur. Geliştirmiş olduğum Resource Manager Template içerisinde yaptığım güvelik hatalarını veya olabilecek güvenlik sorunlarını görebilirim.

Continuous Assurance: Kelime anlamında çıkaracağımız nokta bizim için en önemli şey aslında sürekli güvence altında olmak, sunmak veya en önemlisi sunabilmek. Bu kısımdaki MS Core Services Engineering & Operations (CSEO) ekibi tarafından anlaşılmak istenen yaklaşım güvenliği sürekli değişen, yenilen bir süreç olarak ele alıyor. İşte bu yüzden Azure Kaynaklarının sık sık belirli bir mekanizma ile kontrol edilmesini ön görmemiz gerektiğinden bahsediyor. Bu kısımda bizlere Azure Automation içerisinde, Runbooks'lar ile bunların yapılması gerektiğinden bahsetmiş. Bizler ile paylaşmış olduğu Runbook kolleksiyonu aslında Azure Resource tek tek gezip herhangi bir sorun olduğunda bizim için o hataları düzeltmeyi hedefliyor. Security taramalarının hepsini Azure Automation tarafından yönetileceğini ve talebe göre otomatik olarak düzeltebileceğinizi söyleyebiliriz.

Alerting & Monitoring: Azure kaynaklarının güvenlik durumunun görünürlüğüne çok önemli olduğuna vurgu yapılıyor. Uygulamaya sahip departmanlar tarafından veya ayrıca merkezi IT / DevOps ekipleri için çok büyük bir önem arz etttiğini ve bunları her iki ekip tarafındanda görüntülenebilmesi için Operational Insight/ Log Analytics üzerinde Monitoring Solution olarak Azure Secure DevOps Kit eklentisi aktif edebiliyoruz. Bu eklenti sayesinde yukarıda yapılan tüm health check sonuçlarının detaylarını görebilir veya departmanlarınız ile paylaşabilirsiniz.

Cloud Risk Governance: Yukarıda belirtmiş olduğum tüm maddeler haricinde Az Secure DevOps kit içerisindeki en son bu madde bize yukarıda yaptığımız tüm aşamaların bulut kaynaklarının risk yönetiminin, denetiminin, devamlı kontrol altında kalması aşamalarının sonuçlarının takip edilmesini sağlayacak. Bu aşamaya geldiğimiz zaman bize Application Insight kullanarak telemetrik veriler sağlanacak. Bu ise bize firmaların, uygulamalarının güvenlik sağlığının ihtiyaç duyulan ve yapılan iyileştirmelerden haberdar olmalarına yardımcı olacak.

Secure DevOps Kit for Azure özelinde bulunan tüm başıkları tek tek inceledik. Şimdi ise AzSK nasıl bir profilin ihtiyacı olabilir, kimler tarafından ne için kullanılmak istendiğini inceleyim. Bu kısımda IT Organizasyonu veya DevOps eko sistemi içerisindeki kişilerden örneklere göz gezdirelim.

Tablo üzerinde görebileceğiniz gibi Departman veya Kişi bazında faydalarından bahsetmeye çalıştım. Kişi dememin en temel noktası ufak organizasyonlarda yukarıda gördüğünüz işlerden aynı kişi sorumlu oluyor. Bir sonraki yazımızda artık Secure DevOps Kit for Azure abonelik seviyesinde nasıl kullanabildiğimizden bahsedeceğiz.

· 4 min read
Hasan Gural

Bir önceki yazımızda Azure Function örneğini deploy etmiş ve içerisinde bulunan function ile nasıl etkileşim halinde olduğunu ve aksiyon aldığından bahsetmiştik. Şimdi ise Azure aboneliği üzerine Custom Resource Provider tanımlamasının nasıl olduğunu anlayamaya çalışalım. Öncelikle Custom Resoırce Provider henüz general available olmadığı için tüm Azure Region'larında kullanma şansınız yok. Bu yüzden ben sadece destekleyenlerden biri olan, 'EastUs' özelinde devam edeceğim. Custom Resoırce Provider kesinlikle destekleyen Region'lar da oluşturulmalıdır.

    "$schema": "",
    "contentVersion": "",
    "parameters": {
        "containerName": {
            "type": "string",
            "defaultValue": "fsocietyTerminal01"
    "resources": [
            "apiVersion": "2018-09-01-preview",
            "type": "Microsoft.CustomProviders/resourceProviders",
            "name": "customContainerProvider",
            "location": "eastus",
            "properties": {
                "resourceTypes": [
                        "name": "startContainer",
                        "routingType": "proxy",
                        "endpoint": "{RequestPath}"
            "apiVersion": "2018-09-01-preview",
            "type": "Microsoft.CustomProviders/resourceProviders/startContainer",
            "name": "customContainerProvider/startNewContainer",
            "location": "eastus",
            "dependsOn": [
                "[resourceId('Microsoft.CustomProviders/resourceProviders/', 'customContainerProvider')]"
            "properties": {
                "ContainerName": "[parameters('containerName')]"
    "outputs": {

Yukarıda gördüğünüz resim üzerinde bir çok açıklama mevcut. Öncelike yukarıda gördüğünüz resim basit bir Azure Resoırce Manage Template ibaret ama bunun içerisinde bir tanımlamalar var. Bu template genel anlamıyla iki iş yapıyor. Bu açıkmalar resim üzerinde var ama kısaca yine özetlemekte fayda olduğunu düşünüyorum.

Azure Template içerisinde Resources kısmında tanımlı olan bölümleri ele alalım.

    1. Bölge yani , Custom Resoırce Provider için Azure API içerisinde tanımlı olan Resoırce Type çağırıp, işte benim custom resoırce provider adım ve ResoırceType tanımlamam bunlar dedik. CustomContainerProvider adında bulunan Custom Resoırce Provider bana startContainer adında bir resoırceType sağlıyor olacak. Bunu tekrar template içerisinde kullanarak süreci Azure function tarafına devredeceğim.
    1. Bölge de tamamen tanımlamış olduğum Custom Resoırce Provider çağırıyorum ve ona parameterik olarak bir değer gönderip container oluşmasını sağlayacağım. Dediğim gibi normalde bunu Azure Resource Manager Template ile yapabilirsiniz ama burada vermek istediğimiz mesaj Azure Abonelikleri eğer benim Custom Resoırce Provider'ımı kullanıyor ise, lütfen şu propertyleri göndersin ve onun için kendi hizmetimi, bana özel çözümümü Azure Aboneliği içerisine kolay birşekilde dağıtabileyim ve müşteri tarafında gereken tüm automation, yapılacak bir çok işlem (lisanslama, deployent validation vs) Azure Function arkasında çalışan Powershell ile yönetilebilsin. Bunun giib farklı örnekler ile senaryomuz genişletilebilir.

Şimdi isterseniz Deployment sürecine geçelim ve nasıl aksiyon alındığını beraber görelim. Yukarıda gönrdüğümüz template kendi aboneliğim içerisinde çalıştıracağım ve bu sayede basit bir container elde edeceğim. Azure Portal içerisinden Template Deployment seçelim,

Daha sonra "Create" butonuna basarak yukarıda bulunan Azure Resource Manager Template içerisine yapıştıralım ve parametreleri dolduralım.

Template için parametrik değer olarak "Container Name" kısmını belirledik. Bu containerName için girdiğimiz değer, yukarıda bahsettiğimiz gibi Azure Function içerisinde Azure API üzerinde REST API olarak gönderilecek ve Azure Function bu değerleri aldıktan sonra bizim için aksiyon alacak. Şimdi 'Purchase' butonuna basalım ve neler olduğunu beraber görelim.

Deployment süreci başladı. İlk önce tanımlamış olduğumuz customContainerProvider tanımlamasını yaptı. Bunu görebilmeniz için, Deploy ettiğiniz Resource Group içerisinde Deployments sekmesine gelmeniz yeterli. Şimdi ise Azure Resource Manager Template içerisinde olan ikinci kaynak olan Custom Resource Provider içerisine containerName parametresini gönderip Azure Function tarafından tetiklenmesini sağlandığını görelim.

Herşey yolunda gitmiş gözüküyor, gönderdiğimiz değer Azure Function içerisine gönderilmiş , Azure Function içerisindeki Powershell çalıştırıldı ve Azure Rest API gerekli cevaplar düzgün iletilmiş. Görüldüğü üzere deployment Azure function tarafından başarılı bir şekilde yapılmış gözüküyor. Şimdi ise Azure Function tarafında Log detaylarını görelim, böyle bir talep geldiği zaman nasıl bir etkileşim başlıyor.

Kullanmış olduğumuz Template içerisindeki Parametrik olarak değer Azure ARM REST API sayesinde Azure Function içerisine gönderildi ve yapmak istediğim Resource Group ve Azure Container Instance oluşturuldu. Azure Container Instance oluşup oluşmadığını kontrol edelim.

Yukarıdaki resimde görüldüğü üzere Azure Container Instance oluşturuldu ve Container içerisinde console üzerine yazılar yazdırdık. Bu yüzden tamamen neler yapabileceğimize bir örnek vermek adına yaptığımız bir uygulama oldu. Aşağıda paylaştığım gitHub adresim üzerinden dilerseniz Custom Resource Provider Template direk deploy edebilirsiniz. Fakat dikkat etmeniz gereken endpoint adreslerinin düzeltilmesi, kendi Azure Function hizmetini göstermelisiniz.

Not: Yaptığımız örneklerde sadece bir adet Azure Aboneliği özelinde devam ettik. Gerçek senaryolarda Azure Function tamamen hizmeti veren firma, partner tarafından yönetilir. Firmanın verdiği hizmetleri kullanmak isteyen Azure Abonelikleri Custom Resource Provider sayesinde Partnerlerin hizmetini kendi abonelikleri içerisine deploy etmelerine yardımcı olur. Yazımızın başında dediğimiz gibi, bu yöntem Partner firmaların hizmetlerini Azure Aboneliklerine dağıtırken kullanabilecekleri bir yöntem ama dilerseniz kendi organizasyon yapınızda kullanabilmek şansınız olabilir. Daha önceki yazımda verdiğim örnek gibi, Jumbox on demand aslında buna en net örnek olarak gösterebilirim. Bunun sebebi herşey kolay ve hızlı bir şekilde Azure Functions tarafından geliştirilen Powershell tarafından yönetiliyor olacak. Bu yüzden kontrol, yönetim, gizlilik herşey Azure Functions arkasında yazılan olan kısıma bağlı yani özetle hizmet veren kişiye/firmalara.

Daha fazla detay için gitHub adresim üzerinden contribute edebilir veya bana direk yorumlarınızı iletebilirsiniz.

· 5 min read
Hasan Gural

Bir önceki yazımızda Custom Resoırce Providers kavramını tanımlamak ve ona bağlı olan komponentleri anlamak ile ilgilenmiştik. Bu yazımızda ise, Custom Resource Providers tanımlamasının nasıl olduğundan bahsediyor olacağız.

Custom Resource Provider nasıl tanımlanır?

Custom Resource Providers, Azure ile endpoint (Azure Function) arasında karşılıklı ilişkileri tanımlayan bir listedir. Bu karşılıklı tanımlamalar Azure'un herhangi bir endpoint ile nasıl etkileşime girmesi gerektiğini açıklar. Custom Resource Provider'lar bir proxy gibi davranır ve belirtilen endpoint için gelen istekleri alır ve yanıtları onlara iletir. Bu kısımda endpoint arkasında çalışan bizim geliştirdiğimiz bir adet Powershell Core yazılmış Script olduğunu düşünelim ve onu Azure Function hizmetine deploy edip, endpoint olarak kullanacağız Azure Function olmasının sebebi tamamen Azure Servislerinden faydalanmak. Bir Custom Resource Provider iki tür sözleşme/tanımlar modeli belirtebilir bunlar sırasıyla;

  • resourceTypes
  • Actions

Bunlar endpoint tanımlarını belirtirken kullanılır ve her ikiside farklı API özellikleri bizlere sunar ve onlar aracılığıyla etkileşim içine geçilebiliriz.

  • name,
  • routingType
  • endpoint.

Yukarıda gördüğünüz, bir endpoint tanımının alması gereken öznitelikler yani propertyleri görebilirsiniz. Bu property'lerin ne iş yaptıklarına kısaca göz gezdirelim.

Tablo içerisinde bahsettiğimiz ve yukarıda ki örnek JSON dosyası içerisinde sıradan bir Endpoint tanımlasını nasıl yapmamız gerektiğinden bahsettik. Şimdi ise bu endpoint tanımlasını Azure Resource Manager içerisinde nasıl kullanabileceğiz ve nasıl Custom Resource tanımlası yapabiliriz buna beraber bakalım. Öncelikle Custom Resource için Resouce Types anlaşma/tanım özelliğini kullanılım. Aşağıda gördüğünüz tanımın temelinde bize yeni bir API sunar ve tüm operasyonunda RESTful özelinde Create, Read, Update, Delete (CRUD) yöntemlerini ortaya koyar ve destekler.

Yukarıdaki tanımladığımız JSON içerisinde artık Azure API bu detayları gönderdikten sonra Custom Resource ile nasıl iletişime geçeceğini ve eklenen API Detayları aşağıda bulabilirsiniz. Girdiğiniz resourceType adına göre Azure REST API gerekli CRUD işlemleri için API tanımlamaları yapılacaktır. ResourceType olarak kullanılan Custom Resource Provider tipinde yapılan istek sonrası endpoint kesinlikle Id, Name ve Type göndermelidir. Bunlar sırasıyla,

  • Id: "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.CustomProviders/resourceProviders/{customResourceName}",
  • Name: "{customResourceName}",
  • Type: "Microsoft.CustomProviders/resourceProviders/{resourceTypeName}"

Bunların detaylarını geliştirmiş olduğum Powershell code bloğu içerisinde bulabilirsiniz. Return Response olarak bu değerleri geriye dönmeniz gerekiyor, Deployment sürecinin başarılı tamamladığını anlatmak için Azure API tarafına göndermeniz şart.

Custom Resource Provier için Custom Actions nasıl tanımlanır?

Daha öncede söylediğimiz gibi iki adet farklı karşılıklı anlaşma modelimiz var idi. Bunlardan diğeri olan Custom Actions en basit haliyle, Custom Resource Provider tanımlamasını yaptığımız zaman Azure bize, Action için bir Rest API sunar ama sadece Post methodunu destekler. Yazı serimiz boyunca ResourceType tanımı üzerinde yoğunlaşıp onu kullanarak endpoint kullanımı gerçekleştireceğiz.

Yukarıdaki örnekte bir Actions tanımlaması Custom Resource Providers için görebilirsiniz. Bu tanımlama ile bahsettiğim gibi, Custom Resource Providers için RESTful operasyona denk gelen aksiyonları belirtip endpoint talepleri iletebileceğiz. Tanımlanan Actions ile aşağıdaki API Detayları elde edilebilir.

Actions olarak kullanılan Custom Resource Provider tipinde yapılan istek sonrası endpoint kesinlikle aşağıda bulunan geçerli tipte veriler döndürmelidir. Bunlar sırasıyla,

  • Content tipi: "application/json; charset=utf-8" olmalı.
  • Geçerli bir JSON formatında, object array.

Custom Resorce Provider özelinde Resource Type ve Actions tipinde farklı karşılıklı anlaşma modellerinin nasıl yapılacağını gördük, aralarındaki farklılıklardan bahsettik ve artık ön gereksinimlerimize geçebiliriz.

Azure Functions hizmetine ihtiyacımız var çünkü bizim için bir endpoint gibi davranıp Custom Resource Provider tarafından gelen eylemleri işleyip Azure Function içerisinde çalışan Powershell Function veya Script artık nasıl bir süreç yönetmek istiyorsanız sizin isteğiniz doğrultusunda aksiyon almasını sağlayacağız. Makale içerisinde sizleri Azure Function nasıl oluşturulur, neler yapmanız gerektiğini bilmenize gerek kalmadan kendi gitHub hesabım üzerinden Azure Resource Manager Template'lerine erişebilir ve hızlıca kendi ortamınıza dağıtabilirsiniz. Bu yüzden Azure Function nasıl oluşturacağım, nelere dikkat etmem gerekiyor gibi sorunlara sizi boğmadan Azure Function oluşturmak için aşağıdaki adımları seyrederseniz çok hızlı bir şekilde Custom Resource Provider için bir endpoint tanımlaması gerçekleştirebilirsiniz.

Azure Function Dağıtım adımları için lütfen aşağıdaki adımları takip ediniz.

Gördüğünüz gibi Deploy to Azure butonuna bastığınız zaman sizler için yayınladığım Azure Function hizmetini deploy ediyor olacak. Function içerisinde geliştirdiğim, StartContainer isimli Function job tanımlanmış olacak. Bu sayede bunu Custom Resource Provider kullanabilirsiniz. Deployment başarılı olduğu zaman sizin için bir Deploy ettğiniz Function adında bir adet App Registration oluşturacak ( Service Principal Account ) bunun demo ortamı için azure hesabınıza yetkilendirmesini yapmanız gerekmektir. Daha fazlası için gitHub sayfamı takip edebilirsiniz. Özetle bu function depoy ederek, endpoint tanımlamasının bir şablon halinde hesabınıza dağıtarak kullanmaya başlayacaksınız.

Aşağıdaki paylaştığım Azure Function içerisinde Powershell Core ile geliştirmiş olduğum bir kod bloğu var, yaptığı işi kısaca özetlemek gerekir ise gelen talep doğrultusunda bir adet container oluşturup console içerisine birşeyler yazdırmak. Tahmin edebileceğiniz gibi bunu zaten Azure Resoırce Manager Templateleri ile yapabiliyoruz ama burada vermek istediğim örnek tamamen sizin hizmetinize özel geliştirmiş olduğunuz Custom Resource Provider için belirli bir nitelikler göndererek ( endpoint'e yani Azure Function uç noktasına) bu değerler Azure Function tarafından işlenip sizin için bir aksiyon almasını sağlamak. Yani özetle Azure deneyimini bozmadan, Azure Resource Manager üzerinden abonelik içerisinde Custom Resource Provider register edip, sadece talep edilen propertyleri göndermek olacak. Aşağıda bulunan kod bloğunu incelediğiniz zaman request edilen container adında hızlıca bir ACI oluşturup console üzerine birşeyler yazıyor olacak.

Bir sonraki yazımızda Azure Function ve Custom Resoırce Provider için yapmamız gereken yapılandırmalara devam edeceğiz.

· 7 min read
Hasan Gural

Bir süredir yazmak istediğim seri ile karşınızdayım. Öncelike seriyi okumadan önce lütfen Mshowto Blog'u üzerinde ve internette takip edebileceğiniz Azure Resource Manager Template isimli yazıları okumanızı tavsiye ederim. Eğer Azure Resource Manager az bir seviyede aşina iseniz, bununla beraber kendinizi DevOps kültürünün bir parçası olduğunuzu farkettiğiniz zaman Infrastrature As Code ile uğraşmaya başladınız demektir. Temel amacımız bu yazı seri içerisinde vermek istediğimiz veya aktarmak istediğimiz konu Azure Resource Manager'ın bir parçası olan Custom Resource Provider kullanarak ve işin içerisine son zamanlarda gözde servisimiz olan Azure Function dahil ederek bu muhteşem ikilinin aralarında bulunan çalışma ilişkisini göstermek olacak. Bu terimleri yazımızın ilerleyen kısımlarında tek tek açıklıyor olacağım.

Custom Resoırce Provider tanımına geçmeden önce hızlıca Azure Resource Manager ve Azure Functions konularından bahsedelim. Öncelikle Azure Resource Manager Template dağıtım modelini kullanmanın avantajlarından kısaca bahsedelim. En basit haliyle Azure Resource Manager Template dağıtım modelini kullanarak geliştirmiş olduğunuz JSON ( declarative syntax ) ile tekrar edilebilir, validate edilmiş, DevOps kültürüne uygun olarak deployment patternleri hazırlayabilir ve tekrar tekrar kullanmaıza yardımcı olur. Green Field bir deployment yaptığınız zaman veya hali hazırda mevcut bir ortamınız için geliştirilmiş olan Azure Resource Template'lerini Dev, UAT, Production ortamlarınız için tutarlı deployment pattern hazırlayabilirsiniz. Bildiğiniz gibi farklı deployment araçları kullanarak Terraform, Ansible(her ne kadar configuration as code giriyor olsada IaC ve CaC ) olarak da kullanabilir) dağıtım yapabilirsiniz.

Azure Resource Manager templateleri daha önce dediğimiz gibi bize tutarlı, tekrar edilebilir, moduler hale getirilmiş, validate edilmiş ve CI/CD süreçlerine entegre olurken çok farklı avantajlar sağlıyor. Deployment süreçlerini yönetirken hangi tool ile bu işi sırtlanmanız gerektiğini siz belirleyebilirsiniz. Daha öncesinde farklı deployment aracı olan Terraform video serisimize Bulut Bilişim Çözümleri ve Ötesi isimlı youtube kanalı içerisinden bakabilirsiniz.

Azure Function ile ilgili yaklaşık iki sene önce bir yazı yazmıştım ama o kadar hızlı değişiyor ki yetişmek mümkün değil. Uzun bir süredir Azure Automation kullanarak schedule edilen standard tasklarımı veya WebHook kullanarak request ettiğim custom süreçlerimi öncelikli olarak Azure Automation içerisinden yönetiyordum ancak oyuna Azure Function hizmetinin Powershell desteği ile girmesiyle beraber şimdi ise iki tarafıda yoğun olarak kullanıyorum fakat Serverless Automation kavramında Azure Function oyuna dahil olduğu için bu Azure Function hizmeti içerisinde Powershell kullanmayı daha çok tercih etmeye başladım şu sıralar. Azure Functions en çok DevOps tarafında Servleress Automation olarak karşımıza çıkıyor ve EventGrid, Storage Queue veya Services Bus ile yaptığınız entegrelerde inanılmaz sonuçlar alabilirsiniz. Bu konuyu başka bir yazıda ele alacağım. Muhtemelen Event Driven Orchestration dünyasının nimetlerinden faydalanmamak imkansız gibi gözüküyor.

Azure Function kendi içerisinde v1 ve v2 olarak ikiye ayrılmakta, yeni bir Azure Function oluşturmak istediğiniz zaman hangi versiyonu seçmeniz gerektiğinize emin olmalısınız. Temel anlamıyla, v1 Powershell Core desteklemiyor. Powershell Core kullanmak istiyorsanız v2 ile devam etmenizi tavsiye ederim. Sebebi ise Powershell Core dışında, Azure Function v2 bize çok fazla kolaylık sağlıyor, en temeli custom bir Powershell Modülüne ihtiyacınız olur ise bunları yönetmek için Dependancy Management kullanarak Package Management üzerinden Custom Powershell Modüllerini alabilir veya Managed Identiy tadına vararak Azure Function code bloğunuzun çalışırken karşılaşacağı authentication sorunlarını kolayca atalabilirsiniz.

Şimdi tekrar Azure Function hizmetini nimetlerine dönmeceğim ama önce artık Custom Resource Provider nedir, ne için kullanabiliriz bunu biraz daha açalım. Bunları şu cümleler ile özetleyebiliriz.

Öncelikle şunu bilmenizi isterim ki, Custom Resource Providers henüz release olmadı. Birkaç cümle ile Azure'da bulunan Publisher'lar yani Vendor veya Partner artık nasıl çağırmak isterseniz onların hizmet vermek istediği müştlerine kaynaklarını dağıtmak, configure etmek için bir yol sağlamaktır. Kullanıcıların Azure dışından gelen kaynaklar için eylemler tanımlamasına izin verir ve bunları Azure Resource Manager şablonu ile dağıtımına yardımcı olur. Senaryoyu biraz daha açmak gerekir ise düşünseniz F5 bir load balancer deploy etmeye çalıştığınız firmanın bir takım orkestrasyon yapması gerekir dağıtılan kaynaklar içerisinde işte tam bu noktada Azure Custom Resource Provider yardımımıza koşuyor. Azure Managed Application detaylarına baktığınız zaman Custom Resource Provider ile ilişkisi olduğunu göreceksiniz. Aslında cevap çok basit, eğer custom bir uygulamanız var ise ve bunu Market Place üzerinden hizmet vermesini istiyorsanız Custom Resource Provider kullanarak Custom Resource için API'lar yayımlayabilir ve kullandırabilirsiniz.

  • Azure Resource Manager REST API - isteğimiz doğrultusunda genişletebiliriz. Bunlar organizasyonuza bağlı olarak tasarlanan uygulamalar Internal ve External hizmet sağlayıcıları olabilir.
  • Mevcut Azure Deployment süreçlerinizde ihtiyacımız olan özel yapılandırmaları otomatikleştirebiriz.
  • Azure Resource Manager Template kullanarak daha fazla denetim altına alabilir ve etki eden deployment süreçlerini daha detaylı kontrol edebiliriz.

Daha fazla örnekleri genişletmemiz gerekir ise sizin bir uygulamanız var bir servis sağlayıcı olarak bu uygulamanızı Azure üzerinde kullanan müşterinize sunarken bir deployment süreçinden geliştirmek istiyorsunuz. Bu herhangi bir third-party uygulama, firewall, aklınıza gelebilecek Azure kaynaklarına dokunna her türlü bir süreç olabilir. Siz bir partner olarak hizmetleriniz var bunları Azure Resource Manager üzerinden dağıtabiir hale getirmek istiyorsunuz ve arada yer alan dağıtım süreçlerini otomatik hale getirerek tamamlamak istiyorsunuz. Benim yakın zamanda yaptığım ve Pre-Production bir sistemde kullanmak olduğunuz Custom Resource Providers kullanarak bir dağıtım yönetimden bahsetmek istiyorum tamamen internal-organizasyon içerisindeki istekler özeli dahilinde kullanıyoruz.Bir Custom Resoırce Provier geliştirdik fakat bu sadece şirket içerisindeki departmanlara hizmet veriyor. En basit haliyle, şirket içerisinde farklı departmanlar var bu departmanların kendi özgü kaynakları abonelikleri olduğunu düşünün. Departmanların isteği doğrultusunda kendi ortamlarına kolayca Jumpbox VM ihtyaçlarını olduğunu ve bunu yine basit bir Azure Resource Manager Template ile kullanabildiklerini ama arkadaki bir çok automation süreçlerini çok fazla soru sorulmadan kolayca ve güvenli bir biçimde halledildiğini düşünün.

Özetle; Bu servisi ben {Jumbox-On-Demand} olarak çağırıyorum. Business Departmanlar merkezi olarak kendi ihtiyaçları doğrultusunda Jumbox on demand hizmetini talep etmek için Azure Resource Template kullanıyorlar ama bu template içerisinde kullanmak istedikleri Azure kaynakları tek tek tanıtmıyorlar, sadece template hizmeti veren ekip tarafından geliştirip, talep edilen parametreler aslında Azure Function içerisine Post ediliyor ve deployment tamemen Azure Function üzerinden kontrol ediliyor. Azure Resource Manager Template'ler sadece bu noktada endpoint ( Azure Function) olarak tanımlamak için ve talep edilen parametrik değerli almak için kullanılıyor. Eğer aşağıda süreçleri düşünürseniz, bu işleri yapmak için basit bir kullanıcının nelere yetkili olması gerektiğini farkına varabilirsiniz. Bu yüzden business departman kullancısı sadece istediği talebi Azure Resource Manager içerisinde tanımlı olan Custom Resource Provider resource'una iletip daha sonrasında Azure Function endpoint'ine gönderiyor ve tüm kontroller, authentication ve authorization Azure Function tarafında yazdığınız Powershell Script tarafından kontrol edilecektir. Senaryonun bir tık ilerisi aslında aynı Azure Function hizmetini, ITSM hizmetleri ile birleştirmekten ibaret yani aynı talebi firmanın talebi ile beraber ServiceNow gibi hizmetlere entegre edebilirsiniz sebebi ise Azure Function geliştirdiğiniz Powershell bloğunuz bir Rest API gibi davranabilir ve önüne Azure API Management hizmetini koyabilirsiniz.

  • Creating - Virtual Machine – Sanal Makine oluşturma
  • Impelementing – Disk Encyrption – Oluşturulan Sanal Makineyi Disk Encryption süreçlerini otomatik hale getirme
  • Creating Firewall Rules on Firewall for spesific IP Ranges. Oluşturulan sanal makine için Firewall üzerinde ingress kurallar tanımlama ( belirtilen source adresler üzerinden)
  • Creating CIS Based Imaged – Enrolling Azure Automation Account to get latest DSC Configuration – CIS Image ( Hardening olaması için geliştirdiğim DSC Config alabilmesi için Azure Automation otomatik register etmek)
  • Automatically Enroll to Backup Vault – Jumbox amaçlı oluşturulan sanal makinenin Azure Backup Vault içerisine otomatik olarak kaydedilmesi
  • To Schedule – Azure Runbook for deleting and redeploying Jumpbox. Deployment süreçinde Azure Automation DSC ve Runbook özelliğinden faydalanılıyor. Mevcut bir Runbook ile güvenlik gereksinimlerinden dolayı her 30 günde bir dağıtılan Jumpbox silinip tekrar oluşturup domain ortamına dahil ediliyor.

Diğer bir örnek verebilecek olur ise, Custom Resource Provider ile mesela, Azure Active Directory tarafında Group Oluşturmak, Group Member'ları ekleme çıkarma gibi değişik senaryolar yapabilirsiniz. Senaryolar oldukça genişletilebilir.Bir sonraki yazımızda Custom Resoırce Provider yapısını oluşturmak için temel bileşemlere bakıyor olacağız.

· 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-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 = @(

# 2. Array tanımlamak
$mysecondArray = @(

$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 = @(

$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 = @(

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 = @(

#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 = ''


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

Also you can reach my GitHub Profile here;

· 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 "" `
-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 "" `
-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.


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 :

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.

· 3 min read
Hasan Gural

Packer ile Azure üzerinde VM image yönetimine devam ediyoruz. Bir önceki yazımızda Service Principal ve Packer tanımlaması için JSON dosya oluşturup Variable tanımlarını yaptık fakat karşılarına değerler girmedik. Şimdi dilerseniz bizden istenilen tanıımlamaları tek tek girelim. Aşağıdaki resim içerisinde göreceğiniz gibi Variables olarak adlandırılan bölümde, Azure Subscription detayları, Service Principal bilgileri ve son olarak oluşturulacak olan image için saklanacak resource group ve image name bilgileri yer almaktadır. Bu bilgileri doldurduktan sonra, daha sonra onları ilerki tanımlamalarda kullanıyor olacağız. Adından anlaşılacağı gibi, bunlar sadece bizim abonelik ve packer için kullanılacak bilgileri içermektedir.

Yukarıda gördüğünüz beyaz alan içerisinde tüm istenilen key-value ilişkisi içerisindeki değerleri doldurdum. Packer kendi içinde Azure ARM API üzerinden istek yaptığı zaman Service Principal kullanarak yani ClientId ve ClientSecret ile erişim sağlayıp, ilgili subscriptipon üzerinde işlemlere başlayacak. Şimdi JSON dosyası içerisinde geliştirmelere devam edeceğiz. Bir özellik daha ekleyeceğiz JSON içerisine ve bu sefer adı 'Builders olacak ve alt kısmına 'Builders bize sunduğu özellikleri girebileceğiz. Basit haliyle Builders ne iş yapar derseniz, çeşitli platformlar için sanal makineler oluşturup bunlardan image üretmekten sorumludur. Örneğin, EC2, VMware, Azure, Citrix, VirtualBox, vb. İçin ayrı geliştiriciler vardır. Packer, varsayılan olarak birçok üretici ile birlikte gelir ve ayrıca yeni geliştiriciler eklemek için geliştirelebilir ve geliştirilebilir.

Şimdi ise Builders için bir tanımlama yapalım ve nasıl kullanıldığını anlamaya çalışalım. Öncelikle 'builders' tanımlaması aşağıdaki gibi yapılmaktadır.

Yukarıda görüldüğü gibi 'Builders' nesne içerisine oluşturacağımız image için gerekli key-value değerleri girebiliriz. Bu kısımda anlaşılacağı gibi benim gireceğim değerleri nereden öğreneceğinizi merak ediyorsanız, bunun için Packer sayfasını ziyaret edebilirsiniz. Takdir ederseniz her hizmet sağlayıcısının ( Azure, AWS, Vmware, Hyper vd ) hepsinin kendine özel terimleri ve adlandırmaları var. Bu yüzden bunları key – value şeklinde tanımlarken, reference alabileceğiniz tek sayfa Packer Builders sayfası olacaktır. Şimdi ise, Azure için örnek bir 'builders' tanımlarını inceleyelim.

Artık 'Builders' içerisine yaptığımız tanımlamaları görmektesiniz. Aslında çok zor ve anlaşılmayacak bir tarafı yok. Hemen 'Builders' tanımın altında "Type' ( 13.Satır ) yazan kısımda hangi provider için kullanacağımızı belirtmek zorundayız. Bunun sebebi yazımızın başında söylediğimiz gibi, Packer birçok provider üzerinde image yönetimini destekliyor. Turkuaz alan içerisine aldığım 15 – 20 satır arasına dikkat ettiğinizde, Variables Nesne içerisinden onları değişken şekliden çağırıp kullandık. Aslında JSON dosyasımızın ilk kısmında, Variable alanları tanıtıp, 'Builders' içerisinde kullandık. En son olan kırmızı bölgemizde satır 22 – 40 arasındaki alan ise Packer sayfası üzerinden image yönetimini için gerekli tanımlamalar olarak söyleyebiliriz. Bu tanımlamalar olmadan herhangi bir yönetilen imaj oluşturma şansınız yok. Bu kısımda, 'Azure Tags' nesnesinin karşına key-value olarak bir takım Tagler tanımladım. Bunlarıda kaynak için atamasını yapıyor olacak. Bunun dışında imaj özelinde yaptığımız tanımlaların karşısındaki değerlere baktığınız zaman sizde çok kolay bir şekilde anlayacaksınız. Bunlar sırasıyla, "ImageSku,ImagePublisher,Image_Offer" gibi değerler, bunun yanı sıra, WinRM gibi hizmetlerin açılması ve tanımlamaları yaptım. Son olarak size makine boyutu ve region detaylarını belirttik.

Aşağıdaki ekran görüntüsünde, Packer sayfasından bir alıntı yapmak istedim. Bu görüntü içerisinde sizlere Packer sayfası üzerinde ne kadar basit bir şekilde yapmanız gerektiğini anlatıyor. Bir çok insan image yönetimini klasik ya da alıştıkları yöntemler ile yapmakta ısrarcı davranıyor. Mevcut kuralları yıkmak gerçekten çok zor, kurum kültürü organizasyon hareketleri malasef bu değişikliğe çok çabuk izin vermiyor. Ama makalemizin ilerleyen kısımlarında, Packer'ın yeteneklerine alışacağınıza inanıyorum.

Bir sonraki yazımızda, Packer için farklı bir konu olan "Provisioners" adlı kısmı inceleyeceğiz. Burası benim en çok sevdiğim ve neler yapabileceğimizi tamamen kavracağımız nokta olarak söyleyebilirim.

· 3 min read
Hasan Gural

Bildiğiniz gibi, herkes altyapılarını otomatik bir hale getirmek için birçok powershell scriptler yazmakta ve daha sonra bunları bir şekilde otomatik çalışacak hale getirip, devamlı çalışarak birçok iş yükünü azaltmaktadır. Fakat yine herkesin bildiği diğer bir konu ise geliştirilen tüm kodların test edilmesi gerektiğinin önemi. Tüm altyapınızı otomatize ettiniz, fakat test süreçlerinizide otomatize etmeniz gerekiyor. İşte bu yazı serisinde Powershell Modülü olan Pester incelemesini gerçekleştireceğiz.

Günümüzde artık Automation özellikle burayı altını çizerek söylemek istiyorum, Altyapı yönetiminin bel kemiği haline gelmiş durumdadır. DevOps kültürüde bizlere bu kültürün bir parçası olan iyi bir automation stratejisi gerektiğiniden bahseder ve anlatır. PowerShell'in gücünü göz önüne aldığınızda, çalışan bir arkadaşınız veya proje yöneticinizin veya benzer otoritede olan bazı kişiler sizlere temel sorularla size geldiğini hayal edin. Çok basit birkaç soru ile bunları toparlayalım.

Gerçekten yazılan kodun gereksinimlerini karşılıyor muyuz? veya Geliştirilen tüm scriptlerin yaptıkları şeyleri bize nasıl kanıtlarsın? Günün sonunda evet sistem tarafında aksiyon aldığını göreceksiniz fakat yine bunların testlerinin yapılması ve başkası tarafından bu testlere ulaşılması gerekmektedir.

Pester Nedir?

Öncelikle modülün detaylarına girmeden önce, herkesin ortak bir noktası olacaktır. Yazılan tüm Powershell kodları test ediyorum veya ediyorsunuz. Ama aslında sizin test etmeniz önemli olduğu kadar, bu test sürecinizi otomatikleştirmeniz gerekmektedir. İşte bu noktada Pester Powershell Modülü yardımımıza koşmaktadır. Benim gördüğüm hali hazırda bir çok büyük firmaların hepsi hala test süreçlerini manuel bir şekilde gerçekleştirmektedirler. Ufak çaplı yazılan Powershell Scriptlerinde sorun yok, oldukça kısa ve sürec kolay bitiyor olabilir. Fakat ya çok uzun ve iç içe Powershel scriptler veya Powershell Modüle kullananlar ne yapacak?

Pester, PowerShell ile yazılan ve PowerShell için bir test framework'ü olarak tasarlanmış bir open-source tabanlı bir projedir. Open-source olduğu için source code gözden geçirebilir, hatta katkıda bulunabilirsiniz. Bütün projeyi GitHub'da bulabilirsiniz. Kısacası Pester'i kullanarak, PowerShell kodunuzu test etmek, PowerShell komutlarının PowerShell içinden yürütülmesi ve doğrulanması için birim testlerini çalıştırmak için bir framework sağlar. Kod yazılmadan önce test senaryolarımızın yazılması ve tüm yapılacak senaryolara ve süreçleri dahil ederek kodun yazılması ve tekrardan düzenlenebilmesi tekniğine kısacası TDD diyoruz. TDD kültürü, yaklaşımını bize Powershell Pester Modülü kazandırmaktadır.

Pester, Powershell Version 2.x'dan 5.x' a kadar Windows 10,8,7, Vista ve Server 2003'a kadar desteklemektedir. Pester ayrıca, Windows 10 ile built-in gelen neredeyse sayılı open-source araçlardan biri diyebilirim. Ayrıca Powershell Core 6.0 ile Windows, Linux ve MacOS desteği vardır bazı limitler ile beraber.

Pester Modülü Nasıl Kurulur?

Bildiğiniz gibi Powershell Package Management Modülünün bize verdiği yetenek sayesinde artık Powershell Modüllerimizi Repository üzerinden indirebilir durumdayız. Yukarıda belirtiğim gibi Windows 10'da direk pre-installed olarak gelmekte fakat modül devamlı geliştiği için bizlere update etmeyi önermektedir. Aşağıdaki Cmdlet bizlere yardımcı olacaktır.

Module başarılı bir şekilde kurulmuş olacaktır. Şimdi ise Module ile gelen komutları listeleyelim, ve hepsine bir göz gezdirelim.

"Get-Command – Module Pester" yazarak module ile gelen tüm komutları listelemiş olduk. Şimdi ise, Cmdlet baktığımızta, bir çoğunun tek bir kelime ile yazıldığını göreceksiniz. Normalde Powershell üzerinde tüm Scriptler, Functionlar Verb-Noun olarak tasarlanmışlardır. Bu kısımda kullanırken biraz değişik gelebiliyor ama zamanla alışacaksınız, sebebi ise çok basit kullanım şekilde olması ve tek amaç için. Örneğin "Describe ve It, Should" bunlar zaten hemen hemen hakim olduğumuz kelimeler.

Bir sonraki yazımıda artık Pester ile Powershell Code'larımızın test süreçlerini nasıl otomatize ettiğimize değineceğim.

· 3 min read
Hasan Gural

Yazımızın ilk serisinde neden Powershell – Pester Modülünü kullanmamız gerektiğinden bahsettik. Şimdi ise nasıl kullanmalıyız ve ne tür bir kullanım modeli olduğunu inceleyelim. Basit bir Powershell function geliştirdik ve bunun içerisinde bir takım kod bloklarımız olsun. Aşağıdaki detaylara ufak bir göz gezdirme ile neler yaptığını anlayalım.

"Get-Month" adında bir Powershell fonksiyonu geliştirdim. Bu fonksiyon bize bir yıl içerisinde bulunan ayları geri dönüyor olacak. Parametrik olarak vererek ise tüm aylar arasında filtreleme yapabilme şansınız var. Şimdi ise Pester içerisinde bulunan komutları tanıyalım ve görelim. Öncelikle 'Describe' ile başlayalım. Describe bize, test etmek istediğiniz Powershell Script Block başlangıcı sağlar. Örnek kullanım şekli aşağıdaki gibidir.

Yukarıda görüldüğü gibi, Test sürecinin başlaması için 'Describe' fonksiyonu ile tanımlamayı yapıyoruz. Yani Pester ile Test sürecine başlamak için 'Describe' ile ilk tanımınızı yapıp Script block (süslü parantez) ile tamamlıyorsunuz. Peki daha sonra ne yapmamız gerekiyor, artık test'e başlamak için bir isim verdik. Ama hangi testlerden geçmesi gerektiğine düşünüp yazmaya karar verdik. Bunun için ise devreye Pester Modülü içerisinde olan 'It' fonksiyonu giriyor olacak. 'It' fonksiyonu öncesi istersen 'Context' adında bir fonksiyon daha çağrıp extra yapacağımız testlere isim verebiliriz. Aşağıda bulunan örnekte detaylara bakalım.

Öncelikle, daha öncede söylediğimiz gibi bütün Powershell Pester Testleriniz kesinlikle Describe bloğuna sahip olmalıdır, Describe bloğu diyorum çünkü bildiğiniz gibi zaten kendiniz bir cmdlet-powershell function olarak kullanıyoruz. Aynı şekilde diğerleri 'It', 'Context'. Basit olarak bu Script blockları arasına istediğinizi yazmakta özgürsünüz. Şimdi ise geliştirdiğimiz function üzerinden hemen bir test süreci yazalım ve tekrar üzerinden beraber okuyalım.

Script satırlarına bakıldığı zaman aklımızda olan satırları tek tek inceleyelim. Öncelikle 'Describe ve Context' neden yazdığımızı anladık. Zaten çok basit bir şekilde gözlemleyebiliyoruz. Fakat 'It' script block kısmı dilediğimizi özgürce yazdığımız kısım idi. Daha doğrusu test süreçlerimizi adım adım belirttiğimiz yer. Ben kolay ve anlaşılabilir olması için, iki adet 'It' script block içerisinde bir takım kontroller yazdım. Bu kısımdaki kontrollerimize hızlı bir şekilde dikkat edelim. Yazdığımız fonksiyon bize yıl içerisindeki tüm ayları geri döndürüyor ve bununla beraber parametre alarak eğer gönderilen parametre değerinde bir değer belirtilmiş ise bu ve bu değer herhangi bir ay ile match edilir durumda ise sadece o ay bilgisini bize geri döndürüyor. Fonksiyon içerisinde yaptığımız işlemlerin bir kısmını Pester ile kontrol etmeye çalıştık. Bunlar neler kısaca,

  • Bütün aylar toplam sayısı – 12'ye eşit olmalı.
  • Gönderilen parametre değeri eğer ayarlar içerisinde herhangi bir değer ile match olmuyorsa.
  • ( Devamı eklenebilinir. 'It' script blockları ile belirtebilirsiniz.)

Artık tüm adımlarımızı yazdığınızı varsayalım ve test sürecine geçelim. Bu kısımda yazdığımız Pester – Powershell Script kaydediyoruz. Test sürecinin nasıl çalıştığını ve ilerlediğini anlamak için devreye 'Invoke-Pester' adında bir cmdlet çıkmaktadır. Bu Cmdlet içerisine parametrik olarak mevcut Powershell Pester-Test Scriptinizi gönderip sonuçları görebilirsiniz. Aşağıdaki detaylara beraber bakalım.

Invoke-Pester isimli cmdlet içerisine '.\Pester.ps1' yazmış olduğu script'imi gönderdim ve çalıştırdığım zaman bir sonuç ekranı çıkardı. İşte bu ekran üzerinde hangi test sürecinin ne kadar süre sürdüğünü, hangi test sürecinin başarılı olduğunu veya başarısız olduğunu anlayabilirsiniz. Son olarak ise tüm bu sürecin bütün halinin detaylarını son satır detayında görebiliyorsunuz. Sizde artık tüm scriptlerinizdeki test süreçlerinizi Powershell – Pester Module ile kolay bir şekilde gerçekleştirebilirsiniz.

· 4 min read
Hasan Gural

Before reading the article, you have to know that I'm not going to explain what are Docker and Container etc. On the internet, you may be able to find a lot of article series to understand Container and Docker structure. Basically, in this one, we will comprehend how can we create docker host on Azure via Docker Machine CLI. I could say, One brief (and incomplete) description is that Docker creates something similar to Virtual Machines, only that Docker containers run on the host machine's OS, rather than on a VM. Each Docker container should ideally contain one service and an application can comprise multiple containers.

As you know, when you install the docker on your machine, it provides command line interface for using and managing your docker hosts. Docker Machine supports to create new docker hosts also contains a lot of parameters when its a deployed which that is why I'm using Docker-Machine CLI to launch new docker host on my hypervisor. I've been testing the deployment of a new docker host on various platform such as Linux, Windows. It gives the easiest way to create new docker hosts. For instance, you are testing your container on your docker host and you want to scale your application. You want to involve your docker application in cluster environments. Also, you may need getting a new docker host to create cluster environments. Here it is, an easy way to get new docker host using Docker-Machine CLI and join to your cluster environments. Before we start, you can find requirements for creating new docker hosts.

Before you begin, you need to know your subscription-Id which will be used by docker-machine. Here it is, the easiest way to find your Azure subscription Id.

After running these lines, you will get your subscription id and to keep it. Because we will use it when we are using docker-machine cli. You can find below.

Create new docker host on Microsoft Azure

We are going to learn Docker-Machine CLI and what are its parameters also how can we use it. We should know Docker-Machine CLI parameters and what type of parameters need to use. Docker-Machine CLI uses 'create' and 'driver' options when we are creating new docker host on Azure After that we remark these commands, it will give you chance to use some operational parameters.I have added the detail of parameters of Docker-Machine CLI.

As you can see the above on the picture just one line is red. It means the parameter should not be blank. Let's have a look example of docker-machine create command.

docker-machine create --driver azure ` --azure-subscription-id $SubscriptionId[0] ` --azure-subnet-prefix ` --azure-open-port 22 ` --azure-private-ip-address ` --azure-resource-group 'RG-DockerNodes' ` --azure-location 'West Europe' ` 'dockernode-azure'

As you see above, the picture shows an example of Docker-Machine CLI parameters. The first parameter should have to be your provider. As you know, our provider's is Azure. We can put this line 'Azure'. However, Second Line should not be blank or null, you know this parameter is required. Because we have to remark our subscription Id which will be placed our resources. Let's complete our docker machine commands.

I have executed Docker-Machine Command which is in the above picture. So, It did create a new Docker Host on Azure. Now, We can manage our new docker host with Docker-Machine CLI like we can create a container, network etc. Here is screenshot of our new docker host on Azure that I wanted to show you.

On the Azure Portal, we can see our new docker host. Let's now we can get details of the node on Docker-Machine CLI. For these details, we should use Docker-Machine ls command.

In this article, we have done to create new docker host on Azure. We have a lot of ways to create a new one. We have selected to create with Docker Machine CLI. For Azure perspective, we can use Powershell, Template Deployment.

· 2 min read
Hasan Gural

Bir süredir zamanımın büyük bir bölümünü docker ile container yönetimine harcamaktayım. Gün içerisinde zamanımın çoğunu docker-compose, docker image yazarak ve bunları VSTS ile buluşturmama rağmen yine bir şekilde "Docker command line" ihtiyaç duymaktan alı koyamıyorsunuz. Tüm süreçlerin sonunda kendinizde test edip görmek istiyorsunuz. Fakat bu Docker command line benim gibi Powershell üzerinden erişip ve tab completion yapmak isterseniz, yardımımıza tam bu noktada GitHub üzerinden keşfettiğim güzel bir Powershell Module koşmaktadır. Eğer sizde çok fazla DockerCLI üzerinden, Network, Container, Image yönetimi yapıyorsanız ve bunların tab completion özelliğini kullanmak isterseniz, bu module tam size göre.

Posh-Docker Module GitHub üzerinde kullanıma açılmış yaklaşık en son iki yıl önce güncelleme yapılmış, fakat gayet yeterli bir şekilde işinizi göreceğine eminim. Client tarafında ön gereksinimleri aşağıda gibidir.

  1. Docker CLI 1.3 veya daha üst versiyonu
  2. Powershell 5.0 veya daha üst versiyonu

Bildiğiniz gibi Powershell ile Powershell Modüllerini PS Gallery sayesinde daha doğrusu Powershell One Get aracılığı ile repository üzerinden indirebiliyoruz, Posh-Docker bu şekilde sahip olma şansınız var. Bunların en basit yöntemi Install-Module komutuna kurmak istediğiniz Powershell Module adını göndermeniz yeterli olacak. Posh-Docker isimli Powershell Module kurmak istediğimiz için çalıştırmamız gereken komut sadece "Install-Module -Name Posh-Docker"

Posh-Docker isimli Powershell Modulunu kurduktan sonra, hemen bir kontrol gerçekleştirelim. Hızlı bir şekilde yeni bir powershell session açtım ve Get-Module yazarak Posh-Docker modülünü kontrol ediyorum. Yukarıda çalıştırdığımız komut çalıştırılan client üzerindeki tüm kullanıcılara gidecektir. İsterseniz "Install-Module -Name Posh-Docker -Scope CurrentUser" eklediğimiz Scope parametresi ile sadece Cmdlet'i çalıştırdığınız kullanıcının kendi profilin de saklayabilirsiniz. Get-Module cmdlet kullanarka Posh-Docker modulunun yüklenip yüklenmediğini kontrol edebilirsiniz.

Posh-Docker başarıyla yükledikten sonra artık Docker Command Line ( CLI ) içerisindeki tüm komutlara ve parametrelere tab-completion tadını çıkartarak tabiki Powershell üzerinden kolaylıkla erişebilirsiniz. Şunuda unutmayalım ben günlük işlerimde VSCode veya bir console emulator olan CMDER üzeinden Powershell'i kullanmaktayım. Powershell kullandığım sürece, posh-docker benim için tab-completion yapmaya devam edecek, kullanım şekli nasıl eriştiğiniz tamamen size ait.

Hemen bir örnek ile aşağıdaki görelim.

Yukarıdaki kısa bir yapılan örnekte görüldüğü gibi tab-completion kullanımı Docker Command Line kullanımında bize hız ve bazı komutları hatırlamamızda yardımcı olmaktadır. Posh-Docker, Powershell modülüne GitHub sayfasından erişebilirsiniz.

· 3 min read
Hasan Gural

Yazımızın ilk serisinde Azure Resource Manager Template dağıtım modelini ( JSON Template ) kullanırken yaşadığımız zorlukları ve JSON formatının göz yoran zorluklarından bahsetmiştim. Şimdi ise, YAML formatını kullanarak geliştireceğimiz Azure Resource Manager Template arasında farklılıklara bakıp daha sonra geliştirdiğimiz YAML template dosyasını tekrar nasıl JSON formatına kolay bir şekilde nasıl dönüştüreceğimizden bahsedeceğim.

Öncelikle YAML-CLI aracını github üzerinden indirelim ve ne tür parametreler göndererek kullanıldığına bakalım. Bunun için aşağıdaki Powershell Script çalıştırabilirsiniz, Script belirli parametreler almaktadır.

Yukaıdaki script sayesinde gönderdiğimiz parametreler ile YAML-CLI son sürümünü ilgili klasör içerisinde indirdik. Şimdi ise, nasıl kullanıldığına aldığı parametrelere bakalım.

Görüldüğü üzere, YARM-CLI "-input ve -output" adında iki tane parametre alarak gönderdiğiniz YAML veya JSON dosyalarını kendi içerisinde dönüştürmesini sağlayarak Azure Resource Manager Template modeline göre yapmaktadır. Bunun için geliştirdiğiniz YAML formatında Azure Resource Manager Template'ni "-i veya -- input" parametresi ile göndermeniz ve bu YARM-CLI size vereceği JSON dosyasınıda "-o veya –output" olarak belirli bir path gösterek kaydetmesini sağlamanız. Eğer dilerseniz JSON Formatında bir dosyayı input ederek aynı şekilde YAML formatında bir çıktı elde edip aradaki farklılıkları anlayabilirsiniz. Bu işlemi yapmadan önce aşağıdaki JSON ve ARM ile geliştirilen Resource'ların görünüş şekillerine bakalım.

Yukarıdaki resim içerisinde görüldüğü gibi iki farklı formatıda yan yana koydum. Çok basit bir şekilde Resource Template içersinde DNS Zone oluşturmak için gerekli değerler bulunuyor. Bu formatlardan, YAML olan biraz daha okunabilir ve anlaşılabilir olarak gözükmektedir. Şimdi hemen hızlıca bu YAML dosyasının detaylarına inelim, derine baktığımızda aradaki süslü parantezlerin gittiğini ve YAML bize daha kolay bir okunabilir kullanım sağladığını görmekteyiz. Peki, bu YAML dosyasını nasıl elde edebiliriz hemen ona değinelim.

Bunun için YARM-CLI kullanıp "input" parametresine, elimdeki mevcut JSON dosyasını göstermem yeterli olacaktır. Aşağıdaki örnekte beraber bakalım.

YARM-CLI ile çok kolay bir şekilde, JSON template dosyamızı YAML uzantıya dönüştürdük. Artık YAML üzerinden geliştirmeye devam edebilir veya genel hatlarıyla nasıl yazıldığına aşina olabiliriz. Şimdi ise tam tersini yapalımş aşağıda görmekte olduğunuz kompleks bir Resource Template var. Bu Template YAML formatında yazılmış olsun ve biz bunu JSON dönüştürelim. Neden bu işlemi yapmak zorunda olduğumuzu merak ediyor olabilirsiniz, Azure Resource Manager API üzerinden herhangi bir kaynak deploy ettiğiniz zaman bunu JSON template ile göndermeniz lazım. Bunun için Azure Portal üzerinden gösterimini yaptık, aynı şekilde Portal üzerinden, Powershell veya başka hizmetleri kullanarak Deploy başlattığınız zaman bu Resource Template kesinlikle JSON formatında olmalıdır. Bu tarafta dilerseniz YAML ile yazıp JSON dönüştürüp bunu otomatik hale getirebilirsiniz, Fikir vermesi açısından Bkz : Azure DevOps Stage.

Yukarıdaki kısa görüntüde görüldüğü üzere, çok kolay bir şekilde dönüştürme işlemini gerçekleştirdik. Bende YAML tarafında çok fazla vakit geçirdiğim için özellikle Docker Compose file yazarken, Azure Resource Manager Template geçiş yaptığımda canımı sıkan bir konuydu. Son olarak, dilerseniz Visual Studio Code üzerinde buluna "YARMtoJSON" extension kullanarakda bu işlemleri yapabilirsiniz.

· 3 min read
Hasan Gural

Bu yazı serisine başlamadan önce Azure Resource Manager Template Deployment modelini neden ve niçin kullanıldığını çok iyi anlamamız lazım. Bu yüzden blog üzerinde bunun anlatan yazıları yazmıştım, fakat kısa bir hatırlatma yapmak için kısaca tekar üzerinden geçmek istiyorum. Azure Resource Manager'ın Template Deployment özelliği bize sağladığı en büyük özellik, Infrastructure as code kültürüne ayak uydurmamız ve Azure üzerinde hizmet veren kaynakları devamlı kontrol altında tutup, incremental şekilde değişiklik yapmamıza olanak sağlamaktadır. Çok fazla organizasyon Azure Resource Manager – Template Deployment modeline mevcut ortamlarının template geliştirerek deployment süreçlerini CI/CD içerisine dahil etmektedirler, özetle bu bize JSON formatında sunulan ve Azure üzerinde tüm kaynaklarınızın detaylarını bu template içerisine belirterek çok hızlı bir şekilde deploy edip, aynı şekilde değişen bir şey var mı yok mu diye kontrol altına alabiliyorsunuz, biraz daha farklı bir süreçten örnek vermek gerekirse, DEV/TEST ortamların çoğu Resource Manager Template modeline yazılmış ve deploy edilmeye hazır halde bekliyor. Bu template geliştirmenin bir çok yöntemi var, JSON formatında olan bu dağıtım modeli, Visual Studio Code ve Visual Studio aracılığı ile kolayca geliştirilebilir durumdadır. Dilerseniz Mevcut kaynaklarınızın template detaylarını Azure Portal üzerinden export etme şansınıza sahipsiniz, biraz fikir vermesi için aşağıdaki kısa görüntü size açıklayacaklar.

Yukarıda resimde görüldüğü gibi, Azure Resource Manager Template ulaşmanın birkaç yolunu göstermeye çalıştım. Bu iki yöntem ile ve birkaç kaynak ile JSON Template ( Azure Resource Manager Deployment ) nasıl olduğu hakkında birkaç fikriniz olacaktır. Fakat bu konu oldukça derin ve çok büyük kurumlarda bu tarz süreçler, CI/CD kadar bağlanıp Jenkis, Azure DevOps ( VSTS) üzerinden yönetelir hale geldiler, konu sadece JSON Template yazıp onu deploy etmek değil, yazılan template içerisinde gelebilecek parametreler, variable ve function gibi detaylar var. Bunların kontrolünüde Pester adında başka bir open-source araç ile kontrol ediyoruz ki bu çok başka bir konu, başka yazımızda değinmeye çalışırız.

Esas konumuza gelecek olursa, belirli bir süredir Microsoft feedback sayfasında gördüğüm ve gerçekten çok mantıklı ve benim bile hergün kullanmama rağmen aklıma gelmeyen "zihni-sinir" başlıklar yer almakta, eğer teknolojiyi yakın takip ediyorsanız orada yazılan feedbackler gerçekten harika, sizde bir not bırakın derim. Bir süredir, JSON Template okuması zorlayıcı olması, çok fazla süslü parantezler iç içe girmesi bir kısımdan sonra çileye dönüşüyor, çok uzu deployment süreçlerinden bahsediyorum. Ansible kullanan biri olarak YAML formatı gerçekten daha okunaklı ve daha göze yakın duruyor, JSON severler olmaz öyle şey diyebilirler, fakat YAML formatını kullanarak Azure Resource Manager Deployment yapabilsek çokta güzel olmaz mıydı diye düşünürken bir open-source araç keşfetmem ile güzel bir ışık yandı zihnimde.

Özetle, "YAML CLI" adında open-source olan harika tool sayesinde YAML formatında geliştirilen Azure Resource Manager templatelerini nasıl JSON convert edebileceğimizi göreceğiz bu yazı serimizde. Microsoft bunu ne zaman offical olarak destekler/desteklemez bilemiyorum fakat görünüz açısından gözünüzün alışacağından eminim. JSON ile geliştirilen template ile hiçbir farkı olmayıp sadece süslü parantezlerden kurtulduğunuzu hayal edin, yukarıdaki resimde içerisinde zaten anlaşılır ama kompleks deployment modellerinden içinden çıkılmayan bir hal alıyor malasef, evet intellisense diye bir şey var kabul ediyorum fakat YAML ile geliştirmek çok daha kolaylık sağlayacak.

YAML-CLI Github üzerinden erişebileceğiniz ve kullanımı çok kolay bir araçtır. Aşağıda detaylarını görebilirsiniz, yazımızın devamında bu aracı nasıl kullanacağımıza değineceğim.

· One min read
Hasan Gural

For those who seek success even in a little rhythm,

In my personal career life, the only thing that I have cared for was dedication to have continuous achievement in future. Thankfully, I have gotten lots of chances to be awarded in many times but especially today I have acquired Most Valuable Professional award for the second time.

"Success" has always a different definition for me than in dictionaries. It is more extensive and particular than crossing the limits, actualizing expectations or even being awarded. To be successful, this word should appeal to you in a more productive and unique way for past, now and future.

I believe that confidence and passion are the key words for human to achieve their desire in life. Thus, this explains why hard obstacles that we face are not unbroken. I own my progress in this industry to my ambition and will in my notions and aims. But also, achievement enlarges in a good partnership and emphatic co-worker relationship. That’s why I thank warmly to MShowto Technical Community and PeakUp for their support.

World still sings different success stories for seekers.

· 9 min read
Hasan Gural

To make a comprehensive expression for Office 365 Groups' structure, we need to understand what does it comprise also why should it be used by customers. In this article, you will read the description of Office 365 groups step by step. Before starting, we can look over the answer of Christophe Fiessinger, Microsoft Office 365 program manager, to the question "What are the Office 365 Groups ? "

There were a lot of small obstacle in the past. These were creating many delays in the running a project process. Now with Office 365 Groups, we are observing that Office 365 Groups are meeting our user's needs. Because there's no one size that fits all, whether it's managing a project, running a team, a community of interests, or community of practice, we want to delight the users and make people's lives easier.


Office 365 groups are working with Office 365 tools so that it helps you to collaborate with your colleagues for writing or editing documents, scheduling meeting dates, working on projects and sending emails. When an Office 365 group is created, hidden processes in the background will automatically create a workspace for group which that shared workspace is a way to use every each product on team based projects. Groups in Office 365, you can choose whoever you wish to collaborate with, besides it easily creates a collection of resources for those people you want to work together. The general resources such as a shared Outlook inbox, shared calendar or a document library for collaborating on files. Office 365 is providing a shared workspace for emails, conversations, files, calendar events. While you are sending messages in the shared Outlook inbox, all conversations will be stored. There is a dedicated calendar to set dates and a dedicated OneDrive for business storage, which is available for group files or documents


With Office 365, Microsoft follows an approach which based on users. That means there will be a convenience for users to create their own groups. Especially, this convenience will give a permission to administrators for managing some of the group capabilities.

To sum up the difference between private and public office 365 groups extensively, a public group is open to everyone, but a private group has a more individual structure. For instance; if you are in a public group you will be able to visit it, read the content and check out the conversations on the group's page. Also, it is providing a membership to you whenever you want. You can subscribe the group to get mail notifications about group discussions. But on the other hand, as we can understand, a private group is exclusive which is only available for its members. There is a security for its content and conversations, if you are not a member of that private group that means you will be not able to view these informations. A private Office 365 group, without any doubts, will be a good choice for people who have an interest in security or privacy. For being a member of a private group, you must obtain an approval from the group administrator. Also private or public groups can receive emails. Mind you, your group type will be a permanent choice which that means you cannot change the type of your group.

Office 365 groups have several limitations about group members and owners:

• Maximum number of owner in a group is 10 • There can be 250 groups of a user • Office 365 doesn't have a number limitation of members, but there might be a problem about performance limits.

The components of Office 365 groups

Office 365 groups are based on user. That means the users in your organization will be able to create and join. They can even remove themselves from Office 365 groups. This is acceptable for Office 365 groups' creations too. The users can create groups directly from Outlook but also there is a chance to create groups via Microsoft Edge in Office 365. If you want to create Office 365 Groups, you can use other tools Outlook on the web, Outlook Mobile, SharePoint, Planner, Teams and more. Which tool you choose to start from depends on what kind of group you're working with.

While you are creating an Office 365 group, a few things are happening in the background:

• Creation of Azure Directory User is completed. • Creation of a Mailbox is completed. • Creation of an OneDrive for Business page is completed. • Creation of an OneNote Notebook is completed.

The components of The Office 365 groups are a file store and a mailbox store. It can take a long time to create the groups. The reason of that is Office 365 groups have several components. Also groups have interaction with every Office 365 services for instance Outlook, SharePoint, Yammer, Delve and Planner.

How can we create and configure Office 365 groups?

During the groups are based on users, users and administrators will be able to create the groups. Assume that you are a global administrator then you can create groups in Office 365 admin center and there is no necessity to be a member of that Office 365 group for it.

The path that you should follow to create Office 365 group in Office 365 admin center:

• You need to sign in as a global administrator • Visit the Office 365 admin center by using the app launcher • In the left navigation pane, select Groups and then click Groups. • Click Add a group

On the right pane, you have four options for group type: Office 365 group, Distribution list or Security group. Select Office 365 group.

Review the Office 365 options. Type a name, an email address, and a description. Select if the group will be public or private, and then select the language.

• Select the group owner. The group owners are the ones who can manage the group. • Select if group members are subscribed to the group or not subscribed. • Click Add.

Please take a note: If group members are subscribed to your group, they receive all messages and calendar items in their inbox. Perhaps They need some update their Outlook.

How can we edit and configure Office 365 groups?

  1. Sign in to as your company global administrator. 2. Go to the Office 365 admin center by using the app launcher 3. Select Groups in the left navigation pane) 4. Click the group. ( Which groups want to change ) 5. Select one of the options below: Edit Members and Owners. By using this option, you can add and remove members from a group, select a new group owner, or change the status of the group admin. Delete Group. If you do not need the group anymore, delete it. The group, its email conversations, calendar, and documents stored in OneDrive for Business storage will be deleted along with the group. This action cannot be undone.

Please take a note:

Edit Details Action: Sometimes it is necessary to change or update the name of your Office 365 group. This name appears in the address book, on the To: line in the email, as the name of the group. A group description helps your users when they want to decide which groups ours.

What are the ways to experience Office 365 groups?

Conversations and email: • Users can access group conversations either through Outlook or the Outlook Web App Group calendar: • Every member of the group automatically sees meeting invites and other events Files, sharing, and SharePoint document library • A group's SharePoint document library page is the primary place for group files Subscribing to a group: • Subscribing is not enabled by default. Each user can decide to subscribe or not subscribe to a group

Note: If group members are subscribed to a group, they receive all messages and calendar items in their inbox.

During the Office 365 groups are enabled in your hirer, users can access Office 365 groups in all Office 365 services. In their Outlook Web App and OneDrive for Business, Office 365 groups are accessible for users. By the way, Office 365 Planner contains the Office 365 groups and there is a chance to see them in the Outlook 2016 client. Currently, we can say that Office 365 groups are open and discoverable by default. Users can explore the groups with controlling memberships, viewing conservations and files. And then if there are anything interests users, they can join the groups and start attending as a member in groups.

Communication of an Office 365 Group

There are very few more important things than communication to consider for groups. As we have talked about, there is a mailbox for every each group and Outlook or the Outlook Web App is providing accessibility for group conversations to every each user. There are privacy and protection for group conversations. Thus, Office 365 warranting that new member can present and introduce themselves to group content quickly. You can view conversations by their date and also you can share your acclaim for group conversations with your 'like'.

Furthermore, you have the ability to send an email by adding the group name to the To: section of your email. With this, you can send it. If you don't have an Office 365 license or an email address which contains Office 365 hirer, there isn't a chance to be a member of a group as an external user. But you are always able to send emails to a group as an external user for sure.

General Features of Common Calendar

So since every group has a special and dedicated calendar, every member of the groups can automatically see meeting invites and other events. All group calendars can be viewed in Outlook Web App and Outlook. The events that you have created in the group calendar will be added and auto-synchronized with your private calendar. Every group contains its own document libraries within SharePoint team site. We can think the document library of a group as the primary place for group files. Also to add your folders, custom scripts on personal sites feature must be disabled.

Be a Subscriber to a Group

You can be a member of any group and to subscribe it. With subscribing a group, conversations or events of the group will be sent to your inbox. You can join the group conversations with your answers without using any other things. Subscribing is not enabled in normal circumstances. This is users' decision to subscribe to a group or not. Thereby, you can join the groups which most related to you.

· 3 min read
Hasan Gural

Nowadays, I'm greatly passing the time with Visual Studio Code. I'm a huge fan of Visual Studio code. As you know, Azure Cloud Shell was published a years ago by Microsoft. When the Azure Cloud Shell announced a years ago, I had given a webcast. You can watch that webcast on this link. Azure Cloud Shell has been giving a chance to managing your Azure Resources on web-based support shell. It is supporting Bash and Powershell. In this context, you will be able to manage your resource web-based and you do not need to configure PowerShell module and version. In this article, I'm going to share with you useful feature which is Azure Cloud Shell on Visual Studio Code.

As you are developer, you might be using Visual Studio code. Visual Studio Code has an extension features. You will be able to find new features on Market Place for Visual Studio code. This useful feature can give a chance to us accessing Azure Cloud Shell from Visual Studio Code. The Extension name is Azure Account that has a lot of commands like "Azure: Open Bash in Cloud Shell", "Azure: Open PowerShell in Cloud Shell".

Firstlly, Open Visual Studio Code and Click Extension Tab. Write to search area "Azure Account" and click install button. It will take a few minutes for installation. If you have installed this extension, you will be able to use that feature in Visual Studio Code. Now, you should open Access the Command Panel (Shift-Ctrl-P or click View in the toolbar). After that, you will see to search area like below picture.

You should have to decided, Which one is do you want to access? You could access Bash and Azure Cloud Shell. But if you want to access bash, you must install bash for windows. (If you are using Windows 10.) I will show you "Open Powershell in Cloud Shell."

I have clicked to "Open Powershell in Cloud Shell." As you can see, The Visual Studio Code wants from me, Authentication for using Cloud Shell.You should complete authentication process. After you have completed that process, you could see authentication detail in the bottom bar of Visual Studio Code.

I did complete my authentication process. Now, I could see detail in the bottom bar of Visual Studio Code. After, I have clicked "Access the Command Panel (Shift-Ctrl-P or click View in the toolbar)." Then select to "Azure:Open Powershell in Cloud Shell". At the end, we have accessed to our subscription for Azure Cloud Shell within Visual Studio Code. If you are interested in more features, you can use ""Access the Command Panel" with starting this prefix : "Azure".

· 5 min read
Hasan Gural

These days, Lots of people want to use Terraform which is from Hashi Corp. In this article, I'm going to be writing about Terraform and Azure. The Terraform is an open source software. As a tool for building, changing, versioning infrastructure. Terraform within configuration files I can explain to Terraform the components need to run, I could say single application or multiple application. As you know, when you heard Terraform, you suppose it which was working with only Cloud Provider. However, Terraform works with Cloud Providers such as Amazon, Cloudfare DigitalOcean, or Azure etc. also works with On-Premises resources like Vmware. The Main idea is Infrastructure as Code.

Terraform manages different type of components. The components can be low-level or high-level resources. I can give an example of components. As Low-Level Resource "Storage, Network" or As High-Level Resource like "DNS Enter record or change rule on Load Balancer". Moreover, we know all that, we have used different types of tool to deploy resource on Azure. I mean, we have used Azure Resource Manager in the typical case or use Azure Portal or Azure Software Development Kit or maybe REST API something like that. We know, if you've used Amazon Web Services, Amazon Web Services do same. Therefore, DevOps Engineer loves using YAML or JSON so the Problem space is here. The Terraform which is starting to solve this problem has magic tricks. The tool is doing create a common structure or well-known format. That allow developers or DevOps Engineer for get used to the same format. DevOps Engineer will have described their resources and they will use their code on Azure or Azure. Conclusion, it allows people to develop, manage their infrastructure as code. It's enthusing. Briefing for Terraform has completely written in GO.

Firstly, we have need to setup Terraform access to your Azure Services. We have used the shared account in this demonstration. I will demonstrate in Azure CLI.

#Firstly, login to the Azure CLI using:

az login

The Subscription which will be going to demonstration.

az account set --subscription="3b40246b-ffa0-43df-a51e-0c2317b4afc3"

Next, create separate credentials for Terraform.

az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/3b40246b-ffa0-43df-a51e-0c2317b4afc3"

Now you see your AppId, DisplayName, Password, tenant.

Now, I have created Azure Service Principal for managing our Azure Resource with Terraform. The Service Principal will have used by Terraform. After, We are going to use our Service Principal Account because we need to authenticate within Service Principal Account. We have to use those lines for authenticating in Visual Studio Code. The previous picture as you can see our Service Principal Details like AppId, DisplayName, Name, Password. You have learned details in the previous picture our Service Principal Details like App Id, DisplayName, Name, Password. Now, I'm going to authenticate with them.

Now, We are ready to use Terraform. Almost we are done. Let's learn to Terraform. Do not forget, I have created a project in the Visual Studio Code, therefore, I have installed the necessary extension and client application on my computer. I will be trying to create a few resources within Terraform. When I wrote this article, I was using Visual Studio code. If you are interested in this editor, you should be able to check my personal blog. You can check this heading on the web site. "How to use Visual Studio Code".

I have written a few lines in Visual Studio Code before I'm calling Terraform Application for Azure CLI. It is not a complicated process. You must write "Terraform init" for initializing this application. After All, I have called Terraform. Let's see.

Now, I think, We are good to go. I'm going to show you our Terraform structure. As you know, It has a common structure and quite easily. You could see our Terraform structure below.

Now we can push to our code into the Terraform client application. As you can see top of the code block, I have indicated provider to "Azurerm". If you want to change it for your provider, you can have a look this website. I deployed that code block into the Terraform with parameter. The "Apply" parameter will deploy your defined-code on Azure.

provider "azurerm" {

If you want to add your Azure Service Pricipal Account details, you can manifest here.

As you know I did add before.


Create a resource group

Create a resource group

resource "azurerm_resource_group" "network" { name = "terraform-RG" location = "West US" }

Create a virtual network within the resource group

resource "azurerm_virtual_network" "network" { name = "terraform-vNET" address_space = [""] location = "${}" resource_group_name = "${}"

subnet { name = "terraForm-VNET" address_prefix = "" } }

Conclusion, It was successfully when we had deployed our resources on Azure Portal. The best ways for Terraform, DevOps Engineer does not need to focus which one is the best YAML or JSON. I hope so, they will have focused their business.


· 3 min read
Hasan Gural

I did post one years ago "Azure Server Management Tools". The Post explained "How to use Azure Server Management" and it also has three different part. But, I'm willing to give you details for Windows Admin Center. Actually, Microsoft has announced this product "Project Honolulu". But İt has changed to "Windows Admin Center". I'm keen to work with this product because it's working with agentless. Indeed, Windows Admin Center is browser based management your Windows Servers without Azure or Cloud dependency. Also, Windows admin center is the future of remote server management designed to modernize and simplify the IT administrator experience. if you want to perform a management task on a machine there are almost twenty different tools. Perhaps we've consolidated all these tools into a single machine. Maybe we called it "Admin Management Server". We have almost deployed all tools

Windows admin Center think of it as the evolution of traditional inbox management tools like MMC it's great for administrators that need a lightweight management solution for smaller scale deployments or ad hoc management for large scale deployments.

How does Windows Admin Center Work?

Basically, IT Administrator runs in a Web Browsers and manages only these type of VMs.

  • Windows Server 2016
  • Windows Server 2012 R2
  • Windows Server 2012
  • Windows 10

Also, The Windows Admin Centers has particularly roles. These are called to "Web Server" and "Gateway". You can install Windows Admin Center to Windows Server 2016 and Windows 10. As a matter of fact, It is quite beautiful to have a chance to install Windows 10. According to me if you are planning install that services, you should try to Windows Server 2016. I'm going to explain roles.

Gateway : The gateway administers servers by using Remote PowerShell and WMI over Windows Remote Management. Also, The gateway is included with Windows Admin Center in setup package.

Web Server : I could say, The Web Server is included same package with Gateway. In other words, Windows Admin Center in a single basic "msi" package that you can download it.

Let's have a look that picture.

Windows Admin Center defines your management environment

Integration existing solutions, The Admin Center works with Microsoft products like System Center and Azure Operation Management Suite. It gives you "Manage your Infrastructure Single Management Console". In the other hand, Windows Admin Center contains many of the familiar tools you currently use to manage Windows Servers and clients so you don't need lost your time for adaption. In Fact, it is installed easy and you will use familiar functionality to manage your servers like "Microsoft Management Console – MMC". However, if you are implementing your firewall and DNS server, you will be able to access your Windows Admin Center on the Internet. Windows Admin Center has a lot of points of integration with Azure services, including Azure Activity Directory, Azure Backup, Azure Site Recovery, and more.

I'm quite excited to huge features Extensibility for Windows Admin Center. Microsoft and 3rd party developers to build tools and solutions beyond the current offerings. Microsoft offers an SDK that enables developers to build their own tools for Windows Admin Center. If you are excited like me, you can look at this page. Windows Admin Center- SDK

Next Article, I will be writing for "Install Windows Admin Center".