Скрипт для сетевых устройств

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

Выбор ПО

Задача условно распадается на 2 подзадачи:

  • Выбор языка программирования для скрипта;
  • Выбор среды выполнения для скрипта.

Опять же много вариантов, но идеально подходит Posh-SSH - модуль поддержки протоколов SSH, SFTP, SCP для PowerShell (далее PS). Домашняя страничка проекта: //www.powershellmagazine.com/2014/07/03/posh-ssh-open-source-ssh-powershell-module/

Там много и подробно рассказано об использовании.

Требования - PowerShell 3.0 и .NET 4.0.

Средой выполнения становится удобный и распространённый PS, он же язык программирования скрипта.

Поскольку потребуется ещё подгружать данные для работы скрипта, то нужен модуль для PS - PSExel.

Требования - PowerShell 5.

Подготовка компьютера

Модуль PSExel отказывается устанавливаться на старые версии PS, поэтому сначала необходимо скачать обновление с MS.

Проверим версию PS с помощью команды:

$host.version

Скрипт для сетевых устройств

Теперь нужно разрешить выполнение неподписанных скриптов в PS, которое по умолчанию запрещено:

Set-ExecutionPolicy Unrestricted

PS при этом необходимо запускать от Администратора.

Установка

Posh устанавливается 1 командой:

iex (New-Object Net.WebClient).DownloadString("https://gist.github.com/darkoperator/6152630/raw/c67de4f7cd780ba367cccbc2593f38d18ce6df89/instposhsshdev")
Get-Command *ssh*

После успешного выполнения будет выведен список новых командлетов:

Скрипт для сетевых устройств

Теперь устанавливаем PSExel, для установки нужно запустить PS от Администратора:

Install-Module PSExcel

Установка может занимать несколько минут и возможно предложит установить NuGet:

Скрипт для сетевых устройств

Скрипт

Простой скрипт

Для разогрева рассмотрим простой скрипт для 1 устройства, нужен будет только Posh-SSH. Самая наверное востребованная задача - это перезагрузка по расписанию:

Function Restart ( )
{
 Get-SSHSession | Remove-SSHSession

$PWord = ConvertTo-SecureString –String "пароль" –AsPlainText -Force
$Credential = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList "логин", $PWord

$SSHSession=New-SSHSession -ComputerName "IP адрес" -Credential $Credential -AcceptKey

$SSH = $SSHSession | New-SSHShellStream

Start-Sleep -Seconds 1
 $cmd1="reload"
 $SSH.WriteLine( $cmd1)
Start-Sleep -Seconds 1
 $cmd2=""
 $SSH.WriteLine( $cmd2)

Get-SSHSession | Remove-SSHSession
}

Restart

Далее ставим выполнение скрипта в Планировщик.

Если нет SSH

Столкнулся с такой ситуацией: коммутаторы CISCO прошиты и нужно их ребутнуть, но сделать это можно только через Telnet и только в короткий промежуток времени ночью, удалённого доступа из дома нет. Поможет Telnet Scripting Tool, взять можно здесь: //support.moonpoint.com/downloads/windows/network/Telnet/tst10.php

Программа нормально работает и с новыми версиями Windows, включая 10 и 2012 R2. Нужно только обязательно выключить Контроль учётных записей, иначе скрипт повиснет в Планировщике не начав выполняться. Строка запуска:

tst10.exe /r:script.txt /o:out.txt

Содержимое script.txt для перезапуска будет следующим:

192.168.10.3
WAIT “Username:”
SEND “логин\m”
WAIT “Password:”
SEND “пароль\m”
WAIT “#”
SEND “reload\m”
WAIT “Proceed with reload? [confirm]”
SEND “\m”
Скрипт посложнее

Итак, скрипт использует цикл: в теле цикла в каждой итерации построчно выбираются данные из файла Exel, а затем вызывается функция, выполняющая необходимые команды на устройстве - до тех пора, все строки из файла не будут выбраны.

Подготовка файла Exel

Для примера использования Posh возьмем добавление пользователей на 5 коммутаторов CISCO. Каждый коммутатор может иметь отличные от других коммутаторов реквизиты доступа администратора (логин, пароль) и реквизиты доступа для нового пользователя также могут отличаться.

Сначала потребуется подготовить файл Exel с параметрами. Пример такого файла (SSH.xlsx):

IP_Net Adm PassAdm NewUser PassNewUser
192.168.1.1 admin1 pass1 user1 pass_user1
192.168.2.1 admin2 pass2 user2 pass_user2
192.168.3.1 admin3 pass3 user3 pass_user3
192.168.4.1 admin4 pass4 user4 pass_user4
192.168.5.1 admin5 pass5 user5 pass_user5
Подготовка функции скрипта

Функция включает в себя переменные из файла Exel и работает следующим образом:

  1. Удаляется существующая SSH сессия, если она есть;
  2. Происходит подключение к текущему устройству;
  3. Вход в режим глобальной конфигурации;
  4. Выполнение команды по созданию пользователя;
  5. Выход из режима глобальной конфигурации;
  6. Сохранение текущей конфигурации в стартовую;
  7. Удаление сессии SSH.

Поскольку выполнение команды занимает некоторое время, то по месту вводятся паузы в 1 секунду:

Start-Sleep -Seconds 1

Запись конфигурации занимает больше времени, тут нужна дополнительная пауза в 3 секунды.

Function CreateUser ( $IP_Net, $Adm, $PassAdm, $NewUser, $PassNewUser)
{
 Get-SSHSession | Remove-SSHSession

$PWord = ConvertTo-SecureString –String $PassAdm –AsPlainText -Force
$Credential = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList $Adm, $PWord

$SSHSession=New-SSHSession -ComputerName $IP_Net -Credential $Credential -AcceptKey

$SSH = $SSHSession | New-SSHShellStream

Start-Sleep -Seconds 1
 $cmd1="config t"
 $SSH.WriteLine( $cmd1)
 $SSH.read()
Start-Sleep -Seconds 1
 $cmd2="username "+$NewUser+" privilege 3 secret "+$PassNewUser
 $SSH.WriteLine( $cmd2)
 $SSH.read()
Start-Sleep -Seconds 1
 $cmd3="exit"
 $SSH.WriteLine( $cmd3)
Start-Sleep -Seconds 1
 $SSH.read()
 $cmd4="wr"
 $SSH.WriteLine( $cmd4)
Start-Sleep -Seconds 3
 $SSH.read()

Get-SSHSession | Remove-SSHSession
}
Подготовка цикла

Цикл работоспособен, если в файле Exel 2 и более строки.

$f1="D:\SSH.xlsx"
Test-Path $f1
$n=Import-XLSX $f1 -Sheet "Sh1" 
$l=$n.Length
for ($i=0; $i -lt $l; $i++)
 {
 $k1=$n[$i].IP_Net
 $k2=$n[$i].Adm
 $k3=$n[$i].PassAdm
 $k4=$n[$i].NewUser
 $k5=$n[$i].PassNewUser
 CreateUser $k1 $k2 $k3 $k4 $k5
 }
Проверка скрипта

Помещаем функцию и цикл (функция должна быть объявлена до цикла) в файл SSH.ps1. Выполнять и отлаживать работу скрипта лучше в среде PS ISE. Файл Exel на момент выполнения скрипта должен быть закрыт, иначе будет ошибка доступа к файлу.

Вывод скрипта следующий:

PS C:\WINDOWS\system32> D:\SSH.ps1
True - закрытие сессии

Router1#
config t
Enter configuration commands, one per line. End with CNTL/Z.
Router1(config)#
username user1 privilege 3 secret pass_user1
Router1(config)#
exit
Router1#
wr
Building configuration...
[OK]
3550-1#
True - закрытие сессии
...

Проверим конфигурацию Router1:

Router1#sh run | include username
username admin1 ...
username user1 privilege 3 secret 5 $1$YYvv$ftLXxEbE0fQlpsQuqSqrE0

Пробуем подключиться под новым пользователем:

login as: user1
Using keyboard-interactive authentication.
Password: XXXXXXXXXX

Router1# - подключение успешно

Заключение

Таким способом можно выполнять любые команды, а не только создавать пользователя, сразу на группе сетевых устройств. Недостатком является то, что нужно каждый раз подготавливать новый файл Exel вручную и это будет рутинной работой. Достоинством является ускорение процесса выполнения команд по сравнению с ручными манипуляциями. Гибкостью является возможность задавать различные параметры для разных устройств.

В общем и целом - есть свои плюсы, есть свои минусы, но данный метод вполне жизнеспособен.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *