Рейтинг статьи: 2.000/5 (7 голосов).
Сетевые ошибки на магистральных портах мало того, что замедляют работу и могут повредить базы данных, они еще и предвестники деградации сетевого оборудования.Спонсор этой страницы:
Предыстория
У нас в сетке почти пол-сотни коммутаторов Cisco, связанных между собой оптикой.
Однажды из за сбойного оптического конвертера в сети пошли битые пакеты, которые завалили базу на сервере.
Далее пошли пляски с бубном. Базу восстанавливаем, она падает.
Пока нашли сбойный сегмент, потеряли кучу времени.
После этого решили контролировать все магистральные порты.
Используется PowerShell. (Входит с состав windows 7 и выше. На Windows XP необходимо устанавливать отдельно)
Подготовительная работа
Список сетевого оборудования cisco уже был в "ini" файле (см. статью
Организация резервного копирования файлов конфигурации Cisco используя PowerShell
) и его дополнили, указав, какие порты будем контролировать.
Имена портов записывали в том виде, как они выглядят в команде "sh int cou"
Значение параметра выполняет чисто информативную функцию.
cisco.ini
[192.168.1.1] Gi1/0/16=Otd 1 Gi1/0/25=Otd 2 Gi1/0/28=Otd 3 [192.168.52.1] Fa0/24=Central Office [192.168.73.1] Fa0/24=Central Office
На оборудовании cisco уж был создан пользователь backup с паролем b@ckUpPa$$ с 15 привилегией.
создаем errors.bat, который будет запускать скрипт с именем .\errors.ps1
%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -NoProfile powershell .\errors.ps1
Для работы по протоколу SSH понадобится Renci.SshNet.dll
Скрипт
.\errors.ps1
# Load SSH library (for .NET 4.0 and PowerShell 3) $DllPath = ".\Renci.SshNet.dll" [void][reflection.assembly]::LoadFrom( (Resolve-Path $DllPath) ) # Connect to switch (Cisco IE2000-L) with IP, port, username, password Function Get-IniContent { [CmdletBinding()] Param( [ValidateNotNullOrEmpty()] [ValidateScript({(Test-Path $_) -and ((Get-Item $_).Extension -eq ".ini")})] [Parameter(ValueFromPipeline=$True,Mandatory=$True)] [string]$FilePath ) Begin {Write-Verbose "$($MyInvocation.MyCommand.Name):: Function started"} Process { Write-Verbose "$($MyInvocation.MyCommand.Name):: Processing file: $Filepath" $ini = @{} switch -regex -file $FilePath { "^\[(.+)\]$" # Section { $section = $matches[1] $ini[$section] = @{} $CommentCount = 0 } "^(;.*)$" # Comment { if (!($section)) { $section = "No-Section" $ini[$section] = @{} } $value = $matches[1] $CommentCount = $CommentCount + 1 $name = "Comment" + $CommentCount $ini[$section][$name] = $value } "(.+?)\s*=\s*(.*)" # Key { if (!($section)) { $section = "No-Section" $ini[$section] = @{} } $name,$value = $matches[1..2] $ini[$section][$name] = $value } } Write-Verbose "$($MyInvocation.MyCommand.Name):: Finished Processing file: $FilePath" Return $ini } End {Write-Verbose "$($MyInvocation.MyCommand.Name):: Function ended"} } $FileContent = Get-IniContent ".\cisco.ini" $date = Get-Date -Format "yyyy-MM-dd" $logFile = ".\err_" + $date + ".log" #$FileContent.Keys | % { "key = $_ , value = " + $FileContent.Item($_) } foreach ($h in $FileContent.GetEnumerator()) { $ciscohost=$($h.Name) Write-Host $ciscohost Out-File -FilePath $logFile -InputObject $ciscohost -Append -encoding unicode $ports=$($h.Value) $SshClient = New-Object Renci.SshNet.SshClient($ciscohost, 22, 'backup', 'b@ckUpPa$$') $SshClient.Connect() if ($SshClient.isconnected) { $SshCommand = $SshClient.RunCommand("sh int cou err") $portsring=@() $portsring=$SshCommand.Result | %{ $_.split("`n")} for ($i=0; ((!$portsring[$i].contains("Single-Col")) -and ($portsring.count -gt $i+1));$i++) { $port_m=$portsring[$i] | %{ $_.split(" ")} $port_descr=$FileContent[$ciscohost][$port_m[0]] if ($port_descr -gt "") { $port_error=[int]::parse($portsring[$i].substring(11,10)) $port_error+=[int]::parse($portsring[$i].substring(23,10)) $msg = $port_m[0] + " (" + $port_descr + ") : " + $port_error Write-Host $msg if ($port_error -gt 0) { Out-File -FilePath $logFile -InputObject $msg -Append -encoding unicode } } } $SshCommand.Dispose() } }
Результат скрипта для поиска ошибок
В результате работы появляется файл, типа err_2016-11-01.log в котором будут перечислены
коммутаторы и порты с ошибками.
После написания скрипта и просмотра портов, были сброшены счетчики ошибок на коммутаторах Cisco.
После чего скрипт запускается каждое утро, а админу остается просмотреть протокол и предпринять действия по замену/ремонту оборудования.
p.s. После начала использования скрипта выявлено и заменено уже 4 оптических конвертера.
Все имена пользователей, IP адреса и порты указаны для примера.
Удачи в использовании новых инструментов.
Cisco Systems Программирование PowerShell
Комментарии к статье:
-
2016-11-16 02:31:38, 123 :
Скрипт подправлен.
теперь скрипт не ругается, если в INI вставить адрес маршрутизатора, в котором команда sh int cou err ничего не отображает.