本文共 3055 字,大约阅读时间需要 10 分钟。
豆子今天在一个新配置的Nagios服务器上发现对Windows服务器的内存检查仍然使用的是check_nt, check_nt检查的是物理内存和虚拟内存之和;而我需要查看的只是物理内存,因此我需要改成check_nrpe。 Nagios服务器上的配置不多说了,下载安装相关插件,配置command.cfg和windows.cfg, 然后客户端修改对应的NSClient的配置文件,测试通过。
然后问题来了,我有80多台Windows服务器需要修改对应的配置文件,还有10多台Windows服务器根本就没有安装NSClient,我可不想手动去一一安装配置,写了个简单的脚本统一修改。
基本思路,从AD里面获取Windows服务器名字,判断是否在线。对于在线的服务器进行扫描,判断是否安装了NSClient;如果已经安装过的,判断是否已经备份,否则备份之后更新配置文件;如果没有安装的,拷贝安装文件到本地的temp文件夹,进行安装然后更新配置文件。
值得一提的有几点:
1.使用invoke-command远程操作的时候,默认的安全机制会禁止访问网络资源!因此我需要把MSI文件拷贝到本地才能安装。
2.Powershell里面使用msiexec安装msi文件的时候,需要使用start-process 的格式,列如
1 | start-Process -FilePath msiexec.exe -ArgumentList "/i c:\temp\NSCP.msi /q" -Wait -PassThru |
如果是远程使用,需要注意第一不能访问网络资源,第二不能使用交互式安装,第三这个MSI文件本身不能创建任何和用户档案相关的文件,比如快捷方式等等;任何一条违反了都会导致失败。
3. 拷贝文件的时候我使用了 copy ... | out-null 的格式,这个作用和 start-process copy.exe -wait 是一样的,都是为了保证当前命令成功结束之后才会进行下一条命令。
4. 这个脚本写的并不完善,比如我没有对有对操作系统是64位或者32位进行判断,也没有异常报错处理等等,我稍后有空进行完善,不过已经可以处理我需要的内容了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | Write-Host "Scanning Online Servers ..." $a = get-adcomputer - filter {operatingsystem -like "*20*" } $computers =@() foreach ( $b in $a ){ if ( Test-Connection -computername $b .name -Count 1 -Quiet){ $temp = [psobject] @{ 'name' = $b .name} $computers += $temp } } Write-Host "Scanning Nagios Clients ..." $c2 =@() $computers | ForEach-Object { $path = "\\" + $_ .name+ "\c$\Program Files\NSClient++\nsclient.ini" $bakpath = "\\" + $_ .name+ "\c$\Program Files\NSClient++\nsclient.ini.bak" if (( Test-Path -Path $path ) -and !( Test-Path -Path $bakpath )) { copy $path $bakpath copy "\\sydav01\c`$\program files\NSClient++\nsclient.ini" $path #"Restart nscp service on "+$_.name Invoke-Command -ComputerName $_ .name { restart-service nscp} } else { $path + " Folder doesn't Esixt" $temp = [psobject] @{'name '=$_.name} $c2+=$temp } } $end=$false while ( $end -eq $false){ Write-Host "Following servers don' t have Nagios Client Installed. " $c2 .name $option = read-host "Do you want to Install ? ( Y/N ) " switch ( $option ) { "Y" { $c2 | foreach-object { $path2 = "\\" + $_ .name+ "\c$\temp\NSCP.msi" if ( Test-Path $path2 ){} else { New-Item $path2 -Force } Write-host "Copying NSCP.msi files to " $path2 copy '\\sydit01\c$\Temp\NSCP-0.4.4.15-x64.msi' $path2 | Out-Null Write-host "Copying is completed and start to install" Invoke-Command -ComputerName $_ .name -ScriptBlock { Start-Process -FilePath msiexec.exe -ArgumentList "/i c:\temp\NSCP.msi /q" -Wait -PassThru } $path3 = "\\" + $_ .name+ "\c$\Program Files\NSClient++\nsclient.ini" Write-host "Installation is completed and now is updting config file" copy "\\sydav01\c$\program files\NSClient++\nsclient.ini" $path3 Invoke-Command -ComputerName $_ .name { restart-service nscp} } $end = $true ; } "N" { $end = $true } default { "Please answer Y or N" } } } |
运行片段,拷贝文件到某台服务器,安装,更新文件,重启服务
从Nagios服务器上测试成功获取内存信息