Cześć. Dziś będzie krótko, treściwie i będzie kod. Choć dla niektórych PowerShell kodem jeszcze nie jest:) Azure App Service czy Azure App Service Environment to usługi, o których już kilka razy pisałem na tym blogu oraz na blogu MSDN więc wybacz, że wprowadzenia nie będzie. Jeśli go potrzebujesz, rzuć okiem na to video. To, co bardzo lubię w App Service to Application Settings. Wraz z koncepcją slotów bardzo ułatwiają pracę ale mają taką wadę, że… nie możesz ich ustawić w ramach skryptu ARM więc czas na zabawę z PowerShell.
Mój przykładowy AppService poniżej ma raptem jedno i to zresztą domyśle ustawienie. Mam jednak kilka takich wdrożeń, że tych ustawień jest ponad 40 per aplikacja i to nie jest nasze ostatnie słowo.
Napisałem dwa proste skrypty:
- jeden pobiera wszystkie ustawienia z AppService i wrzuca je w sposób sformatowany do pliku CSV. Co więcej, pobiera je ze wszystkich AppService w ramach wskazanej grupy zasobów. Łatwo je przerobić, by pobierał te parametry dla konkretnego AppService.
- drugi natomiast potrafi czytać z tego pliku i ustawić te parametry dla wszystkich AppService w grupie zasobów (skrypt wybiera AppService po nazwie)
Wzorowałem się na komendach z oficjalnej dokumentacji Azure App Service https://docs.microsoft.com/en-us/azure/app-service-web/app-service-web-app-azure-resource-manager-powershell
Zapytasz… ale PO CI TO W OGÓLE POTRZEBNE? Potencjalnych zastosowań może być wiele, kilka z których skorzystałem:
- Nim dobrze używaliśmy slotów do przenoszenia się pomiędzy typami środowiska w czasie pisania aplikacji, używaliśmy tych skryptów do kopiowania konfiguracji pomiędzy różnymi AppService
- W procesie DR, kiedy docelowe środowisko powstawało w innym regionie, skrypty służyły do przeniesienia konfiguracji dla wielu AppService jednocześnie.
- Kiedy pracowaliśmy nad automatyzacją procesu tworzenia środowisk pod aplikację z bazową konfiguracją, skrypty były częścią procesu wdrożenia
To moje zastosowania, pewnie znajdziesz inne. Najpierw więc pobierzemy parametry aplikacji do pliku.
#Zaloguj się do Azure #Login-AzureRmAccount #Wybierz swoją subskrypcję $subid ='wstaw tu ID swojej subskrypcji' Select-AzureRmSubscription -SubscriptionId $subid $resGroupPrd = 'tu wstaw nazwę grupy zasobów, gdzie są Twoje App Service' $webApps = Get-AzureRmWebApp -ResourceGroupName $resGroupPrd $date = Get-Date -Format g $stream = [System.IO.StreamWriter] "c:\temp\appconfig.csv" #Ja zapisuję takie parametry w pliku jak nazwa grupy zasobów, nazwa AppService, lokalizacja, nazwa parametru oraz wartość $stream.WriteLine("ResGroupName|AppName|Location|ParamName|ParamValue") foreach ($app in $webApps) { $appName=$app.Name $appData=Get-AzureRmWebApp -ResourceGroupName $resGroupPrd -Name $appName #Take all the settings from the App $appSetttings = $appData.SiteConfig.AppSettings $appLocation = $appData.Location foreach ($appSetting in $appSetttings){ $s= $resGroupPrd +"|"+$appName +"|"+ $appLocation +"|" +$appSetting.Name +"|"+ $appSetting.Value $stream.WriteLine($s) } } $stream.Close()
A teraz, ustawmy te pobrane parametry dla innych aplikacji w ramach wskazanej grupy zasobów.
#Login-AzureRmAccount #Select subscription $subid ='wstaw tu ID swojej subskrypcji' Select-AzureRmSubscription -SubscriptionId $subid $resGroupPrd = ' tu wstaw nazwę grupy zasobów, gdzie są Twoje App Service' $reader = [System.IO.File]::OpenText('c:\temp\appconfig.csv') $settings = @{} $appSettings = @{} $appNameOld='' $firstLine=$reader.ReadLine() while($null -ne ($line = $reader.ReadLine())) { $lineInArray=$line.Split('{|}') #ResGroupName|AppName|Location|ParamName|ParamValue $webApp=$lineInArray[0] $appName = $lineInArray[1] $location = $lineInArray[2] $paramName = $lineInArray[3] $paramValue = $lineInArray[4] if ($appSettings.ContainsKey($appName) -eq $true) { $settings[$paramName]=$paramValue } else { if ($appNameOld -ne ''){ Write-Host 'Params will be set for the app:' $appNameOld Write-Host 'All params:' $settings $webAppWithSettings = Set-AzureRmWebApp -Name $appNameOld -ResourceGroupName $resGroupPrd -AppSettings $settings Write-Host } $appSettings[$appName]=@{} $settings=@{} $settings[$paramName]=$paramValue } $appNameOld=$appName } Write-Host 'Params will be set for the app:' $appNameOld Write-Host 'All params:' $settings $webAppWithSettings = Set-AzureRmWebApp -Name $appNameOld -ResourceGroupName $resGroupPrd -AppSettings $settings
Kolega Kacper Mucha na pewno uczyni te skrypty lepszymi ale w tej surowej postaci mogę nieco Ci pomóc zautomatyzować pracę z Azure App Service.