Рейтинг статьи: 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 ничего не отображает.
























