Page tree
Skip to end of metadata
Go to start of metadata

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

Для добавления нового набора команд выполните следующие действия:

  1. Слева в панели навигации щелкните на значке треугольника слева от Service Activation.
  2. В открывшемся списке щелкните на строке Setup.
  3. В открывшемся списке щелкните на строке Command Snippets.
  4. В открывшемся окне Command Snippets щелкните на кнопке Add. Откроется форма Create Command Snippet. Пример заполнения формы приведен на Рис. 1.

  5. Нажмите кнопку Save

     

    Рис. 1: Форма Create Command Snippet

      

Форма Create Command Snippet содержит следующие элементы:  

  • Name - имя набора команды;
  • Description - описание;
  • Snippet - набор команд;
  • Change Configuration - если флажок установлен, команды будут исполняться из режима конфигурирования для данного профиля (то есть команды conf t писать не надо);
  • Object Selector - селектор, к которому привязан набор команд;  
  • Is Enabled - показывает/скрывает набор команд из меню запуска;
  • Timeout (sec) - таймаут (с);
  • Require Confirmation - если флажок установлен, то перед исполнением система покажет список команд, которые она подготовил для исполнения на каждом оборудовании;
  • Ignore CLI Errors - если флажок снят, тогда если оборудование сообщит о неверной команде, то выполнение набора команд прерывается (на данном и на всем последующем оборудовании). Если флажок включен, то система будет идти вперед пока не закончит;
  • Permission Name - создает пункт в настройках прав доступа групп и пользователей;
  • Show in menu - создает в корне меню наборов команд;
  • Tags - теги.

   

Пример набора команд (настройка клиентских портов для Интернет)

1   {% load python %}

2   {% var cmd internal %}

3   {% var Client str %}

4   {% var po str %}

5   {% var id str %}

6   {% var speed str %}

7   {% python %}

8   from noc.inv.models import *

9   from noc.sa.models import *

10 from noc.ip.models import *

11 from noc.lib.ip import IP

12 from noc.lib.text import split_alnum

13

14  i = Interface.objects.filter(managed_object=context["object"].id, type="physical")

15 free_interface=""

16  for interface in sorted(i, key=lambda x: split_alnum(x.name)):

17    if interface.description==None or interface.description.split(" ")[0]=="was":

18        free_interface=interface.name

19       iface=interface

20       break

21

22   if free_interface=="":

23    raise Exception('No free interface found')

24

25  p = Prefix.objects.filter(vrf=12, Prefix_group="Clients-p2p", afi=4)

26  free = []

27  for pref in p:

28    for free_preffix in pref.iter_free():

29        free += {free_preffix} 

30    try:

31        if free[0]:

32            break

33    except:

34       pass

35

36   ip_prefix = str(free[0]).split('/')[0].split('.')

37   ip_gw = str(ip_prefix[0]) + "." + str(ip_prefix[1]) + "." + str(ip_prefix[2]) + "." + str(int(ip_prefix[3])+1)

38   new_prefix=str(free[0]).split('/')[0]+"/30"

39   domain_name=context["object"].name + "-" + "-".join("-".join(free_interface.split("/")).split(" ")) + ".a.ru"

40   iface.description=context["Client"]

41

42   iface.profile=InterfaceProfile.objects.get(name="UNI").id

43   Prefix(prefix=new_prefix, vrf=VRF.objects.get(id=12), description=context["Client"], Project=int(context["po"]), Channel_ID=int(context["id"])).save()

44   Address(address=ip_gw, fqdn=domain_name, vrf=VRF.objects.get(id=12)).save()

45   iface.save()

46 

47   context["cmd"]="configure terminal\n"

48   context["cmd"]+="interface " + free_interface + "\n"

49   context["cmd"]+=" description " + context["Client"] + " po-" + context["po"] + " id-" + context["id"] + "\n"

50   context["cmd"]+=" no switchport\n no shutdown\n"

51   context["cmd"]+=" ip access-group fromclient in\n"

52   context["cmd"]+=" ip address " + ip_gw + " 255.255.255.252\n"

53   context["cmd"]+=" no snmp trap link-status\n"

54   if not " " in context["speed"]:

55    context["cmd"]+=" service-policy input " + context["speed"] + "-in\n"

56   context["cmd"]+=" service-policy output " + context["speed"] + "-out\n"

57   context["cmd"]+="end\n"

58   context["cmd"]+="write\n"

59   context["cmd"]+="show running-config interface " + free_interface

60  {% endpython %}

61  {{cmd}}

 

Некоторые пояснения.

14 - 20 строки - ищем свободный интерфейс, то есть сначала передаем в переменную i все интерфейсы у выбранного оборудования, потом идем в цикле в поисках первого, где  описание будет пусто или начинаться со слова "was" (это значит, что какой-то клиент раньше был на этом порту, но уже отключился), как только нашли интерфейс, то записываем его.

25 - 34 строки - здесь мы ищем свободный префикс /30. Дальше с помощью iter_free ищем, что у нас не занято.

Дальше идут некоторые преобразования, чтобы получить нужные параметры.

ip_prefix - это найденный свободный префикс без маски, приведенный к списку октетов.

ip_gw – ip, который мы настраиваем на интерфейсе.

new_prefix - свободные префиксы ищутся с максимально короткой маской, поэтому найденную маску приходится срезать и добавлять /30.

domain_name - используется для сохранения в IPAM адреса, который мы настроили.

Далее сохраняем все в БД, прописываем описание для интерфейса в inventory, чтобы не занять интерфейс второй раз и не ждать, пока сработает discovery, сохраняем префикс в IPAM, и, собственно, адрес, адрес сохраняется потому, что discovery и fqdn_template генерят fqdn.

Затем формируем список команд, которые надо выполнить.

 

 

#trackbackRdf ($trackbackUtils.getContentIdentifier($page) $page.title $trackbackUtils.getPingUrl($page))
  • No labels

Похожие по тематике