阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

利用Powershell在IIS上自动化部署网站

145次阅读
没有评论

共计 10619 个字符,预计需要花费 27 分钟才能阅读完成。

本文主要讲如何通过 Powershell 在 IIS 上自动化部署 ASP.NET 网站,而不涉及 Powershell 的基本语法,如果没有 Powershell 基础的同学也可以把本文作为学习 Powershell 的基石,通过学习本文中的脚本再去查阅具体的语法,可能会达到事半功倍的效果。

一般我们建立网站大致需要以下几个步骤:

1、安装.NET Framework

2、安装了 IIS

3、注册、启用 ISAPI 和 CGI 限制

4、建立网站

5、设置默认首页、身份验证、设置 MIME 类型

6、绑定域名或 IP 地址

7、设置权限

8、设置防火墙入站规则

功能介绍

该功能主要是将站点文件夹、Powershell 脚本文件、.NET Framework 安装程序、Powershell 升级程序放在同一个文件夹下,以管理员身份运行脚本文件,脚本自动安装.NET Framework 和升级 Powershell 并将站点文件拷贝到网站目录下,最终建立一个网站。

接下来我们就讲讲如果通过 Powershell 实现上面的步骤:

安装.NET Framework

首先检查是否已经安装了.NET Framework,如果没有再安装。目前我知道的有两种方式可以判断是否已经安装了.NET Framework,一种是检查注册表,一种是检查安装路径(有点不靠谱),在本文中我将通过注册表来检查是否已经安装了.NET Framework。.NET Framework 的注册表路径在“HKLM:\SOFTWARE\Microsoft\NET Framework Setup\”,所以可以通过以下代码来实现:

1
test-path "HKLM:\SOFTWARE\Microsoft\NET Framework Setup\"

但是上面的代码只能检查.NET Framework 的安装情况,并不知道是安装了哪个版本,所以还需要配合下面的代码:

1
$version = gci 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP'| sort pschildname -desc | select -fi 1 -exp pschildname

gci 是 Get-ChildItem 的缩写,srot 是 Sort-Object 的缩写,可以通过运行 Get-Help Get-ChildItem -Detailed 来查看该函数的详细信息,其他函数只要替换掉 Get-ChilItem 就可以了。具体的代码如下所示:

检查后就是安装.NET Framework,调用安装程序是通过 Start-Process 函数来实现的,只需找出文件夹下的 exe 文件,并调用 Start-Process 函数即可:

1
2
Write-Progress "正在安装.NET Framework" "请稍候……"
Get-ChildItem $PSScriptRoot -Filter *.exe | %{start -wait $_ -ArgumentList "/quiet"}<br>Write-Progress "completed" "completed" -Completed

Write-Progress 是显示进度条信息,$PSScriptRoot 是获取当前脚本所在的路径。-ArgumentList 参数表示该安装过程是以静默安装的方式进行,如果没有该参数就会显示具体的安装过程。接下来是升级 Powershell 到 4.0 版本,因为后面的脚本是基于 4.0 来写的。

升级 Powershell

在升级之前同样是先检查 Powershell 的版本,如果已经是 4.0 版本了就没有必要再重新更新一次了。升级 Powershell 的方式跟安装.NET Framework 的方式是一样的,只是在升级完成时系统会自动重启以完成升级,也可以在安装后不自动重启,只需���-ArgumentList 参数里使用 ”/quiet /norestart” 即可,但是本文中的脚本是会自动重启。如果你的脚本不是基于 4.0 版本的就可以设置为不自动重启了。那么,如何让系统重启后自动执行当前的脚本呢?你可能会想到注册表,没错,本文就是通过写注册表的方式来实现,如果已经是 4.0 版本的话就可以用另外一种方式来实现了,具体的代码如下:

注释的代码就是另外一种实现方式,但是只能在 3.0 以后的版本中使用。在 HKCU 下是没有 RunOnce 这个项的,所以需要先判断该注册表路径是否存在,在 HKLM 下的话就有 RunOnce 路径了。RunOnce 表示只会执行一次,执行完后该注册信息就会被删除。

安装 IIS

在安装调用安装 IIS 的方法之前需要先使用下面的代码引入 ServerManager 模块,否则没有办法调用具体的函数:

Import-Module servermanager

添加功能和角色主要用 Add-WindowsFeature -name,name 参数是功能或角色的名称,如果不知道具体功能和角色的名称可以用 Get-WindowsFeature 来获取相关角色或功能的名称:

首先获取以 web- 开头的所有角色和功能,逐个判断是否已经安装,没有安装的再进行安装。

注册、启用 ISAPI 和 CGI 限制

在运行注册命令之前先判断是否已经注册,如果注册了判断是否已经启用。在 Powershell 注册 ISAPI 和在命令提示符中注册是差不多的,都是要以管理员身份身份运行。如果是直接运行 aspnet_regiis.exe 的全路径的话,Powershell 和 cmd 中的命令是一样的,即:

1
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

如果是先切换到 aspnet_regiis.exe 的目录下,在 cmd 下可以直接运行 aspnet_regiis.exe -i,在 Powershell 下则需要运行./aspnet_regiis.exe -i,否则 Powershell 无法识别 aspnet_regiis.exe - i 命令。通过下面的脚本获取是否已经注册和启用,并赋值给 $isapiConfiguration 变量:

1
$isapiConfiguration = get-webconfiguration "/system.webServer/security/isapiCgiRestriction/add[@path='$isapiPath']/@allowed"

$isapiPath 是一个变量,存放 isapi 的全路径。如果变量 $isapiConfiguration 等于 null 的话说明尚未注册 isapi,如果变量不等于 null,并且 $isapiConfiguration.Value 等于 false 的话说明未启用 isapi。

创建应用程序池

在新建应用程序池和新建网站之前需要先引入“WebAdministration”模块,否则会出现下面的错误:

利用 Powershell 在 IIS 上自动化部署网站

该模块在 2.0 版本下是没有的,所以要升级到 4.0 版本。

由于我们手动建立网站的时候会自动创建应用程序池,只需要设置应用程序池的相关属性就可以,但用 Powershell 脚本新建网站的时候是不会自动创建应用程序池的,所以我们需要先创建好应用程序池,在创建网站的时候将其指向到新建的应用程序池。

创建网站

因为动态压缩功能只要有安装,在新建网站的时候会自动启用,所以有需要启用动态内容压缩功能的话就需要检查该功能是否已经安装。

1
2
3
4
5
6
7
8
9
# 安装动态内容压缩功能
function EnableGZip
{
    $check = get-windowsfeature web-dyn-compression
    if($check.installed -eq $false)
    {
        add-windowsfeature web-dyn-compression
    }
}

检查网站目录是否存在,如果不存在就新建一个目录并设置权限,如果要关联的目录不存在的话就会出现下面的错误:

利用 Powershell 在 IIS 上自动化部署网站

$name 是“组或用户名”,$path 是站点路径。

将当前文件夹下的站点文件拷贝到站点目录下,由于拷贝文件可能会比较耗时,所以使用了进度条显示拷贝进度,如果不使用进度条的话就只要两条语句就可以完成:

1
2
$siteFilePath = (get-childitem $psscriptroot | ?{$_.psiscontainer})[0].fullname
Copy-Item "$siteFilePath\*" $sitePath -Force -Recurse

使用进度条的方式:

上述准备工作做完之后就是建立网站了

如果有开启防火墙的话还需要添加入站规则

创建虚拟目录的比较简单,但是也需要检查虚拟目录的路径是否存在,设置虚拟目录的权限

1
new-item "$siteName\$name" -type virtualdirectory -physicalpath $path

如果有需要还可以添加 MIME 类型

测试网站

测试网站是通过调用.NET Framework 的相关函数来实现的。

以上就是用 Powershell 脚本自动化部署网站的全部过程,可能还有遗落的功能没有实现。如果你对自动化部署网站有兴趣的话可以自己实现一个 Powershell 脚本。也请各位大牛多多指教,指出本文中的不足和错误的地方。

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-11/137721.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计10619字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中