gul_tech (gul_tech) wrote,
gul_tech
gul_tech

Category:

Ещё про JUNOScripts

JONOScripts (в числе прочего) дают возможность автоматически реагировать на произвольные события. Например, при обнаружении более 2% потерь на линке увеличить ospf metric. Механизм мощный и гибкий.

В нашем случае понадобилось два применения:
1. Нужно резервирование L2-транспорта. Причём на одном из путей BPDU не проходят, так что любые варианты STP не подходят (bpdu tunneling тоже не работает).
2. Трафик на клиента распределяется на два линка, как multipath bgp, клиенту нужно ограничить полосу по сумме этих двух путей. Поскольку ограничение скорости у MX делается на каждом ICHIP независимо, а сабинтерфейсы клиента у нас принадлежали разным физическим 10GE-интерфейсам, ограничение полосы "в лоб" не получается.

Обе задачи успешно решаются через event scripts.
В первом случае - реакция либо на OSPF, либо на ping tests. При падении основного линка указанный список виланов из этого транка убирается, а в транк на резервный линк добавляется. При поднятии основного линка конфигурация возвращается в исходное состояние. Скрипт
Во втором - реакция на изменение состояния BGP с клиентом. Если обе сессии живы, на каждом из сабинтерфейсов прописывается ограничение в половину положенной клиенту полосы. Если одна из BGP упала - на оставшейся полисер увеличивается до полной полосы. Скрипт

В конфигурации event policy никаких хитростей нет, поэтому не привожу, да и просто лениво. Если кому интересно - покажу, тем более, что скрипты без описания, и, не ориентируясь в slax, понять, как и с какими параметрами их запускать, проблематично, сорри.

В целом, всё работает. Однако есть нюансы.

Казалось бы, при падении ospf или физического интерфейса сказать в одном месте "shutdown" (ну или "set disable"), в другом - "no shutdown" (то есть "clear disable") можно сразу, время срабатывания такого механизма может быть гораздо лучше, чем у rapid-stp. Действительно - интерфейс ушёл в даун, сразу упало OSPF, сразу пошла обработка события, запустился скрипт, изменил конфиг - на всё про всё десятки миллисекунд (ну, может, сотни). А вот потом порядка минуты делается commit. :-( Это вам не Cisco, где shutdown и no shutdown отрабатываются сразу.

Второй нюанс - как быть с блокировкой изменения конфига? Что, если кто-то в это время редактирует конфигурацию? Если просто откроем конфиг, внесём изменения и закоммитим, мы рискуем применить чьи-то не готовые изменения. Если сделаем exclusive - нас просто не пустят изменить конфиг, не переключимся на резервный канал при падении основного. Если private - рискуем незаметно откатить чьи-то чужие изменения (человека или скрипта), сделанные за время нашего коммита. Тем не менее, для изменений из скрипта private - наиболее приемлемый вариант, для ручных изменений - обычный edit (без дополнительных опций). Так риск получается минимальным (хотя и ненулевым).

Может, реализовать блокировку с ожиданием своими силами, внутри скрипта? Например, выставлять файл-семафор на время редактирования конфигурации. Увы, идея провалилась: при попытке выполнить любую команду "file ..." из скрипта возникает ошибка: "Operation allowed only from CLI". Не положено из функционального языка обращаться к внешним ресурсам. :( Кое-какую защиту получилось сделать через jcs:dampen(), которая сохраняет данные в файловой системе, но не скажу, что эта защита красивая и надёжная.

Ну и помимо всего прочего оказалось, что поддержка скриптов вообще ещё достаточно сырая и глючная. Например, на 9.5R1 к параметрам скрипта в конце дописываются пробелы. На 9.5R2 почему-то не получается, редактируя под private, добавить в конфиг комментарий (junos:comment) - либо private, либо comment, но не одновременно. Если попытаться запустить event script не от рута, получается ошибка:

Oct 31 16:31:32   eventd[932]: UI_DBASE_OPEN_FAILED: Database open failed for file '/var/run/db/schema.db': Permission denied
Oct 31 16:31:32   eventd[932]: UI_CONFIGURATION_ERROR: Process: eventd, path: <none>, statement: <none>, Opening configuration database: Could not open database schema

Иногда, если захотеть деликатно закрыть сессию (не просто дропнуть соединение, а сказать request-end-session), получаем такое:

Oct 29 11:28:37 rpc name: request-end-session
Oct 29 11:28:37 buffer trace: normal: 0x80e8000 (364/0x16c)
Oct 29 11:28:37 buffer: {{{<?xml version="1.0" encoding="us-ascii"?>}}}
Oct 29 11:28:37 buffer: {{{<junoscript xmlns="http://xml.juniper.net/xnm/1.1/xnm" xmlns:junos="http://xml.juniper.net/junos/9.5R2/junos" schemaLocation="http://xml.juniper.net/junos/9.5R2/junos junos/9.5R2/junos.xsd" os="JUNOS" release="9.5R2.7" hostname="" version="1.0">}}}
Oct 29 11:28:37 buffer: {{{<rpc-reply xmlns:junos="http://xml.juniper.net/junos/9.5R2/junos" xmlns="">}}}
Oct 29 11:28:37 buffer trace: normal: 0x80eb02d (15/0xf)
Oct 29 11:28:37 buffer: {{{<end-session/>}}}
Oct 29 11:28:37 buffer trace: normal: 0x80ed154 (13/0xd)
Oct 29 11:28:37 buffer: {{{</rpc-reply>}}}
Oct 29 11:28:37 buffer trace: normal: 0x80eb161 (69/0x45)
Oct 29 11:28:37 buffer: {{{]]>]]>}}}
Oct 29 11:28:37 buffer: {{{<!-- session end at 2009-10-29 11:28:37 EET -->}}}
Oct 29 11:28:37 buffer: {{{</junoscript>}}}
Oct 29 11:28:37 buffer trace: read fails: 0x80ef1a6 (0/0x0)
Oct 29 11:28:37 error: [filename: xmn:rpc results] [line: 6] Sequence ']]>' not allowed in content
Oct 29 11:28:37 error: [filename: xmn:rpc results] [line: 6] [input: detected an error in element content] internal error
Oct 29 11:28:37 error: [filename: xmn:rpc results] [line: 6] Extra content at the end of the document
Oct 29 11:28:37 commit script: xml-mode: could not read content
Oct 29 11:28:37 invalid reply to rpc
Oct 29 11:28:37 could not get reply
Oct 29 11:28:37 xmlXPathCompiledEval: evaluation failed
Oct 29 11:28:37 runtime error: file /var/db/scripts/op/move-vlans.slax element value-of
Oct 29 11:28:37 XPath evaluation returned no result.

В общем, скрипты - это хорошо, но, надеюсь, в будущих версиях будет ещё лучше. :)
Tags: juniper
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 10 comments