Основы автоматизации на SLAX: различия между версиями

Материал из Juniper Exam Wiki
Перейти к навигации Перейти к поиску
Строка 150: Строка 150:


==Специальные переменные==
==Специальные переменные==
*'''Общие:'''
:*$product - name of the Junos device
:*$user - user, запускающий скрипт
:*$hostname - hostname
:*$script - скрипт, который запускаем
:*$localtime - время, когда был запущен скрипт. Вид: Fri Jan 7 14:07:33 2011
:*$localtime-iso - 2011-01-08 03:38:57 UTC
*'''op scripts:'''
:*$argument - особая переменная, кот предоставляет доступные аргументы в command-line;
user@junosdev> op change-interface ? Possible completions:
<name>          Argument name
admin-control  [enable | disable], default is disable 
detail          Display detailed output
Interface      The interface to control
|              Pipe through a command
*'''event scripts'''
:*$event-definition - определяет условия для срабатывания скрипта
var $event-definition = {
    <event-options> {
      <generate-event> {
          <name> "every-hour";
          <time-interval> "3600";
      }
      <policy> {
          <name> "check-var-utilization";
          <events> "every-hour";
          <then> {
            <event-script> {
                <name> "check-var-utilization.slax";
*'''$junos-context''' - содержит информацию об устройстве, но для каждых типов скриптов имеет свой набор параметров.

Версия 12:41, 4 января 2017

Fundamentals

- SLAX is based on XPath 1.0 and XSLT 1.0.

- Переменные задаются только 1 раз и дальше уже нет возможности их изменить.

- The “Node-Set” variable data-type is from XPath. Используется оператор :=.

var $my-ns-var := { 
   <interface> {
      <name> "ge-0/0/0"; }
   <interface> {
      <name> "ge-0/0/1";

- The “Result Tree Fragment” (RTF) может хранить в себе как строку, так и блок XML данных. Используется оператор =.

var $my-ns-var = { 
   <interface> {
      <name> "ge-0/0/0"; }
   <interface> {
      <name> "ge-0/0/1";

- Шаблон по умолчанию вернет RTF, но с помощью использования := можео заставить его вернуть node-set.

- Context Processing. Насколько я поняла, можно использовать (.) как current context. Пример:

var $my-ns-var := {
   <interface> {
      <name> "ge-0/0/0";
   <interface> {
      <name> "ge-0/0/1";
for-each( $my-ns-var/interface ) {
   var $ifd = .; /*                             $ifd is being assigned the 'current' interface node */
   <output> $ifd/name;

SLAX Script File Structure

Comments: - можно располагать хоть где в коде.

  • (/*) - open-comment
  • (*/) - close-comment
  • At the top: В скриптах в начале обязательно добавляется:
version 1.0;
ns junos = "http://xml.juniper.net/junos/*/junos";
ns xnm = "http://xml.juniper.net/xnm/1.1/xnm";
ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0";
Import "../import/junos.xsl";

после junos.xsl можно добавить любые свои файлы, написанные на SLAX, XSLT или их комбинации.

  • param - не изменяемые, нужно таким образом задать параметры командной строки.
param $interface;  
param $mtu-size = 2000;

можно задать переменную, например mtu-size, и если юзер не будет указывать напрямую значение нужного параметра, то будет использоваться то значение, которое указано через param.

  • $arguments - глобальная переменная, обеспечивает полезную информацию из CLI.
  • $event-definition - глобальная переменная для описания события.
  • main template - концептуальное начало скрипта. Шаблон, который матчит первый элемент из input XML document (source tree), даже если он пустой.

Для op script - выглядит так:

match / { 
   <op-script-results> {
      /* your code goes here */

Для event script - выглядит так:

match / { 
   <event-script-results> {
      /* your code goes here */

Для commit script - выглядит так:

match configuration {
      /* your code goes here */

Variables

Простые типы данных

Начало: var $xxx

Нельзя использовать в начале juno, jcs, xnm, slax. Нельзя: $arguments, $event-definition

Можно использовать : в названии переменной. Удобно, при создании библиотек, и когда скрипт будет вложен в скрипт.

Переменную можно объявить:

  • глобально - только эти переменные могут быть "перезаписаны" дальше в коде, лучше этого не допускать.
  • в шаблоне/функции
  • внутри программного control-block (for-each and the if/then/else)

Типы данных: строка (string), число (number), логическая (boolean), node-set.

  • Boolean: true() and false(). boolean() - функция переделывает выражение в логические. 0 = false, non-0 = true и т.д. Empty RTF coverts to true.
  • Numbers: целые или дробные (.)
  • Strings: " " или ' '. string() - функция превращает аргумент в строку.
  • Result Tree Fragments: можем использовать как script output, обработать как строку, или конвертировать в node-set. При объявлении переменной такого типа нельзя заканчивать ; после }. Каждый шаблон возвращает RTF.
  • Node-set: =RTF, единственное отличие от RTF - при присвоении переменной значения используем :=. Операции проводятся над node-sets. ( | ) - оператор для создания комбинации node-sets. Также отличие - к node-set можно применять операторы сравнения.

Сложные структуры данных

  • массивы - нет массивов как таковых, но можно использовать node-set XPath expressions особым образом.

Элементы массива начинаются с 1, а не с 0.

Пример задания массива:

var $numbers := { 
   <n> 30;
   <n> 10; 
   <n> 12; 
   <n> 27;

Пример использования массива:

<output> $numbers/n[2];
Вывод
10
for-each( $numbers/n ) { 
   <output> .;
Вывод:
30
10
12
27
  • хэши - (аналог Dictionary в Python) нет хешей как таковых, но можно использовать node-set XPath expressions особым образом.

Пример:

 /* Define <xsl:key> elements */
 <xsl:key name="protocol" match="route-table/rt" use="rt-entry/protocol-name">;
 <xsl:key name="next-hop" match="route-table/rt" use="rt-entry/nh/via">;
 var $match-protocol = "Static"; /* we want to match on "static" routes */ 
 var $match-interface= "ge-0/0/0.60"; /*we want to match on routes via interface ge-0/0/0.60 */
 match / 
	{ <op-script-results> {
		var $results = jcs:invoke("get-route-information");
		/* Change current node to the $results XML document */ 
		for-each( $results ) {

			/* Display all static routes */
			<output> $match-protocol _ " routes: "; 
			for-each( key( "protocol", $match-protocol ) ) {
				<output> rt-destination; 
			}
			/* Display all routes with next-hop of ge-0/0/0.60 */ 
			<output> "Next-hop " _ $match-interface _ ": "; 
			for-each( key( "next-hop", $match-interface ) ) {
				<output> rt-destination; 
			}
Вывод:
blair> op route-info    
Static routes: 
6.6.6.6/32
Next-hop ge-0/0/0.60: 
10.200.86.5/32
10.200.86.6/32
10.200.86.7/32
192.168.86.4/30
192.168.86.8/30
192.168.86.28/30
192.168.86.44/30

Специальные переменные

  • Общие:
  • $product - name of the Junos device
  • $user - user, запускающий скрипт
  • $hostname - hostname
  • $script - скрипт, который запускаем
  • $localtime - время, когда был запущен скрипт. Вид: Fri Jan 7 14:07:33 2011
  • $localtime-iso - 2011-01-08 03:38:57 UTC
  • op scripts:
  • $argument - особая переменная, кот предоставляет доступные аргументы в command-line;
user@junosdev> op change-interface ? Possible completions:
<name>          Argument name
admin-control   [enable | disable], default is disable   
detail          Display detailed output
Interface       The interface to control 
|               Pipe through a command
  • event scripts
  • $event-definition - определяет условия для срабатывания скрипта
var $event-definition = {
   <event-options> {
      <generate-event> {
         <name> "every-hour";
         <time-interval> "3600";
      }
      <policy> {
         <name> "check-var-utilization";
         <events> "every-hour";
         <then> {
            <event-script> {
               <name> "check-var-utilization.slax";
  • $junos-context - содержит информацию об устройстве, но для каждых типов скриптов имеет свой набор параметров.