iT邦幫忙

0

使用bat檔進行主機環境佈署

cmd
  • 分享至 

  • xImage
  •  

工作中經常會遇到需要在客戶端主機架站的情況,
如果客戶端只有一台主機,手動佈署或許不會花太多時間,
但若同時會有多台主機運行,可能就必須花上一整天,甚至好幾天的時間,
重複進行安裝軟體、調整系統參數這些瑣碎的動作,
不僅浪費掉許多時間,手動佈署站台主機也可能會有部分作業漏做的風險。

這時候可以寫一個bat檔,讓主機自動執行需要執行的動作,
這樣做的優點是:

  1. 執行bat檔後可以放著讓它跑,最後再去確認執行結果是否正確即可,相對省時
  2. 減少人工執行出錯的風險
  3. 任何人執行bat檔跑出的結果都是一樣的,不需要侷限於資訊人員去進行

以下用一個簡單的範例說明如何包出一個環境佈署用的bat檔。

範例說明

本篇範例想要做到的項目如下:

  1. 在主機C:\底下建立站台目錄Web
  2. 將檔案A.txt、schedule.bat複製到主機的C:\Web底下
  3. 安裝Notepad++
  4. 開啟IIS服務
  5. 完成IIS相關設定(建立應用程式集區、建立應用程式目錄)
  6. 設定hosts
  7. 設定每日排程,於每日23:30重啟IIS

0. 參數設定

在開始之前,先準備好需要的軟體安裝檔,以及要複製到主機的檔案A.txt,
另外,我們通常都會希望這個bat檔可以重複使用,
所以首先需要宣告在不同的情況下,可能會變動的參數。
使用文字編輯器開啟一份新文件,先另存檔案為install.bat,接著填入以下參數:

::站台根目錄
set "WebPath=C:\Web"
::設定傳輸協定
set "Protocol=http"
::設定DOMAIN
set "DomainName=test.com.tw"
::設定WEB DOMAIN
set "WebUrl=%Protocol%:\\%DomainName%"

接下來依照想要做到的項目順序,將動作轉為cmd指令。

1. 在主機C:\底下建立站台根目錄Web

前面已經將站台根目錄設定為參數了,在參數前後加上"%參數%",該指令就可以使用參數值。

md "%WebPath%

2. 將檔案A.txt、schedule.bat複製到主機的C:\Web底下

搬移檔案前,先確保目前所在目錄是我們準備的A.txt及schedule.bat存放的目錄。

cd /D %~dp0

接著再把這兩個檔案放到C:\Web下,
其中,執行XCOPY時,如果目的地的檔案或資料夾不存在,
會要求我們選擇複製到目的地的是檔案或是資料夾,
這會中斷bat檔的執行,因此在XCOPY前先設定F參數,預先指定複製到目的地的是一個檔案,
結尾的/Y參數則代表不跳出是否要覆寫已存在的目的地檔案的提示。

echo F |XCOPY "A.txt" "%WebPath%\A.txt" /Y
echo F |XCOPY "schedule.bat" "%WebPath%\schedule.bat" /Y

若要複製到主機的是一個資料夾,在XCOPY前可以設定參數D,指定複製到目的地的是資料夾。

echo D |XCOPY "testDirectory" "%WebPath%\testDirectory" /Y

3. 安裝Notepad++

為了不中斷bat檔的執行,使用/S參數設定Notepad++在安靜模式下安裝。

npp.8.3.3.Installer.x64.exe /S

4. 開啟IIS功能

由於要批次開啟多個Windows功能,這裡另外使用一個powershell檔InstallIIS.ps1
新增一個新文件,先另存檔案為InstallIIS.ps1後,編寫以下指令:

#以系統管理員身分執行powershell
param([switch]$Elevated)

function Test-Admin {
    $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
    $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}

if ((Test-Admin) -eq $false)  {
    if ($elevated) {
        # tried to elevate, did not work, aborting
    } else {
        Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
    }
    exit
}

#根據需求開啟WINDOWS功能
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerRole -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServer -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-CommonHttpFeatures -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpErrors -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ApplicationDevelopment -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-NetFxExtensibility45 -ALL
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HealthAndDiagnostics -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpLogging -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-LoggingLibraries -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-RequestMonitor -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpTracing -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-Security -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-RequestFiltering -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-Performance -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerManagementTools -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-StaticContent -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-DefaultDocument -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-DirectoryBrowsing -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebSockets -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ApplicationInit -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ASPNET45 -ALL
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ISAPIExtensions -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ISAPIFilter -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpCompressionStatic -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ManagementConsole -All

接著回到install.bat補上使用PowerShell執行InstallIIS.ps1的指令。

PowerShell.exe -ExecutionPolicy UnRestricted -File InstallIIS.ps1

5. 完成IIS相關設定(建立應用程式集區、建立應用程式目錄)

::=====建立應用程式集區=====
::建立應用程式集區TEST,並設定啟動模式為AlwaysRunning
%windir%\System32\inetsrv\APPCMD ADD APPPOOL /name:TEST /managedRuntimeVersion:"v4.0" /startMode:AlwaysRunning   

::=====建立應用程式目錄=====
::變更IIS根目錄為C:\Web,應用程式集區為TEST
%windir%\System32\inetsrv\APPCMD SET SITE /site.name:"Default Web Site" /[path='/'].applicationPool:TEST -[path='/'].[path='/'].physicalPath:"%WebPath%" -[path='/'].preloadEnabled:true

6. 設定hosts

把站台的DomainName mapping到本機localhost。

find /i "%DomainName%" %WINDIR%\system32\drivers\etc\hosts
if /i not %DomainName%==localhost (
	if /i not %DomainName%==127.0.0.1 (
		IF %errorlevel% equ 1 (
		    echo. >> %WINDIR%\system32\drivers\etc\hosts & echo 127.0.0.1 %DomainName% >> %WINDIR%\System32\drivers\etc\hosts
		)
	)
)

7. 設定每日排程,於每日23:30重啟IIS

步驟2提到要將schedule.bat搬移到C:\Web底下,這一個schedule.bat為執行排程的指令檔,
schedule.bat裡面編寫的是IIS Restart的指令:

iisreset /restart

回到install.bat中編寫執行排程的指令:

schtasks /Create /TR %WebPath%\schedule.bat /ST 23:30 /TN IIS_RESTART /SC DAILY /RU system

這樣就完成一個自動佈署的bat檔了!
最後記得檢查一下所有需要的程式和文件都放在同一個資料夾
https://ithelp.ithome.com.tw/upload/images/20220518/201490999TZ0JpUsyp.png

要執行自動佈署bat檔時,使用系統管理員身分開啟命令提示字元,
然後cd到setup資料夾,執行install.bat就可以囉!


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言