2012-08-04 12 views
7

Toplu iş dosyalarında bir dizi başlangıç ​​görevim var. Özellikle IIS'yi yapılandırmak için IIS'nin appcmd.exe numaralı telefonunu arıyorum. Azure'daki başlangıç ​​görevleri, bir nedenle rolün yeniden başlatılması durumunda, idempotent (yani, aynı sonuçlarla tekrar tekrar çalıştırılabilen) durumundadır. Ne yazık ki çoğu IIS konfigürasyon komutlarım ikinci kez başarısız olur, örneğin ilk kez bir konfigürasyon düğümünü sildiği için sonraki çalışmalarda mevcut değildir.Başlangıç ​​görevleri nasıl yapılır?

Sorum şu, bu başlangıç ​​görevlerini nasıl idrara çıkarıyorum? Appcmd.exe hataları atmak için bir yol var mı? Kabuğun hataları yakalamasını sağlamanın bir yolu var mı? Azure çerçevesinin hataları görmezden gelmesinin bir yolu var mı?

İşte başlangıç ​​görevlerimin bir örneği. Bu, bir komut dosyasında configiis.cmd bulunur.

@REM Enable IIS compression for application/json MIME type 
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json',enabled='True']" /commit:apphost 
%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/httpCompression /+"dynamicTypes.[mimeType='application/json; charset=utf-8',enabled='True']" /commit:apphost 

@REM Set IIS to automatically start AppPools 
%windir%\system32\inetsrv\appcmd.exe set config -section:applicationPools -applicationPoolDefaults.startMode:AlwaysRunning /commit:apphost 

@REM Set IIS to not shut down idle AppPools 
%windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00 /commit:apphost 

@REM But don't automatically start the AppPools that we don't use, and do shut them down when idle 
%windir%\system32\inetsrv\appcmd.exe set config -section:system.applicationHost/applicationPools "/[name='Classic .NET AppPool'].startMode:OnDemand" "/[name='Classic .NET AppPool'].autoStart:False" "/[name='Classic .NET AppPool'].processModel.idleTimeout:00:01:00" /commit:apphost 
%windir%\system32\inetsrv\appcmd.exe set config -section:system.applicationHost/applicationPools "/[name='ASP.NET v4.0'].startMode:OnDemand" "/[name='ASP.NET v4.0'].autoStart:False" "/[name='ASP.NET v4.0'].processModel.idleTimeout:00:01:00" /commit:apphost 
%windir%\system32\inetsrv\appcmd.exe set config -section:system.applicationHost/applicationPools "/[name='ASP.NET v4.0 Classic'].startMode:OnDemand" "/[name='ASP.NET v4.0 Classic'].autoStart:False" "/[name='ASP.NET v4.0 Classic'].processModel.idleTimeout:00:01:00" /commit:apphost 


@REM remove IIS response headers 
%windir%\system32\inetsrv\appcmd.exe set config /section:httpProtocol /-customHeaders.[name='X-Powered-By'] 
Sen yapılandırma ayarı silmek için denemeden önce mevcut olup olmadığını görmek için kontrol etmesi gerekir
+0

Kullanılmayan AppPools'u otomatik olarak başlatmayı durdurması beklenen satırların çalışmadığından emin olun. 'Klasik .NET AppPool' kullanmak yerine, Clr2ClassicAppPool vb. –

+0

Aslında bu isimler iyi çalışıyor, ama biraz farklı alıntılanması gerekiyordu. Yukarıdaki kodu, birilerinin daha sonra görmesi durumunda güncelledim. –

cevap

4

@ Syntaxc4'ün yanı sıra yanıt: Yerel olarak bir kırıntı (dosya) kullanımını göz önünde bulundurun. Komut dosyanızda, bilinen bir dosyanın varlığını kontrol edin (sizin oluşturduğunuz). Varsa, başlangıç ​​komut dosyanızdan da geçerek bir kırıntı dosyası oluşturun. Bir dahaki sefere vm başlatılır, tekrar ekmek kırıntısı dosyasının varlığını kontrol eder ve eğer varsa, cmd dosyasından çıkar. Ekmek kırıntısı dosyası kaybolursa, bu genellikle vm'nizin başka bir yerde (yeni bir örnek veya yeniden oluşturulmuş örnek olarak farklı donanımlarda) yeniden yapılandırıldığı ve IIS yapılandırmasına ihtiyaç duyulacağı anlamına gelir.

+0

İyi bir fikir gibi görünüyor. Bunu bir .cmd komut dosyasında nasıl uygulayacağınız hakkında bir fikriniz var mı? Sonunda anlayabildiğime eminim, ama daha önce böyle bir şey yapmış olabilirsin. –

+0

Gelecekte bunu okursa, bunu başka bir cevapta uygulamak için kodu ekledim. –

3

(koşullu mantık ekleyin). Bu elde edilebilir:

'appcmd.exe liste yapılandırma -Detaylar' size karşı karşılaştırmak çıkış uzunluğu ya da gerçek değer olsun bir şeyler verecek bir dönüş değeri yakalama

.

2

David Makogon'un önerisine dayanarak, aşağıdaki her .cmd dosyalarının her birine ekledim. Bu hile yapmak gibi görünüyor. Yürütme komut dosyasıyla aynı dizinde bir bayrak dosyası (David'in bir breadcrumb dosyası olarak adlandırdığı) oluşturacak, ardından sonraki işlemlerde bunu denetleyecektir.

@REM A file to flag that this script has already run 
@REM because if we run it twice, it errors out and prevents the Azure role from starting properly 
@REM %~n0 expands to the name of the currently executing file, without the extension 
SET FLAGFILE=c:\%~n0-flag.txt 

IF EXIST "%FLAGFILE%" (
    ECHO %FLAGFILE% exists, exiting startup script 
    exit /B 
) ELSE (
    date /t > %FLAGFILE% 
) 
+0

Bayrak dosyası adına da '% ComputerName%' yazmalısınız! .. yararlı olabilir! – wasatchwizard

+0

Neden bu yararlı olur? –

3

MSDN şimdi APPCMD'den hata kodlarını işleyerek bunu yapmak için mükemmel bir kılavuz içerir.

IF %ERRORLEVEL% EQU 183 DO VERIFY > NUL 

ve herhangi bir kabul edilebilir hata kodunu görmezden:

http://msdn.microsoft.com/en-us/library/windowsazure/hh974418.aspx

Temelde herhangi appcmd işleminden sonra, aşağıdakileri yapabilirsiniz.

+0

Çok hoş. Böyle yapmak için "doğru" yolu olabilir gibi görünüyor. Hata işlemenin çok kötüyse çok kötü. –

+1

MSDN makalesinde bir hata gibi görünüyor - 'IF' komutu, sözdizimi 'IF' komutundan beri aşırıdır: 'IF [/ I] string1 compare-op string2 komutu'. VE DO anahtar sözcüğü yalnızca 'FOR' komutu için geçerlidir. Yani doğru komut şöyle olmalıdır: 'IF% ERRORLEVEL% EQU 183 DOĞRULAMASI> NUL'. Bu, benim için çalıştı, orijinal, rolün her zaman başlamasını engelleyen senaryoyu kırdı. – Vertigo

0

list komutunuzun sonundaki /config:* /xml'u kullanmanızı öneririz. I idempotent nasıl yaptığım hakkında daha fazla bilgi için lütfen bakın: https://github.com/opscode-cookbooks/iis

Şef, birden çok yapılandırma yönetim platformlarından biridir ve yalnızca geçerli ayarları listeleme yoluyla idempotent yapan kod (ruby'de) için bakmayı öneririm ve değiştirmek istedikleri ayarlarla karşılaştırmak.