onsdag 23. mars 2011 Ruby IronRuby IIS
Det er ikke ofte det går en hel måned mellom hver gang jeg blogger. Men den siste tiden har jeg slitt endel med nakkesmerter, så noe har desverre måttet vike. Energien er på vei tilbake, og jeg satser på å komme igang igjen med å blogge om PingLang og DSLer snart.
Men for å starte litt forsiktig kommer det her en liten blogpost om å automatisere konfigurering av Internet Information Server ved hjelp av IronRuby.
Jeg fikk nemlig nettopp behov for å laget et script som kunne endre den fysiske stien til en website i IIS. Vi har to ulike sites, la oss kalle dem thesite.com og thesite-staging.com. Den første adressen er produksjonsadressen, den andre bruker vi til testing.
På serveren har vi så to ulike, fysiske lokasjoner for disse sitene. Stiene kan for eksempel være c:\sites\thesite-blue\ og c:\sites\thesite-green\. Til enhver tid inneholder én av disse produksjonskoden, og den andre folderen brukes til å teste neste versjon. Når den nye vesjonen er godkjent bytter vi om de fysiske stiene til thesite.com og thesite-staging.com, slik at thesite.com nå inneholder den nye versjonen.
Dette kalles blue-green deployment.
For å kunne programmere slike ting kommer IIS med en assembly som heter Microsoft.Web.Administration – du finner den under katalogen Windows\System32\inetsrv.
The different logical objects available include sites, applications, application pools, application domains, virtual directories, and worker processes. You can use the API to obtain and work with the configuration and state of these objects and to perform such actions as creating a site, starting or stopping a site, deleting an application pool, recycling an application pool, and even unloading application domains.
Du kan bruke den i C#, fra PowerShell, eller hvilket som helst språk som kan kjøre på .net-plattformen. Jeg foretrekker IronRuby til denne typen oppgaver. Her er et script (et noe enklere script enn det jeg faktisk bruker) som henter ut den virtuelle katalogen til to IIS-sites og bytter fysisk sti mellom dem:
10 require 'c:\\Windows\\System32\\inetsrv\\Microsoft.Web.Administration.dll' 11 include Microsoft::Web::Administration 12 13 # Monkey patch ServerManager: 14 # add get_vdir method to get the main virtual dir 15 class ServerManager 16 def get_vdir site 17 self. 18 sites[site]. 19 applications['/']. 20 virtual_directories. 21 find {|vdir| vdir.path == '/'} 22 end 23 end 24 25 server = ServerManager.new 26 27 a = server.get_vdir 'thesite.com' 28 b = server.get_vdir 'thesite-staging.com' 29 30 # Swapping to variables in Ruby is easy.. 31 a.physical_path, b.physical_path = b.physical_path, a.physical_path 32 33 server.commit_changes 34 server.dispose
Vanskeligere er det ikke!