🔧 Ansible 管理 Windows 服务器配置指南

问题背景

在实际工作中,需要管理多台 Windows 服务器,每次执行相同的配置操作都需要逐台连接服务器重复执行。例如批量安装软件、修改系统配置、部署应用程序等操作,都需要通过远程桌面逐台登录,手动执行相同的命令或操作步骤。

由于配置变更并非高频操作,这种低效的工作方式持续了近两年时间。相比 Linux 系统可以通过 SSH 批量执行脚本,Windows 服务器在批量管理方面存在诸多不便,缺乏统一的自动化管理方案。故下定决心要解决这个问题。

本文将介绍如何使用 Ansible 自动化工具解决这一问题,实现从 Linux 主机统一管理多台 Windows 服务器的目标。通过 WinRM 协议建立连接,无需在 Windows 服务器上安装额外的客户端软件,即可实现批量配置管理和命令执行。

环境说明

  • ✅ 控制节点:Linux(Ubuntu)系统,安装 Ansible
  • ✅ 被管理节点:5 台 Windows 服务器
  • ✅ 通信协议:WinRM(Windows Remote Management)
  • ✅ Windows 服务器无需安装 Ansible 客户端

💡 说明:本文演示环境使用 1 台 Windows 服务器进行配置测试,实际生产环境中管理 5 台服务器。配置方法完全相同,后续添加服务器只需重复相应步骤即可。

步骤一:🐧 Linux 控制节点配置

安装 Ansible

在 Ubuntu 系统上执行以下命令安装 Ansible:

1
sudo apt-get update && sudo apt-get install ansible

创建主机清单配置

创建 Ansible 主机清单文件:

1
sudo touch /etc/ansible/hosts

编辑 /etc/ansible/hosts 文件,添加 Windows 服务器配置:

1
2
3
4
5
6
7
8
[windows_servers]
win-host1 ansible_host=192.168.31.4

[windows_servers:vars]
ansible_connection=winrm
ansible_winrm_transport=basic
ansible_winrm_server_cert_validation=ignore
ansible_port=5985

参数说明:

  • ansible_connection=winrm:指定使用 WinRM 协议连接
  • ansible_winrm_transport=basic:使用基本认证方式
  • ansible_winrm_server_cert_validation=ignore:忽略证书验证(内网环境)
  • ansible_port=5985:WinRM HTTP 端口

配置认证信息

创建主机变量文件存储认证信息:

1
sudo touch /etc/ansible/host_vars/win-host1.yml

编辑 win-host1.yml 文件,写入认证配置:

1
2
ansible_user: test
ansible_password: "test123."

验证配置结构

此时 Ansible 配置目录结构如下:

1
2
3
4
/etc/ansible
├── hosts
└── host_vars
└── win-host1.yml

步骤二:🪟 Windows 服务器配置

配置网络类型

WinRM 服务要求网络类型为”专用”或”域”网络。

  1. 打开”设置” → “网络和 Internet” → “以太网”
  2. 点击当前网络连接
  3. 将网络配置文件更改为”专用网络”

配置专用网络

创建用户组

为 Ansible 管理创建专用用户组:

  1. 打开”计算机管理” → “本地用户和组” → “组”
  2. 创建新组 ansible
  3. 将需要远程管理的用户添加到该组

创建 ansible 用户组

启用 WinRM 服务

⚠️ 安全提示:Ansible 官方在 GitHub 提供了自动化配置脚本 ConfigureRemotingForAnsible.ps1,但出于安全考虑,建议手动执行必要的命令。

以管理员权限打开 PowerShell,依次执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 启用 WinRM 服务
winrm quickconfig -q

# 配置基本认证和明文传输(仅限内网环境)
winrm set winrm/config/service/auth '@{Basic="true"}'
winrm set winrm/config/service '@{AllowUnencrypted="true"}'

# 配置防火墙规则
New-NetFirewallRule -Name "WinRM" -DisplayName "WinRM" -Protocol TCP -LocalPort 5985 -Action Allow

# 授权用户组远程管理权限
net localgroup "Remote Management Users" ansible /add

# 验证监听器配置
winrm e winrm/config/listener

命令执行结果参考:

启用 WinRM

配置认证方式

配置防火墙

授权用户组

验证监听器

看到监听器正常运行在 5985 端口,即表示 WinRM 配置完成。

步骤三:✅ 连接测试

返回 Linux 控制节点,执行连通性测试:

1
ansible windows_servers -m win_ping

预期输出:

1
2
3
4
win-host1 | SUCCESS => {
"changed": false,
"ping": "pong"
}

连接测试成功

返回 SUCCESSpong 响应,表示 Ansible 已成功连接到 Windows 服务器。

注意事项

⚠️ 安全提醒:本文配置使用基本认证和明文传输方式,仅适用于内网测试环境。生产环境建议使用 HTTPS(端口 5986)配合证书认证,并定期更新认证凭据。

扩展:添加更多 Windows 服务器

完成首台服务器配置后,添加其他 Windows 服务器非常简单,只需两步操作:

第一步:添加主机配置

编辑 /etc/ansible/hosts 文件,在 [windows_servers] 组中添加新主机:

1
2
3
4
5
6
7
8
9
10
11
12
[windows_servers]
win-host1 ansible_host=192.168.31.4
win-host2 ansible_host=192.168.31.5
win-host3 ansible_host=192.168.31.6
win-host4 ansible_host=192.168.31.7
win-host5 ansible_host=192.168.31.8

[windows_servers:vars]
ansible_connection=winrm
ansible_winrm_transport=basic
ansible_winrm_server_cert_validation=ignore
ansible_port=5985

第二步:创建认证配置

为每台新增服务器在 /etc/ansible/host_vars/ 目录下创建对应的认证文件:

1
2
3
4
sudo touch /etc/ansible/host_vars/win-host2.yml
sudo touch /etc/ansible/host_vars/win-host3.yml
sudo touch /etc/ansible/host_vars/win-host4.yml
sudo touch /etc/ansible/host_vars/win-host5.yml

分别编辑各文件,写入对应服务器的认证信息:

1
2
3
# win-host2.yml
ansible_user: admin
ansible_password: "password123"

第三步:配置新服务器

在每台新增的 Windows 服务器上重复”步骤二”的配置操作:

  1. 配置网络类型为”专用”
  2. 创建 ansible 用户组并添加用户
  3. 执行 PowerShell 命令启用 WinRM 服务

批量测试连接

配置完成后,可以一次性测试所有服务器的连接状态:

1
ansible windows_servers -m win_ping

预期输出:

1
2
3
4
5
win-host1 | SUCCESS => { "changed": false, "ping": "pong" }
win-host2 | SUCCESS => { "changed": false, "ping": "pong" }
win-host3 | SUCCESS => { "changed": false, "ping": "pong" }
win-host4 | SUCCESS => { "changed": false, "ping": "pong" }
win-host5 | SUCCESS => { "changed": false, "ping": "pong" }

此时即可通过 Ansible 统一管理所有 Windows 服务器,实现批量配置和命令执行。

常见问题

问题:Windows 系统版本不支持
解决方案

  • ❌ Windows LTSC 版本功能精简过度,部分 Ansible 模块无法正常运行
  • ❌ Windows Home 版本无法启用 WinRM 服务
  • ✅ 推荐使用 Windows Server 版或专业版/企业版

问题:执行 win_ping 时提示连接超时
解决方案

  • 检查网络连通性,确保 Linux 主机能 ping 通 Windows 服务器
  • 确认 5985 端口在 Windows 防火墙中已放行
  • 检查网络设备(路由器、交换机)是否阻止 WinRM 通信
  • 验证 WinRM 服务是否正常运行:winrm e winrm/config/listener

问题:认证失败
解决方案

  • 确认用户名密码正确,注意密码中的特殊字符需要用引号包裹
  • 验证用户已加入 Remote Management Users
  • 检查 WinRM 是否启用了基本认证:winrm get winrm/config/service/auth

问题:提示网络类型不正确
解决方案:将 Windows 网络配置文件更改为”专用”或”域”网络,不能使用”公用”网络