2012/1/18 15:47 | 閱讀數 : 3583 1 人收藏 我要推薦 | | 文章分類: Powershell 訂閱
受到continuous delivery 觀念的灌輸,新的專案都盡量朝向能自動化的建置及部署
因為目前使用TFS 2010 ,專案都是web system,這部分倒是網路上有不少文章可以參考,還算容易建立
只是完成專案的部分之後,接下來就會去想如何讓系統的環境也能自動化的建立,首先想解決的就是IIS的設定
一般來說,我想應該跟大家的作法差不多,就是會有一份文件,描述當要新建系統時,要如何設定IIS。當要轉換環境或是要建立一個新的測試環境時,就照著這份文件完成
當然會遇到的問題也應該多數人差不多
1. 文件未更新,實際環境與文件記錄不相同
2.人為設定可能出錯或遺漏,出問題時又要逐步檢查
因此 讓設定IIS的動作自動化,將這自動建置script本身就視為是一份文件
在說明之前,我的環境是windows server 2008 R2,打算在預設web site (default web site) 下建立一個應用程式,程式碼存放路徑d:\Webapp\MyWeb
1. 建立存放code的 folder
01 | #將code存放在d:\WebApp\MyWebSite,並判斷folder是否存在 |
04 | $folderPath = "d:\WebApp\MyWeb" |
05 | $existPath = Test-Path $folderPath |
07 | if ($existPath -eq $ false ) { |
08 | New-Item $folderPath -ItemType Directory |
10 | $acl = Get-Acl $folderPath |
11 | $ar = New-Object System.Security.AccessControl.FileSystemAccessRule( "network service" , "FullControl" , "ContainerInherit, ObjectInherit" , "None" , "Allow" ) |
12 | $acl.SetAccessRule($ar) |
13 | Set-Acl $acl -path $folderpath |
2. 建立Application Pool
01 | $appPoolName = "My AppPool" |
02 | $app = "iis:\AppPools\" + $appPoolName |
03 | $existAppPool = Test-Path $app |
05 | if ($existAppPool -eq $ false ) { |
06 | $appPool = New-Item $appPoolName |
08 | #Identity --> Network service |
09 | $appPool.ProcessModel.IdentityType = 2 |
12 | $appPool.managedRuntimeVersion = "v4.0" |
15 | $appPool.ManagedPipelineMode = 0 |
18 | $appPool.startMode= "AlwaysRunning" |
這邊要說明一下,這裡用到WebAdministration 模組,因此上述的script執行前,要先import-module WebAdministration
可以參考一下保哥的文章 如何才能在 IIS 7.5 使用 Windows PowerShell Snap-In 功能
$appPool.ProcessModel.IdentityType = 2 指的是Identity用network service,其他意義如下
0 > Local Service
1 > Local System
2 > Network Service
3 > User
4 > ApplicationPoolIdentity
$appPool.managedRuntimeVersion = "v4.0" 指用.net framework 4.0
$appPool.ManagedPipelineMode = 0 指是用 Integrated pipeline mode,1則是class pipeline mode
有些設定的調整,因為沒用到就沒列出來
3. 建立application
01 | $appSitePath = "iis:\sites\Default Web Site\MyWebSite" |
02 | $existWeb = Test-Path $appSitePath |
04 | if ($existWeb -eq $ false ) { |
05 | $folderPath = $folderPath = "d:\WebApp\MyWeb" |
06 | $appPoolName = "My AppPool" |
08 | New-Item $appSitePath -physicalpath $folderPath -type Application |
10 | #設定剛剛建立的application pool |
11 | Set-ItemProperty $appSitePath -name applicationpool -value $appPoolName |
13 | $appSiteShortName = $appSitePath.ToLower().Replace( "iis:\sites\", " ").Replace(" \ ", " /") |
15 | #開啟window authentication |
16 | Set-WebConfigurationProperty -filter /system.webServer/security/authentication/windowsAuthentication -name enabled -value true -PSPath IIS:\ -location $appSiteShortName |
18 | #關閉anonymous authentication |
19 | Set-WebConfigurationProperty -filter /system.webServer/security/authentication/anonymousAuthentication -name enabled -value false -PSPath IIS:\ -location $appSiteShortName |
22 | Remove-WebConfigurationproperty -filter /system.webserver/defaultdocument -name files -PSPath IIS:\ -location $appSiteShortName |
23 | Add-WebConfiguration -filter /system.webserver/defaultdocument/files -atIndex 0 -value @{value = "default.aspx" } -PSPath IIS:\ -location $appSiteShortName |
同樣的語法套用,也可以建立web site
將上述分開的script 整理重構成一份powershell檔案即可成為一份自動化建置IIS web site 的文件
當然日後的變更維護還是要仰賴團隊的紀律,一律以script 建置或修改IIS 設定,如此才能確保實際環境與script的一致性
(之前還想說script run 完之後,看能不能抓下設定完成後的畫面圖片,產生一份輔助的文件,不過 算了……想想就好……)