Kategorie szkoleń | Egzaminy | Kontakt
  • 3
  • 1
  • 23

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ę:

  1. W Azure Portal zakładam usługę CloudService.
  2. W Visual Studio zakładam nowy projekt CloudService z jedną WebRolą (z pustą aplikacją webową) nazwaną TestWebRole.
  3. 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).
  4. 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.

adamslosarczyk
  • Zapytał
  • @ adamslosarczyk | 19.11.2016
    • 3
    • 0
    • 2
Zaloguj się aby zadać pytanie
Pokrewne

Odpowiedzi (3)

  • 0

1. Zastanawiam się, czy ściągnięty plik nie jest blokowany bo pochodzi z internetu (i trzeba dać na nim unblock).

2. Na Cloud Services (po połączeniu RDP) można go zainstalować (po wykonaniu tego skryptu)?

3. A jakiś test z innym plikiem wykonywalnym czy się uruchomi?

  • Odpowiedział
  • @ | 29.01.2017
  • TRENER ALTKOM AKADEMII
  • 0

Witam.

Na początku, dzięki za zainteresowanie, mój post już jest trochę odleżany.

jeśli chodzi o punkty:

ad 1: nie sądzę, bo plik nie pochodzi z netu per se: owszem ściągam go z sieci ale odpalenie jest już z lokalnego dysku - mogę rzucić okiem, ale raczej wyeliminowałbym tą ewentualność.

ad 2:  Oczywiście że tak. Tak jak piszę w ostatnim akapicie.

ad 3: Mogę spróbować, ale potrzebuję akurat tego.

Co ciekawe scenariusz przedstawiony tu:

https://docs.microsoft.com/en-us/azure/cloud-services/cloud-services-dotnet-install-dotnet

Czyli z użyciem zwykłego .cmd działa.

Natomiast ja chcę przez PowerShella więc zagadka dalej czeka na rozwiązanie. 

adamslosarczyk
  • Odpowiedział
  • @ adamslosarczyk | 29.01.2017
    • 3
    • 0
    • 2
  • 0

Ja zawsze per .cmd robiłem i akurat nie .net a TOMCAT i właśnie tą metodą.

Kiedyś miałem z tym problem, ale jak ze skryptu robiłem nową domenę, podłączałem kompa pod domenę i instalowałem MSSQL - tutaj rozwiązanie:

https://github.com/MariuszFerdyn/azure-quickstart-templates/blob/master/active-directory-new-domain-sql/skrypt.ps1

Lub cały template ARM:

https://github.com/MariuszFerdyn/azure-quickstart-templates/tree/master/active-directory-new-domain-sql

Tylko trzeba uaktualnić do bieżącej wersji ARMa.

A clue to linijka:

Invoke-Command -Computername AdSQL -Credential $credential -Authentication CredSSP -ScriptBlock { start-process -wait -Verb RunAs -ArgumentList '/Q /IACCEPTSQLSERVERLICENSETERMS /ACTION=install /FEATURES=SQL,Tools /INSTANCENAME=MSSQLSERVER /SQLSVCACCOUNT="adarmtest\adSQL" /SQLSVCPASSWORD="Pa##w0rd" /SQLSYSADMINACCOUNTS="adarmtest\adAdministrator" /UpdateEnabled=0' C:\programy\SQLEXPRADV_x64_ENU.exe}

 

 

  • Odpowiedział
  • @ | 29.01.2017
  • TRENER ALTKOM AKADEMII