http://nettips.ru

Контроль за появлением ошибок на магистральных портах коммутаторов Cisco используя PowerShell.

На главную Cisco Systems VoIP маршрутизатор Беларусь Asterisk коммутатор Nateks Alcatel MTS Gigaset Velcom ZTE Grandstream Android Huawei админы шутят о сайте Zelax Allied Telesis D-Link Arduino Штрихкоды HP
Телефонные номера доступа sip операторов Телефонные коды городов и стран мира.

Рейтинг статьи: 2.000/5 Рейтинг 2.00 из 5Рейтинг 2.00 из 5Рейтинг 2.00 из 5Рейтинг 2.00 из 5Рейтинг 2.00 из 5 (1 голосов).

Сетевые ошибки на магистральных портах мало того, что замедляют работу и могут повредить базы данных, они еще и предвестники деградации сетевого оборудования.

Спонсор этой страницы: детские зимние куртки оптом

Предыстория

У нас в сетке почти пол-сотни коммутаторов 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 ничего не отображает.


Ваши отзывы и предложения по работе сайта направляйте на форму обратной связи.

Яндекс.Метрика