Azure ortamında test, workshop vb. eğitim ortamları hazırlıyorsanız test kullanıcıları oluşturmak ve bunları otomatik hale getirip manuel iş yükünden kurtulmak istemiş olabilirsiniz.
Bu yazıda, Azure Active Directory üzerinde belli periyotlarda ve belli sayıda kullanıcı ve bunlara ait birer kaynak grubu oluşturma ve her kullanıcıyı kendi kaynak grubu üzerinde yetkilendirerek çalışma alanlarını ayırma işleminden bahsedelim.
Ön gereksinimler
- Aktif bir Azure aboneliği
- Azure Active Directory üzerinde Global Administrator yetkisine sahip bir kullanıcı
PowerShell script’ini oluşturma
Yukarıda bahsettiğimiz adımları tek tek PowerShell script’i kullanarak oluşturacağız. Sonrasında bu script’leri sırası geldiğinde ilgili yerlere parça parça ekleyeceğiz.
1 – Azure bağlantısı yapma (Managed Identity ile)
Azure Portal’e oturum açmış olan Global Administrator yetkisine sahip kullanıcı hesabı ile Azure’da oturum açıldığı bilgisi $AzureContext değişkenine tanımlanır.
# Connect using a Managed Service Identity
$AzureContext = (Connect-AzAccount -Identity).context
2 – Dinamik kullanıcı adı ve şifre belirleme
Kullanıcıları oluştururken her kullanıcı adını, günün tarihini DDMMYYYY formatı eklenerek oluşturacağız ve ayrıca bu kullanıcıların şifrelerini belirlerken günün tarihinin yanına _r@nd0m gibi özel karakterler içeren bir kısım ekleyeceğiz. Kullanıcı bu şifreyle doğrudan portale erişebilir fakat dilersek kullanıcının ilk girişinde bu otomatik oluşturulan şifreyi değiştirebilmesini de sağlayabiliriz. Bir sonraki adımda bundan bahsedeceğiz.
# Get current date
$currentDate = Get-Date -Format "ddMMyyyy"
# Add some characters to date
$passText = $currentDate + "_r@nd0m"
3 – Kullanıcıların oluşturulması
Yukarıda, tarih ve karakter birleşimi olarak oluşturduğumuz ifadeyi güvenli hale getirmek ve kullanıcı oluştururken şifre olarak belirlemek için ConvertTo-SecureString fonksiyonunu kullanıyoruz.
Sonrasında New-AzADUser ile kullanıcıları oluşturacağız. Burada en başta, oluşturacağımız kullanıcı sayısını belirten bir aralık veriyoruz. Bu örnekte 5 tane oluşturacağımız için 1’den 5’e kadar anlamına gelen 1..5 ifadesini başa yazıyoruz. Bu kısmı For döngüsü gibi düşünebilirsiniz. Burada 1, 2, 3, 4, ve 5 rakamları, ifadenin geri kalanında sırasıyla kullanılacak.
Pipe (|) işaretinin sağında % ve süslü parantez ({) kısımlaından sonra New-AzADUser komutu ve kullanıcının Azure ortamında görüntülenen ismi (DisplayName), oluşacak Azure kullanıcısı (UserPrincipalName), yukarıda belirlediğimiz şifre (Password) ve mail takma adı (MailNickName) parametrelerini ve değerlerini yazıyoruz.
Kullanıcı adını belirlerken şu desende oluşturuyoruz: TEST + tarih + 1’den 5’e kadar bir rakam. Rakamı alması gereken yerlerde $_ ifadesini kullanıyoruz. Mesela ilk kullanıcımızın adı şu şekilde olacak:
TEST-07022023-1@xxxxxxx.onmicrosoft.com
Şifresi de 07022023_r@nd0m olacak.
# Set secure string
$secureStrPassword = ConvertTo-SecureString -String $passText -AsPlainText -Force
# Create users
1..5 | % {New-AzADUser -DisplayName "TEST-$currentDate-$_" -UserPrincipalName "TEST-$currentDate-$_@xxxxxxx.onmicrosoft.com" -Password $secureStrPassword -MailNickname "TEST-$currentDate-$_"}
Yukarıda bahsettiğimiz gibi, eğer kullanıcının ilk girişte şifresini değiştirmesini istiyorsak ifadenin sonuna
-ForceChangePasswordNextLogin
parametresinin eklenmesi gerekir. O durumda ilgili satır şu şekilde olmalıdır:
# Create users
1..5 | % {New-AzADUser -DisplayName "TEST-$currentDate-$_" -UserPrincipalName "TEST-$currentDate-$_@xxxxxxx.onmicrosoft.com" -Password $secureStrPassword -MailNickname "TEST-$currentDate-$_"} -ForceChangePasswordNextLogin
4 – Kaynak gruplarının oluşturulması
Kullanıcı oluşturmaya benzer şekilde kaynak gruplarını (resource groups) da oluşturuyoruz. Grup isimleri de kullanıcı isimleriyle aynı olacak.
Bunun için yine günün tarihini DDMMYYYY biçiminde alıp New-AzResourceGroup fonksiyonunun Name parametresinin içine ekliyoruz. Kullanıcı sayısı kadar grup oluşturacağımız için yine ifade yukarıdaki döngü ifadesiyle aynı yazılıyor (1..5 | % […)
# Create Resource Groups
$currentDate = Get-Date -Format "ddMMyyyy"
1..5 | % {New-AzResourceGroup -Name "TEST-$currentDate-$_" -Location "West Europe"}
5 – Her kullanıcıyı kendi kaynak grubunda yetkilendirme
Şimdiye kadar 5 tane kullanıcı ve 5 tane kaynak grubu oluşturduk. Kullanıcılar portale erişim sağlayabilecek ama herhangi bir abonelik ya da nesneyle ilgili yetkilendirilmedikleri için bir şey yapamayacaklar.
Örnek senaryomuzda her kullanıcı, kendine ait olan kaynak grubunda yetkilendirilecek ve giriş yaptığında bu grupta sahip (Owner) yetkisi tanımlı olduğundan bu grup içerisinde diğer Azure servislerini oluşturabilecek. Çalışma ortamı izole olduğundan diğer kaynak gruplarını ya da servisleri göremeyecek.
# Assign users to resource groups
$currentDate = Get-Date -Format "ddMMyyyy"
1..5 | % {New-AzRoleAssignment -SignInName "TEST-$currentDate-$_@xxxxxxx.onmicrosoft.com" -RoleDefinitionName "Owner" -ResourceGroupName "TEST-$currentDate-$_"}
Buradaki ifadede New-AzRoleAssignment fonksiyonuna gönderilen parametreler, daha önce oluşturduğumuz şekilde olacak. Örneğin birinci kullanıcı için;
TEST-07022023-1@xxxxxxx.onmicrosoft.com kullanıcısı TEST-07022023-1 kaynak grubunda Owner olarak yetkilendirilecek.
6 – Kaynak gruplarının silinmesi
Oluşturulan kaynak grupları, günün sonunda silinmek isteniyorsa sırasıyla önce Get-AzResourceGroup, sonrasında da Remove-AzResourceGroup komutlarıyla bu işlem gerçekleştirilir.
# Remove Resource Groups
$currentDate = Get-Date -Format "ddMMyyyy"
1..5 | % {Get-AzResourceGroup -Name "TEST-$currentDate-$_" | Remove-AzResourceGroup -Force}
7 – Kullanıcıların silinmesi
Kaynak grupları silindikten sonra kullanıcılar da benzer şekilde, Remove-AzADUser komutu ile silinebilir. Burada sadece DisplayName parametresi verilmesi yeterlidir.
# Remove users
$currentDate = Get-Date -Format "ddMMyyyy"
1..5 | % {Remove-AzADUser -DisplayName "TEST-$currentDate-$_"}
Azure Automation
Servis oluşturma
Azure Portal’de üst tarafta yer alan arama kutusuna automation yazdığımzda çıkan Automation Accounts‘a ve ardından da açılan sayfadaki Create tuşuna tıklıyoruz.
Kaynak grubu seçimini ve isimlendirmeyi yapıp diğer sekmelerdeki seçenekleri varsayılan değerlerinde bırakıyoruz ve Review + Create butonuna tıklıyoruz.
İşlem tamamlandığında Automation Accounts altında yeni kayıt görüntülenecektir.
Önemli!
Kullanıcı oluşturma (create-users) scriptini çalıştırabilmek için Azure Active Directory > Roles and admninistrators bölümünden User Administrators rolüne automation account’u eklememiz gerekiyor.
Ayrıca Subscription > Access control (IAM) altında da automation account’a Contributor rolü tanımlamamız gerekiyor.
Runbook’ları oluşturma
Oluşturduğumuz account’a tıklayıp açılan sayfada sol taraftaki Runbooks bölümünden Create a runbook‘a tıklayarak yeni bir runbook oluşturacağız.
Name olarak runbook-create-users, Runbook type olarak PowerShell ve Runtime version olarak da 5.1 seçip Create‘e tıklayalım.
Oluşturduğumuz runbook listede görünecektir.
Runbook’a tıklayıp detay sayfasına giriyoruz ve üst taraftaki Edit butonuna tıklıyoruz.
Burada, yukarıda adım adım bahsettiğimiz PowerShell script’lerini, Azure bağlantısı yapıp şifre tanımlayacak ve sonrasında yeni bir kullanıcı oluşturacak şekilde düzenleyip yazıyoruz.
# Connect using a Managed Service Identity
$AzureContext = (Connect-AzAccount -Identity).context
# Get current date
$currentDate = Get-Date -Format "ddMMyyyy"
# Add some characters to date
$passText = $currentDate + "_r@nd0m"
# Set secure string
$secureStrPassword = ConvertTo-SecureString -String $passText -AsPlainText -Force
# Create users
1..5 | % {New-AzADUser -DisplayName "TEST-$currentDate-$_" -UserPrincipalName "TEST-$currentDate-$_@xxxxxxx.onmicrosoft.com" -Password $secureStrPassword -MailNickname "TEST-$currentDate-$_"}
Burada herhangi bir parametre kullanmadığımız için bağlantı kısmını ($AzureContext) ve şifreyi oluşturacak tarih ($currentDate) ve şifrenin son kısmı ($passText) değişkenlerini her runbook’ta kullanacağız. Save diyerek runbook’u kaydedelim.
Script’i test etme
Yazdığımız script’i test etmek için üst taraftaki Test pane butonuna tıklayalım.
Start’a tıklayıp test işlemini balşatalım. Herhangi bir hata olmaması gerekiyor. 🙂 Başarılı bir şekilde tamamlandığında Completed yazısını görmemiz gerekiyor.
Test penceresini kapatıp sırasıyla önce Save‘e sonra da Publish‘e basıp runbook’u kaydediyoruz. Yukarıda kaydettiğimiz için Save butonu aktif olmayabilir. O durumda sadece Publish‘e tıklamak yeterli olacaktır.
Yukarıda runbook’u test için çalıştırdık. Son durumda, runbook publish edildikten sonra runbook ana sayfasında Start’a tıklayarak güncel sürümünü çalıştırabiliriz.
Ayrıca View‘e tıklayarak runbook içeriğini görebiliriz. Edit moduna girmediğimiz için tekrar kaydetmek ve publish etmeye gerek kalmaz.
Kullanıcı oluşturmayı tamamladık. Sonraki adımlar şu şekilde olacak:
- Kaynak grubu oluşturma
- Kullanıcıları kendi kaynak grubunda yetkilendirme
- Kaynak gruplarını silme
- Kullanıcıları silme
Bu runbook’ların oluşturulması aşamasını detaylı anlatmak yerine, runbook isimleri ve içindeki script’leri aşağıda kısaca yazmak daha iyi olacak. Bütün adımlar yukarıda anlattığımız şekilde olacak, başka hiçbir fark yok.
runbook-create-resource-groups
# Connect using a Managed Service Identity
$AzureContext = (Connect-AzAccount -Identity).context
# Get current date
$currentDate = Get-Date -Format "ddMMyyyy"
# Create Resource Groups
1..5 | % {New-AzResourceGroup -Name "TEST-$currentDate-$_" -Location "West Europe"}
runbook-assign-users-to-resource-groups
# Connect using a Managed Service Identity
$AzureContext = (Connect-AzAccount -Identity).context
# Get current date
$currentDate = Get-Date -Format "ddMMyyyy"
# Assign users to resource groups
1..5 | % {New-AzRoleAssignment -SignInName "TEST-$currentDate-$_@xxxxxxx.onmicrosoft.com" -RoleDefinitionName "Contributor" -ResourceGroupName "TEST-$currentDate-$_"}
runbook-remove-resource-groups
# Connect using a Managed Service Identity
$AzureContext = (Connect-AzAccount -Identity).context
# Get current date
$currentDate = Get-Date -Format "ddMMyyyy"
# Remove Resource Groups
1..5 | % {Get-AzResourceGroup -Name "TEST-$currentDate-$_" | Remove-AzResourceGroup -Force}
runbook-remove-users
# Connect using a Managed Service Identity
$AzureContext = (Connect-AzAccount -Identity).context
# Get current date
$currentDate = Get-Date -Format "ddMMyyyy"
# Remove users
1..5 | % {Remove-AzADUser -DisplayName "TEST-$currentDate-$_"}
Bu örneğe ek olarak şöyle bir adım da ekleyelim: Oluşturulan kaynak grubu içine örneğin bir Databricks workspace de ekleyelim. Kullanıcılar portae giriş yaptıklarında kendi kaynak grupları içinde Databricks servisini de görebilsinler. Databricks yerine tabii ki istenilen Azure servisinin Powershell scriptleri eklenerek o servislerin de oluşturulması sağlanabilir.
runbook-create-databricks-workspace
$currentDate = Get-Date -Format "ddMMyyyy"
1..5 | % {New-AzDatabricksWorkspace -Name "TEST-$currentDate-$_" -ResourceGroupName "TEST-$currentDate-$_" -Location westeurope -ManagedResourceGroupName "databricks-group-TEST-$currentDate-$_" -Sku standard}
Runbook’larımızı oluşturduk. Şimdi bunları, belli sırayla çalışacak halde mantıklı akışlar haline getirelim. Bunun için yine runbook oluşturacağız ama runbook tipini PowerShell olarak değil, Graphical PowerShell olarak seçeceğiz. İki ana akışımız olacak: Create ve Remove. Bunları sırasıyla oluşturalım.
Create akışı
Runbook ana sayfasında Create a runbook‘a tıklayarak yeni runbook oluşturma ekranına gelelim. Name olarak runbook-create, Runbook type olarak Graphical PowerShell ve Runtime version olarak da 5.1 seçerek Create diyelim.
Runbook’u açıp sol taraftaki RUNBOOKS > All menüsü altında ilk runbook’umuz olan runbook-create-users‘ın yanındaki üç noktaya tıklayıp Add to canvas‘ı seçelim.
Runbook grafik akış ekranına eklenecektir. Aynı ekleme adımlarını sırasıyla aşağıdaki runbook’lar için de yapalım:
- runbook-create-user-groups
- runbook-assign-users-to-resource-groups
- runbook-create-databricks-workspace
Hepsini ekledikten sonra görünüm aşağıdaki gibi olmalıdır:
Remove akışı
Runbook ana sayfasında Create a runbook‘a tıklayarak yeni runbook oluşturma ekranına gelelim. Name olarak runbook-remove, Runbook type olarak Graphical PowerShell ve Runtime version olarak da 5.1 seçerek Create diyelim.
Runbook’u açıp sol taraftaki RUNBOOKS > All menüsü altında sırasıyla aşağıdaki runbook’ların yanındaki üç noktaya tıklayıp Add to canvas‘ı seçelim.
- runbook-remove-resource-groups
- runbook-remove-users
Son durumun görüntüsü aşağıdaki gibi olmalı:
Ek olarak kaynak grubu içindeki kaynakları silmemize gerek olmadan, sadece kaynak grubunu silerek bu işlemi yapabiliyoruz.
Çalışma zamanını ayarlama (Schedule)
Akışları oluşturduktan sonra her gün otomatik olarak çalışmaları için çalışma zamanlarını ayarlamamız gerekiyor.
runbook-create akışı ana sayfasında sol kısımda Schedules‘a ardından üst taraftaki Add a schedule‘a tıklayalım.
Açılan ekranda önce Link a schedule to your runbook‘a sonra gelen ekranda da yine Add a schedule‘a tıklıyoruz.
New Schedule penceresinde aşağıdaki değerler girilerek her gün 10’da çalışacak şekilde ayarlıyoruz:
- Name: trg-create-1
- Starts: 10:00 AM (tarih kısmı aktifleştirildiği tarihi gösterir. Varsayılan bırakılabilir.)
- Time zone: Turkey – Turkey Time
- Recurrence: Recurring
- Recur every: 1 – Day
- Set expiration: No
Aynı işlemi runbook-remove kaışı için, trg-remove adında bir başka schedule oluşturmak için de yapmamız gerekiyor. Aynı adımlar olduğu için tekrar yazmamıza gerek yok.
Azure Active Directory üzerinde kullanıcıları kontrol etme
Sonuçları kontrol etmek için akışı manuel çalıştırabilir ya da çalışma zamanında otomatik olarak çalışmasını bekleyebiliriz. Şimdilik runbook-create sayfasında Start’a tıklayarak manuel çalıştıralım. Çalışma tamamlandığında Azure Active Directory ekranında Users bölümünde kullanıcıları ve Resource Groups altında yeni oluşturulan kaynak gruplarını görmemiz gerekiyor.
Azure Active Directory > Users > All users
Resource Groups
Bu şekilde PowerShell script’leriyle otomatik yapılacak işlemleri Azure Automation servisi üzerinden oluşturup tetikleyebilirsiniz.
Azure PowerShell dokümantasyonuna aşağıdaki bağlantıdan ulaşabilirsiniz: