Witam wszystkich.
Mam problem z usługą Cloud Service na Azure. Mam następujące zadanie: (uproszczę dla jasności) - założyć usługę Cloud Service z jedną WebRole, która ma mieć od razu zainstalowany .NET Frmeworka 4.6.1 (domyślnie na obecną chwilę Cloud Service przychodzi z wersją 4.5). Z założenia skrypt instalacyjny ma być wykonany w PowerShell - plik cmd mam być użyty tylko do odpalenia skryptu PowerShell (absolutna konieczność).
Założyłem sobie, że PS ściągnie sobie instalator do konkretnego folderu, a następnie, uruchomi instalator i to wszystko.
Co robię:
- W Azure Portal zakładam usługę CloudService.
- W Visual Studio zakładam nowy projekt CloudService z jedną WebRolą (z pustą aplikacją webową) nazwaną TestWebRole.
- W Visual Studio - w projekcie CloudService - Roles - TestWebRole - zakładam folder "bin" i w nim umieszczam dwa pliki ze skryptami: install.cmd i installDotNet.ps1 (listingi poniżej).
- W pliku ServiceDefinition.csdef w nodzie WebRole name="TestWebRole" umieszczam następujący wpis:
<Startup> <Task commandLine="install.cmd" executionContext="elevated" taskType="simple"> </Task> </Startup>
Teraz listingi skryptów:
install.cmd
REM Run an unsigned PowerShell script and log the output PowerShell -ExecutionPolicy Unrestricted .\installDotNet.ps1 >> "%TEMP%\StartupLog.txt" 2>&1 type "%TEMP%\StartupLog.txt" REM If an error occurred, return the errorlevel. EXIT /B %errorlevel%
installDotNet.ps1
$TempFolder = "C:\DOWNLOADED_APPLICATIONS" if(!(test-path $TempFolder)) { New-Item -path $TempFolder -type directory} Write-Host "" Write-Host "Downloading .NET framework v4.0 installation package" -ForegroundColor Yellow; $src = "https://download.microsoft.com/download/E/4/1/E4173890-A24A-4936-9FC9-AF930FE3FA40/NDP461-KB3102436-x86-x64-AllOS-ENU.exe" $dest = "$TempFolder" + "\" + "NDP461-KB3102436-x86-x64-AllOS-ENU.exe" $wc = New-Object System.Net.WebClient $wc.DownloadFile($src, $dest) $args = " /q" Write-Host "Installing .NET framework v4.6.1" -ForegroundColor Yellow; Start-Process -FilePath $dest -ArgumentList $args -Wait
W skrócie, cmd odpala skrypt powershellowy i wrzuca jego outputy do jakiegoś tam pliku StartupLog.txt.
Tymczasem odpalony PowerShell, zakłada katalog DOWNLOADED_APPLICATIONS w katalogu C virtualki CloudService, ściąga paczkę instalacyjną i uruchamia ją.
Teraz publikuję paczkę - publish z VS. Cała operacja kończy się sukcesem. Łączę się z maszyną przez RDP. Sprawdzam który .NET jest zainstalowany wg instrukcji:
https://msdn.microsoft.com/pl-pl/library/hh925568(v=vs.110).aspx
I okazuje się, że jest stary 4.5. ALE: Folder DOWNLOADED_APPLICATIONS jest utworzony i paczka instalatora jest ściągnięta.
Natomiast, jeżeli wezmę i wejdę na docelową maszynę CloudService RDP - odpalę powyższy skrypt np: z PS ISE (albo z linii komend PS), to calutka operacja Założenia Folderu -> ściągnięcia paczki -> instalacji przebiega bez żadnego problemu.
Czemu nie działa to przez Taska na Startupie? Pomocy.