一、 环境准备与Ansible配置
首先,在你的Ansible控制机(可以是一台单独的Linux服务器或你的工作电脑)上,需要配置对两类系统的管理能力。
-
Ansible配置Linux主机(沿用你的方法) :为2台Linux服务器配置SSH免密登录,方式与你原文中相同。
-
Ansible配置Windows主机(关键步骤) :Windows需通过WinRM协议管理。
1. 在6台Windows Server上启用并配置WinRM。可以以管理员身份在PowerShell中快速执行以下命令:
Enable-PSRemoting -Force
设置WinRM服务为自动启动
Set-Service WinRM -StartMode Automatic
配置允许基础认证(用于测试,生产环境建议用HTTPS+证书)
winrm set winrm/config/service/auth '@{Basic="true"}'
2. 在Ansible控制机上安装Windows管理依赖
pip install pywinrm
二、配置Ansible主机清单 **
根据你的环境,清单文件 inventory.ini 应类似如下:
```
[linux]
linux-server1 ansible_ssh_host=192.168.1.10
linux-server2 ansible_ssh_host=192.168.1.11
[windows]
windows-server1 ansible_host=192.168.1.20
windows-server2 ansible_host=192.168.1.21
... # 其他4台Windows服务器
# 定义连接变量
[linux:vars]
ansible_connection=ssh
ansible_user=root # 或你的ssh用户
[windows:vars]
ansible_connection=winrm
ansible_port=5985 # WinRM HTTP端口,HTTPS用5986
ansible_winrm_transport=basic
ansible_user=Administrator # 或具有管理员权限的用户
ansible_password=your_windows_password # 建议使用ansible-vault加密
ansible_winrm_server_cert_validation=ignore # 自签名证书时可忽略验证
3、编写Windows巡检脚本
Linux巡检脚本已经在上一篇补充,Windows部分需要功能对等的PowerShell脚本。以下是一个 Windows_Check.ps1 的核心框架:
使用管理员运行 “powershell”
# Windows服务器巡检脚本
$Report = "=== Windows服务器巡检报告 ===`r`n"
$Report += "生成时间: $(Get-Date)`r`n"
$Report += "计算机名: $env:COMPUTERNAME`r`n"
# 1. 系统资源检查
$Report += "`r`n--- 系统资源 ---`r`n"
$CpuUsage = (Get-Counter '\Processor(_Total)% Processor Time').CounterSamples.CookedValue
$Report += "CPU使用率: {0:N1}%`r`n" -f $CpuUsage
$Memory = Get-CimInstance Win32_OperatingSystem
$MemUsage = (($Memory.TotalVisibleMemorySize - $Memory.FreePhysicalMemory) / $Memory.TotalVisibleMemorySize) * 100
$Report += "内存使用率: {0:N1}%`r`n" -f $MemUsage
# 2. 磁盘检查
$Report += "`r`n--- 磁盘空间 ---`r`n"
Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3" | ForEach-Object {
$Usage = ($_.Size - $_.FreeSpace) / $_.Size * 100
$Report += "驱动器 $($_.DeviceID): {0:N1}% 已使用 (剩余 {1:N1} GB)`r`n" -f $Usage, ($_.FreeSpace/1GB)
}
# 3. Windows服务检查
$Report += "`r`n--- 关键服务状态 ---`r`n"
$CriticalServices = @("WinRM", "EventLog", "DHCP", "DNS", "Spooler", "IISADMIN") # 根据你的实际服务调整
foreach ($svc in $CriticalServices) {
$Service = Get-Service -Name $svc -ErrorAction SilentlyContinue
if ($Service) {
$Report += "$svc : $($Service.Status)`r`n"
}
}
# 4. 系统日志错误检查(最近24小时)
$Report += "`r`n--- 系统日志(最近24小时错误/警告)---`r`n"
$StartTime = (Get-Date).AddHours(-24)
$Events = Get-EventLog -LogName System -EntryType ('Error','Warning') -After $StartTime -Newest 5
if ($Events) {
$Report += "最近有 $($Events.Count) 条错误/警告`r`n"
} else {
$Report += "近期无严重错误日志`r`n"
}
# 5. 将报告保存到本地文件
$ReportPath = "C:\Windows\Temp\syscheck_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt"
$Report | Out-File -FilePath $ReportPath -Encoding UTF8
Write-Output "巡检报告已生成: $ReportPath"
4、部署与批量执行
编写Ansible Playbook(run_checks.yml),一键触发所有服务器的巡检。
重新编写一个新的yaml
---
- name: 执行混合服务器巡检
hosts: all
tasks:
- name: 在Linux服务器上执行Bash巡检脚本
ansible.builtin.script: /path/to/your/linux_check.sh
when: inventory_hostname in groups['linux']
register: linux_result
- name: 在Windows服务器上执行PowerShell巡检脚本
ansible.windows.win_shell: |
powershell.exe -ExecutionPolicy Bypass -File C:\scripts\Windows_Check.ps1
when: inventory_hostname in groups['windows']
args:
executable: cmd
register: windows_result
- name: 收集Linux巡检报告到控制机
ansible.builtin.fetch:
src: "/tmp/syscheck_report_{{ ansible_date_time.iso8601_basic_short }}.txt"
dest: "./reports/{{ inventory_hostname }}/"
flat: yes
when: inventory_hostname in groups['linux'] and linux_result is succeeded
- name: 收集Windows巡检报告到控制机
ansible.windows.win_fetch:
src: 'C:\Windows\Temp\syscheck_{{ ansible_date_time.iso8601_basic_short }}.txt'
dest: './reports/{{ inventory_hostname }}/'
flat: yes
when: inventory_hostname in groups['windows'] and windows_result is succeeded
在Ansible控制机上运行:
ansible-playbook -i inventory.ini run_checks.yml
5、结果收集与后续优化
所有服务器的巡检报告都会被自动收集到控制机的 ./reports/ 目录下,按主机名分文件夹存放。
你可以进一步:
- 设置定时任务:在Ansible控制机使用
cron定时执行Playbook。 - 统一报告格式:编写脚本,将所有报告汇总成一个HTML或PDF总览。
- 设置告警:在Playbook中增加任务,解析报告内容,当发现CPU、内存、磁盘超过阈值时,通过邮件、钉钉、企业微信等发送告警。