Quantcast
Channel: MSDN Blogs
Viewing all articles
Browse latest Browse all 35736

Windows Azure Startup Tasks

$
0
0

Ovvero, come rendere un’immagine standard di Windows Server usata dai Cloud Services la vostra immagine con tutto ciò che serve al vostro applicativo per funzionare correttamente.

Gli startup tasks vengono eseguiti durante la “preparazione” del vostro Web o Worker Role e trovo illuminante in proposito il blog post di Cory Fowler che spiega quando vengono eseguiti i Task di startup in relazione a tutte le altre operazioni che avvengono durante l’avvio di un ruolo.

Gli startup tasks ci servono perché le immagini di Windows Server 2008 (osFamily=1), Win Server 2008 R2 (osFamily=2) e Win Server 2012 (osFamily=3) sono senza componenti aggiuntivi installati e con impostazioni di configurazione standard.

Un caso reale: se usate il componente MVCMailer con un’applicazione asp.net mvc4, questo contiene ancora un riferimento al runtime di asp.net mvc3. Sul vostro PC funziona correttamente, perché avete entrambi i runtime installati, su un Web Role invece non funziona, perchè ci saranno solo i runtime di MVC4 (inclusi come riferimenti nel vostro progetto e che avranno l’impostazione “Copy Local = True” Sorriso).

Ci sono in rete molti modi estremamente variegati e più o meno eleganti per installare un prerequisito, e quindi ho deciso che anche il mio dovesse essere un po’ diverso dagli altri Sorriso

Per installare il prerequisito:

  • ho messo il file “AspNetMVC3ToolsUpdateSetup.exe” su un Blob storage nello stesso affinity group con il Web Role (per fare in modo che il download avvenga il più rapidamente possibile e per non “ingrassare” il service package)
  • ho reso il container e il blob storage pubblici

Ho creato un file startup.cmd con le seguenti istruzioni:

if "%EMULATED%"=="true" goto :EOF
powershell -executionpolicy unrestricted -file .\download.ps1
%temp%\AspNetMVC3ToolsUpdateSetup.exe /quiet
exit /b 0

La prima riga fa saltare tutte le istruzioni se stiamo testando localmente (vedremo poi nel servicedefinition come impostare la variabile d’ambiente Emulated)

La seconda riga esegue questo script powershell:

function download_from_web($url,$filename){
    $path = $env:TEMP
    "Downloading [$url]`nSaving at [$path]"
    $client = new-object System.Net.WebClient
    $url = $url + $filename
    $path = Join-Path $path $filename
    $client.DownloadFile($url, $path)
    Write-Host "Downloaded " $url " to " $path
}

download_from_web http://myaccount.blob.core.windows.net/mycontainer/"AspNetMVC3ToolsUpdateSetup.exe"

Lo script non fa nient’altro che usare il WebClient di System.Net per scaricare il file dal blob storage alla cartella temp, da dove poi viene eseguito dal file startup.cmd, una volta che Powershell ha finito l’esecuzione.

L’ultima riga “exit /b 0” forza l’uscita dallo startup script comunicando che non ci sono stati errori Sorriso

Per finire, ecco come va impostato il vostro servicedefinition.cscfg. Nel nodo <webrole> create il seguente xml:

<Startup>
  <Task commandLine="startupcmd.cmd &gt; c:\logs\startuptasks.log" executionContext="elevated" taskType="simple">
    <Environment>
      <Variable name="EMULATED">
        <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
      </Variable>
    </Environment>
  </Task>
</Startup>

La parte “Environment” trasmette una variabile d’ambiente al batch startupcmd, recuperandola dalle variabili d’ambiente xPath disponibili per i ruoli di Windows Azure, mentre il task viene eseguito con privilegi di amministratore (executionContext=”elevated”) e “interrompendo” l’avvio del ruolo fino alla sua completa esecuzione (taskType=”simple”).

Ho scelto di salvare l’output dello script di startup in c:\logs, perché è lì che si trovano tutti i log principali delle componenti automatizzate di Windows Azure che configurano il ruolo.

Entrambi i file di testo vanno INCLUSI nella web application (io li ho messi nella root) e per entrambi va definito “Build action=content” e “Copy to output directory=copy always” (nelle proprietà dei file nella solution).

Importante: ho creato i file con Notepad. Se li create con Visual Studio, ricordatevi di salvarli con l’encoding: “Unicode (UTF8 without signature) codepage 65001”, altrimenti non funzionano per come Visual Studio salva di default l’header del file di testo Occhiolino

Ho deciso di tenere questo esempio semplice affinché possiate facilmente personalizzarlo, però potete renderlo molto più sofisticato a vostro piacimento (ad esempio articolando lo script powershell).

Se volete approfondire gli startup tasks, trovate molti link utili a partire da questa pagina: http://msdn.microsoft.com/en-us/library/windowsazure/hh180155.aspx

Per fare debugging degli startup tasks, il modo migliore è provarli prima in Remote Desktop su un’istanza del vostro web role vuota Sorriso

- Vito


Viewing all articles
Browse latest Browse all 35736

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>