使用bat档进行主机环境布署

工作中经常会遇到需要在客户端主机架站的情况,
如果客户端只有一台主机,手动布署或许不会花太多时间,
但若同时会有多台主机运行,可能就必须花上一整天,甚至好几天的时间,
重复进行安装软件、调整系统参数这些琐碎的动作,
不仅浪费掉许多时间,手动布署站台主机也可能会有部分作业漏做的风险。

这时候可以写一个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就可以罗!


<<:  4 种方法彻底移除 Mac App

>>:  【2022】忘记 Apple ID 密码?教你四个超实用破解技巧!

day9: CSS style 规划 - CSS in JS(emotion 使用 - 3)

使用 styled 方式 这个方式其实是 emotion 参考 styled-component,...

【Day 21】Hook 04:useContext

useContext useContext 本质上是 Context 的语法糖, 精简了 Conte...

Day2 XAMPP 环境准备

学习PHP前的准备,就是开发环境与执行环境的部署,就像上学前要先准备铅笔、课本、背包,最重要的是一颗...

每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day13

tags: ItIron2021 Javascript 前言 我们前两天都把心力分给可爱的闭包,又是...

Day29 NodeJS实作 III

新增功能完成後,接着是待办事项列表与删除待办事项。 前两天为了说明前後端应用程序和关联把文章写得有点...