微软本身在 Windows Server 系统里,以及以周边产品体系的形式都提供了多种远程管理和自动化管理工具;在微软之外,社区和各个企业也提供了不少工具可以用于 Windows 平台的自动化运维。有了 Windows 容器技术之后,Windows 平台的自动化运维也能很轻便了。

通过 Server Manager、System Center 批量管理多台服务器

这是 Windows 系列操作系统内置的自动化管理工具。Server Manager 是一个 GUI 工具,它是每台 Windows Server 都内置的管理工具。它可以添加多台服务器,对目标服务器启停 Windows 功能(比如 IIS、DNS 服务等),还可以查看目标服务器的性能状态(CPU、内存使用率),以及日志事件。

Windows 上的远程桌面工具(RDP)是众所周知的远程连接工具。但这只是众多的 Windows 远程管理工具之一。实际上,包括 IIS 管理器、注册表(regedit),以及性能监视器(PerfMon)等大量的 Windows 内置工具都是支持对远程计算机进行管理的。

System Center 是微软主推的集群管理产品,它是一套独立出售的产品,提供桌面和 Web 界面,主要包括基础设施装配(比如虚拟机、网络)、自动化与配置(集群脚本编排、密钥存储等)和运维管理(监控与告警)等几个方面。System Center 不仅能管理 Windows Server,还能管理 Linux 服务器。

image
图片来自:https://www.microsoft.com/en-us/cloud-platform/system-center-solutions

Windows 远程管理(WinRM)

如果上面的工具不够满足需求,还可以利用 Windows 内置的远程管理 API 来自定义开发远程管理和自动化运维工具。

在 Windows 中内置的 PowerShell Remoting 的功能,以及在 PowerShell 5.0 中增加的 PowerShell DSC 自动化脚本编排配置工具,都是基于 WinRM 来实现的。前者提供远程命令行功能,类似于 SSH 连接;后者提供集群化自动化状态管理,类似于 Ansible。在最新的 PowerShell 6 中,也提供基于 SSH 的连接

image
图片来自 https://www.howtogeek.com/117192/how-to-run-powershell-commands-on-remote-computers/

下面的代码查询两台远程计算机的界面语言(代码引自文档):

1
Invoke-Command -ComputerName Server01, Server02 -ScriptBlock {Get-UICulture}

输出结果为:

1
2
3
4
LCID    Name     DisplayName               PSComputerName
----    ----     -----------               --------------
1033    en-US    English (United States)   server01.corp.fabrikam.com
1033    en-US    English (United States)   server02.corp.fabrikam.com

实际上,Server Manager 以及 Ansible 等众多其他提供远程管理 Windows 的工具也都是基于 WinRM 来实现的。我们也可以基于 WinRM 开发自己的远程 Windows 管理工具。在本地计算机,可以通过 WMI 来获取当前计算机的磁盘、网络和 CPU 内存等状态信息,如果远程计算机启用了 WinRM 那么原来操作本机的代码即可立即用于管理远程计算机。

下面的 C# 代码可以查询远程计算机上的信息:

1
2
3
4
5
6
using System.Management;
...
ManagementScope scope = new ManagementScope("\\\\Computer_B\\root\\cimv2");
scope.Connect();
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

PowerShell DSC

PowerShell DSC 是一整套的批量自动化运维的工具,可以用于 Windows 服务器的管理;随着跨平台的 PowerShell 6.0 的运用,也可以用于管理 Linux 服务器。

下面的代码将在本机配置 IIS 网站,并将指定的文件作为网站的内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Configuration WebsiteTest {
    # Import the module that contains the resources we're using.
    Import-DscResource -ModuleName PsDesiredStateConfiguration

    # The Node statement specifies which targets this configuration will be applied to.
    Node 'localhost' {

        # The first resource block ensures that the Web-Server (IIS) feature is enabled.
        WindowsFeature WebServer {
            Ensure = "Present"
            Name   = "Web-Server"
        }

        # The second resource block ensures that the website content copied to the website root folder.
        File WebsiteContent {
            Ensure = 'Present'
            SourcePath = 'c:\test\index.htm'
            DestinationPath = 'c:\inetpub\wwwroot'
        }
    }
}

. .\WebsiteTest.ps1 && WebsiteTest
Start-DscConfiguration .\WebsiteTest

基于类似的机制,微软还提供了一种自动化流程格式 Runbook,Runbook 是以指定的顺序和逻辑运行多个自动化脚本,从而实现对基础设施和服务器的初始化的技术。Azure 自动化以及 System Center 都支持 Runbook。

第三方的自动化自动化运维工具

本质上,PowerShell DSC 只是一种远程执行 Windows 任务的一种机制,而支持这种机制的工具有很多,比如 ChefPuppetAnsibleTerraform。这些工具的特点是,都可以按一定的格式指定要在服务器上运行的脚本,所以通常它们可以用来做自动化部署工具,而往往并不能用作运行期的维护工具。如果只是自动化部署,常见的持续集成工具也是可以帮上忙的,比如 Jenkins、GoCD 和 TFS 等。所不同的是,前面这些环境编排工具平台通常提供了体验更好的安装、卸载和配置功能,而后面的持续集成工具则只提供了任务运行和结果展示功能。还有一些专门的“变更管理”软件,把这一过程标准化了,比如 TFS/VSTS Release 功能、Octopus Deploy 等。

image
图片来自 https://octopus.com/docs/deployment-process/lifecycles

作为运维,自然还是要考虑性能监控、日志分析和自动缩放的,这需要一些其他工具。作为监控工具的基础,老牌的 NagiosIcinga 总是不错的,它们都提供 Windows 服务器的监控支持;将 Prometheus 配合 Grafana 的可视化用于监控也成为很多人的选择。日志分析方面,开源的 ELK 栈和商业版的 Splunk 都可以使用。这些工具基本都能提供很好的可视化与告警支持,如果需要微信、短信这类推送支持,可能需要稍微封装开发一下。这些工具不少都有云上的托管版本,而在云上也有大量的其他工具可供使用,比如 HDInsight,Google Analytics 以及 Azure Operations Management Suite (OMS) 等。

如果要对 Windows 服务器进行自动缩放和启停,以支持很好的成本管理和故障处理,那么就需要结合对应的集群平台了。如果是云服务器,那么,要么云自己本身就提供了自动伸缩的能力,要么可以结合云平台使用的监控 API 和命令行工具就可以很容易开展了。在私有云环境下,如果使用 OpenStack、Azure Stack 这种集群管理平台,那么情况基本与云环境一样。在纯机器集群情况下,则需要使用虚拟化平台(比如 Hyper-V、VMware vSphere)来管理。利用 Hyper-V PowerShell 模块以及 VMware vSphere PowerCLI 模块就可以方便地以脚本的方式来管理虚拟机了。

image
图片来自 https://www.starwindsoftware.com/blog/getting-started-with-powershell-and-vmware-vsphere

容器化的运维

Windows 容器技术从 Windows Server 2016 的 1709 版本开始就可以用于生产环境了。简单来说,Windows 容器技术与 Linux 容器在运维技术方面没什么不同,除了容器镜像的大小一般比 Linux 容器要大(Linux 镜像一般 100M~500M 大小,Windows 镜像一般 500M~3G 大小),所以整个集群的存储应该要准备更大的存储空间。编排工具方面,流行的 Kubernetes、Docker Swarm 和 Mesos 都支持 Windows 容器的编排,因此按照标准的 Linux 容器平台来进行管理即可。

如果条件允许,当然 Windows Nano Server 是要比 Server Core 要好很多的,毕竟它支持的组件少很多,因此运维复杂度更小。


最后补充一点应用程序诊断方面的工具。如果出现了生产环境的问题,除了通常的各种日志之外,还需要一些诊断工具。

  • 文本编辑?嗯在新版本的 Windows 的命令行中并没有默认的文本编辑工具。Windows 版本的 VIM 也是值得拥有的。
  • 在 Windows 上,相信不少人都听说过SysInternals 系列工具,早在几年之前,微软就将它们收入囊中了。所以包括 Process Explorer、Debug View 等工具都可以更放心地使用了。这些工具可以用于诊断进程中加载的模块、读取的文件和注册表,可以接管控制台输出等。
  • 如果进程出现问题,需要调试,Windows 提供了工具可以直接创建进程 Dump 文件,再将 dmp 文件下载到本地,并使用 windbg 或 Visual Studio 来调试。SysInternals 中的 ProcDump 工具可以在命令行模式下创建 dump 文件。
  • 如果 dump 文件太大,还可以直接在服务器上使用 windbg 工具调试。windbg 随着 Windowns SDK 一起下载,安装时只要选择 Windows Diagnose Tools 就可以保证安装很快速。诊断 .NET 应用程序时,加载 sos 模块;.NET Core 应用程序则是 coreclr 运行时中的 sos.dll 模块。另外,还可以选择在服务器上安装 Visual Studio,并启用 Visual Studio 远程调试功能。
  • 如果想调试性能问题,或者需要将一些事件序列导出以寻求帮助,可以使用 wpaexportor 工具将事件导出为 etl 文件,并在其他计算机上使用 Event Viewer、Network Monitor 等工具读取并分析。

基于 Windows 平台来做自动化运维,做的好的团队确实不多。但从上面的罗列的各个方面可以看出,相关的工具和思路是非常完备的, 与 Linux 平台运维相比也并不存在特别的难度。希望有能力有兴趣的同学多多地实践,并分享自己的经验,让更多人感受到 Windows 运维的便利。