混合服务器智能巡检V2

55 阅读3分钟

一、 环境准备与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、内存、磁盘超过阈值时,通过邮件、钉钉、企业微信等发送告警。