Azure Local’ı Azure Arc’a kaydetmek, önceki sürümlere kıyasla daha kolay hale geldi. Standart yöntemde Azure’ Device Code kimlik doğrulaması yapılıyor kayıt işlemi başlatılıyor. Ancak bazı kurumların güvenlik politikaları, yönetilmeyen sunucudan Device Code oturum açılmasına izin vermiyor. Uçtan uca dağıtım otomasyonu hedefleyen ekipler kullanıcı etkileşimine ihtiyaç duymayan yöntem arayabiliyor.
senaryolarda Azure Local’ı Service Principal (SPN), yani uygulama kaydı üzerinden Azure Arc’a kaydetmek mümkün. Aşağıdaki örnekler, işlemin PowerShell nasıl yapılabileceğini sonraki adımların nasıl otomatikleştirilebileceğini gösteriyor.
Ön koşullarİşleme başlamadan önce aşağıdaki gereksinimleri kontrol edin:
- Azure Arc’a bağlanacak Azure Local makineleri 2505 veya sonraki sürümü çalıştırmalı.
- Makinelere ilk kurulum için geçici yönetim ağı bağlantısı sağlanmış olmalı.
- Her Azure Local makinesinin hostname’i (Computer Name) belirlenmiş olmalı.
- SPN’e gerekli Azure izinleri atanmalı. Alternatif olarak, gerekli role assignment’ların önceden yapıldığı resource group kullanılmalı.
- Kullanılacak Azure region, Azure Local için destekleniyor olmalı.
Gerekli izinleri, resource provider’ları desteklenen region’ları işlem öncesinde Microsoft Learn dokümantasyonundan doğrulayın.
Parametreleri tanımlayınAşağıdaki örnekte Azure ortamı, region, resource group, subscription, tenant uygulama kaydı bilgileri değişkenlere atanıyor. SPN secret ise ekrana açık biçimde yazılmadan SecureString olarak alınıyor.
# Azure Details $AzureEnvironment = "AzureCloud" $AzureRegion = "eastus" $AzureResourceGroup = "<MyAzureResourceGroup>" $AzureSubscriptionId = "<MyAzureSubscriptionId>" $AzureTenantId = "<MyAzureTenantId>" $AzureSPNId = "<MyAzureAppRegistrationId>" $AzureSPNSecret = Read-Host -Prompt "Azure SPN Secret" -AsSecureString # Create Credential Objects $AzureSPNCredential = New-Object System.Management.Automation.PSCredential ( $AzureSPNId, $AzureSPNSecret )<MyAzureResourceGroup>, subscription tenant bilgileriyle birlikte <MyAzureAppRegistrationId> değerini kendi ortamınızdaki bilgilerle değiştirin.
Azure’a Service Principal bağlanınKimlik doğrulaması için Connect-AzAccount komutunu Service Principal parametreleriyle çalıştırın:
Connect-AzAccount ` -ServicePrincipal ` -TenantId $AzureTenantId ` -Environment $AzureEnvironment ` -Credential $AzureSPNCredential ` -InformationAction IgnoreKomut başarıyla tamamlandığında, oturum SPN kimliğiyle Azure’a bağlanır.
.Accounts sürümünü token biçimini kontrol edinAzure Local’ın bazı golden image sürümlerinde birden fazla.Accounts modülü bulunabilir. nedenle Connect-AzAccount tarafından yüklenen modül sürümünü dikkate almak gerekir.
Az.Accounts 5.3.0 sonraki sürümlerinde, Get-AzAccessToken komutunun döndürdüğü Token değeri SecureString biçimindedir. Buna karşılık Invoke-AzStackHciArcInitialization komutu, -ArmAccessToken parametresinde String bekler.
Yüklü modül sürümünü görmek için:
Get-Module -Name "Az.Accounts" | Select-Object Name, Version, PathArc initialization komutunun parametrelerini inceleyebilirsiniz:
Get-Command -Name "Invoke-AzStackHciArcInitialization" -SyntaxAşağıdaki örnek, yüklü.Accounts sürümünü kontrol eder token’ı gerektiğinde String biçimine dönüştürür:
$AzAccountsLoaded = Get-Module -Name "Az.Accounts" | Select-Object Name, Version, Path if ([Version]$AzAccountsLoaded.Version -ge [Version]"5.3.0") { $AzureAccessToken = ( Get-AzAccessToken -WarningAction SilentlyContinue ).Token Invoke-AzStackHciArcInitialization ` -SubscriptionID $AzureSubscriptionId ` -ResourceGroup $AzureResourceGroup ` -TenantID $AzureTenantId ` -Region $AzureRegion ` -Cloud $AzureEnvironment ` -ArmAccessToken $( [System.Runtime.InteropServices.Marshal]::PtrToStringAuto( [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR( $AzureAccessToken ) ) ) ` -AccountID ((Get-AzContext).Account.Id) } else { Invoke-AzStackHciArcInitialization ` -SubscriptionID $AzureSubscriptionId ` -ResourceGroup $AzureResourceGroup ` -TenantID $AzureTenantId ` -Region $AzureRegion ` -Cloud $AzureEnvironment ` -ArmAccessToken ( Get-AzAccessToken -WarningAction SilentlyContinue ).Token ` -AccountID ((Get-AzContext).Account.Id) }örnekte SecureString, komuta aktarılırken String biçimine dönüştürülüyor. Token hassas kimlik doğrulama bilgisi olduğundan script çıktısına, log’lara veya komut geçmişine yazdırılmamalı; kullanım süresi erişimi güvenli biçimde yönetilmelidir.
Arc initialization işleminin yeniden başlatma ihtimalini hesaba katınAzure Arc kayıt işlemi sırasında makine, golden image gelen sürümden daha yeni hedef solution version’a geçirilebilir. Böyle durumda node yeniden başlayabilir.
Node yeniden başladıktan sonra yerel administrator hesabıyla tekrar oturum açın; Azure bağlantısını yukarıdaki Arc initialization komutlarını yeniden çalıştırın.
Arc Bootstrap durumunu izleyinAzure Local golden image’larında bulunan Get-ArcBootstrapStatus komutu, Arc Bootstrap işleminin durumunu kontrol etmeye yardımcı. Durumu doğrudan node üzerinde görmek için:
(Get-ArcBootstrapStatus).Responseİşlemi uzaktan izlemek için aşağıdaki gibi döngü kullanılabilir:
# Define variables $OSCredential = Get-Credential ` -Message "Azure Local Administrator OS Credential" $NodeIpAddress = "<NodeIpAddress>" $Stopwatch = [System.Diagnostics.Stopwatch]::StartNew() MonitorArcBootStrapStatus while ($true) { if ($OSSession.State -ne 'Opened') { $OSSession = New-PSSession ` -ComputerName $NodeIpAddress ` -Credential $OSCredential } $ArcBootStrapResponse = Invoke-Command -Session $OSSession { return (Get-ArcBootStrapStatus).Response } $ArcBootStrapStatus = $ArcBootStrapResponse.Status switch ($ArcBootStrapStatus) { 'InProgress' { Write-Host "Arc Bootstrap Status: $($ArcBootStrapStatus) (Sleeping 5 minutes)" Start-Sleep -Seconds 300 } 'Succeeded' { Write-Host "Arc Bootstrap Status: $($ArcBootStrapStatus)" break MonitorArcBootStrapStatus } 'Failed' { Write-Host "Arc Bootstrap Status: $($ArcBootStrapStatus)" throw "Arc Bootstrap Failed - $($ArcBootStrapResponse.Message)" } } if ($Stopwatch.Elapsed.TotalSeconds -gt 1800) { throw "Timeout Exceeded" } }Döngü, durum InProgress olduğu sürece beş dakikada kontrol yapar. İşlem başarılı olduğunda durur; başarısızlık durumunda hata mesajını gösterir. Örnekte 30 dakikalık timeout sınırı bulunur.
Azure Arc machine extension’larını yükleyinNode’lar Azure Arc’a kaydedildikten sonra, Azure Local dağıtımının gerektirdiği Azure Arc machine extension’larının yüklenmesi gerekir. adım için.ConnectedMachine PowerShell modülü kullanılır.
Komutlar, internet erişimi gerekli PowerShell modülleri bulunan ayrı Windows makinesinden çalıştırılabilir. Birden fazla node için aynı işlemi node listesi ForEach döngüsüyle otomatikleştirmek mümkündür.
Aşağıdaki örnek, node üzerindeki başarılı extension sayısını kontrol. Dört başarılı extension varsa kurulum adımını atlar; aksi durumda ilgili Azure REST API çağrısını yapar:
# Node Details $NodeHostname = "<MyNodeHostname>" $AzConnectedMachineExtensions = ( Get-AzConnectedMachineExtension ` -ResourceGroupName $AzureResourceGroup ` -MachineName $NodeHostname | Where-Object { $_.ProvisioningState -eq 'Succeeded' } | Measure-Object ).Count if ($AzConnectedMachineExtensions -ge 4) { Write-Host "Machine Extensions Status - Total $($AzConnectedMachineExtensions) (Skipping Install)" } else { $Response = Invoke-AzRestMethod ` -Method PUT ` -Uri "" ` -Payload (@{ kind = 'HCI' } | ConvertTo-Json) if ($Response.StatusCode -ne 201) { throw "Response '$($Response.StatusCode)' is not 201 (Created) - Aborting - $($Response.Content)" } } Machine extension kurulumunu izleyinKurulumun tamamlandığını doğrulamak için extension’ların toplam sayısı başarılı olanların sayısı belirli aralıklarla kontrol edilebilir:
$Stopwatch = [System.Diagnostics.Stopwatch]::StartNew() while ($true) { $AzConnectedMachineExtensions = Get-AzConnectedMachineExtension ` -ResourceGroupName $AzureResourceGroup ` -MachineName $NodeHostname $AzConnectedMachineExtensionsTotal = ( $AzConnectedMachineExtensions | Measure-Object ).Count $AzConnectedMachineExtensionsSucceeded = ( $AzConnectedMachineExtensions | Where-Object { $_.ProvisioningState -eq 'Succeeded' } | Measure-Object ).Count Write-Host "Machine Extensions Status - Total $($AzConnectedMachineExtensionsTotal) | Succeeded $($AzConnectedMachineExtensionsSucceeded)" if ( $AzConnectedMachineExtensionsTotal -ge 4 -and $AzConnectedMachineExtensionsTotal -eq $AzConnectedMachineExtensionsSucceeded ) { break } if ($Stopwatch.Elapsed.TotalSeconds -gt 900) { throw "Timeout Exceeded" } Start-Sleep -Seconds 30 }örnek, en az dört extension’ın listelendiğini tamamının Succeeded durumuna geçtiğini doğrulamayı bekler. Kurulum 15 dakika içinde tamamlanmazsa timeout hatası üretir.
Sonraki adım: Azure Local dağıtımını başlatınNode’lar Azure Arc’a kaydedilip gerekli machine extension’ları yüklendikten sonra Azure Local dağıtımının sonraki aşamalarına geçilebilir. Dağıtımı Azure portal arayüzüyle sürdürebilir veya uygun otomasyon senaryosunda ARM template kullanabilirsiniz.
SPN tabanlı kayıt; kullanıcı etkileşimini azaltarak tekrarlanabilir dağıtımları kolaylaştırır. Uygulamadan önce SPN izinlerini, desteklenen region’ı, node hazırlık durumunu yüklü PowerShell modülü sürümlerini doğrulamak, sürecin daha sorunsuz ilerlemesine yardımcı.
konuyla ilgili forum tartışmaları- Kullanıcı değişikliği sonrası Azure Devops lisansı ne olur?
- Multi App Kiosk Autologin Sorunu
- Virus Scan Failed
- Intune Win32 uygulaması AzCopy yükleniyor ama 'Committing' aşamasında takılıyor
- Microsoft Azure Ortamında Radius Nasıl Kurulur?
- Lokal DC/AD'yi Microsoft Entrada platformuna taşıma