Niecne zabawy z parametrami konfiguracyjnymi Azure App Service. PowerShell jest znowu naszym przyjacielem.

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:

  1. 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
  2. W procesie DR, kiedy docelowe środowisko powstawało w innym regionie, skrypty służyły do przeniesienia konfiguracji dla wielu AppService jednocześnie.
  3. 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.

Ten wpis został opublikowany w kategorii PowerShell i oznaczony tagami , , , , . Dodaj zakładkę do bezpośredniego odnośnika.