Exemplo: criação de sintaxe de configuração personalizada com macros de script commit
Uma configuração do Junos OS pode conter apply-macro
declarações com sintaxe de configuração personalizada. Por si só, a apply-macro
declaração não tem impacto operacional no dispositivo. O Commit script macros processa a sintaxe de configuração personalizada e a expande para declarações de configuração padrão do Junos OS, que são adicionadas como uma mudança persistente ou transitória. Este exemplo demonstra como usar macros de script de compromisso para inspecionar apply-macro
declarações e gerar declarações de configuração do Junos OS.
Requisitos
Este exemplo usa os seguintes componentes de hardware e software:
Dispositivo que executa o Junos OS.
Junos OS Versão 16.1R3 ou versão posterior ao usar um script Python.
Visão geral e script de compromisso
A Tabela 1 mostra uma macro contendo sintaxe personalizada e a expansão correspondente à sintaxe padrão da interface de linha de comando (CLI) do Junos OS.
Sintaxe macro personalizada |
Sintaxe CLI do Junos OS expandida |
---|---|
protocols { mpls { apply-macro blue-type-lsp { 10.1.1.1; 10.2.2.2; 10.3.3.3; 10.4.4.4; color blue; group-value 0; } } } |
protocols { mpls { admin-groups { blue 0; } label-switched-path blue-lsp-10.1.1.1 { to 10.1.1.1; admin-group include-any blue; } label-switched-path blue-lsp-10.2.2.2 { to 10.2.2.2; admin-group include-any blue; } label-switched-path blue-lsp-10.3.3.3 { to 10.3.3.3; admin-group include-any blue; } label-switched-path blue-lsp-10.4.4.4 { to 10.4.4.4; admin-group include-any blue; } } } |
Neste exemplo, o processo de gerenciamento do Junos OS (mgd) inspeciona a configuração, em busca de apply-macro
declarações. Para cada apply-macro
declaração com o color
parâmetro incluído no nível de [edit protocols mpls]
hierarquia, o script gera uma mudança transitória, usando os dados fornecidos na apply-macro
declaração para expandir a macro para um grupo administrativo padrão do Junos OS para LSPs.
Para que este exemplo funcione, uma declaração apply-macro
deve ser incluída no nível da [edit protocols mpls]
hierarquia com um conjunto de endereços, um color
e um group-value
parâmetro. O script de compromisso converte cada endereço em uma configuração LSP, e o script converte o color
parâmetro em um grupo administrativo.
A seguir estão as instruções de script de compromisso que expandem a macro na Tabela 1 e uma explicação linha por linha do script:
Sintaxe XSLT
1 <?xml version="1.0" standalone="yes"?> 2 <xsl:stylesheet version="1.0" 3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 4 xmlns:junos="http://xml.juniper.net/junos/*/junos" 5 xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" 6 xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0"> 7 <xsl:import href="../import/junos.xsl"/> 8 <xsl:template match="configuration"> 9 <xsl:variable name="mpls" select="protocols/mpls"/> 10 <xsl:for-each select="$mpls/apply-macro[data/name = 'color']"> 11 <xsl:variable name="color" select="data[name = 'color']/value"/> 12 <xsl:variable name="group-value" select="data[name = \ 'group-value']/value"/> 13 <transient-change> 14 <protocols> 15 <mpls> 16 <admin-groups> 17 <name> 18 <xsl:value-of select="$color"/> 19 </name> 20 <group-value> 21 <xsl:value-of select="$group-value"/> 22 </group-value> 23 </admin-groups> 24 <xsl:for-each select="data[not(value)]/name"> 25 <label-switched-path> 26 <name> 27 <xsl:value-of select="concat($color, '-lsp-', .)"/> 28 </name> 29 <to><xsl:value-of select="."/></to> 30 <admin-group> 31 <include-any> 32 <xsl:value-of select="$color"/> 33 </include-any> 34 </admin-group> 35 </label-switched-path> 36 </xsl:for-each> 37 </mpls> 38 </protocols> 39 </transient-change> 40 </xsl:for-each> 41 </xsl:template> 42 </xsl:stylesheet>
As linhas 1 a 8 (e as Linhas 43 e 44) são a placa de serviço que você inclui em cada script de compromisso XSLT. Para brevidade, as Linhas 1 a 8 são omitidas aqui.
A Linha 9 atribui o nível de [edit protocols mpls]
hierarquia a uma variável chamada mpls
.
9 <xsl:variable name="mpls" select="protocols/mpls"/>
A Linha 10 seleciona cada apply-macro
declaração no nível de [edit protocols mpls]
hierarquia que contém o color
parâmetro. A configuração da amostra na Tabela 1 contém apenas uma apply-macro
declaração. Portanto, esta <xsl:for-each>
instrução de programação entra em vigor apenas uma vez.
10 <xsl:for-each select="$mpls/apply-macro[data/name = 'color']">
A Linha 11 atribui o valor do color
parâmetro, neste caso blue
, a uma variável chamada color
.
11 <xsl:variable name="color" select="data[name = 'color']/value"/>
A Linha 12 atribui o valor do group-value
parâmetro, neste caso 0
, a uma variável chamada group-value
.
12 <xsl:variable name="group-value" select="data[name = \ 'group-value']/value"/>
As linhas 13 a 15 geram uma mudança transitória no nível de [edit protocols mpls]
hierarquia.
13 <transient-change> 14 <protocols> 15 <mpls>
As linhas 16 a 23 adicionam a admin-groups
declaração à configuração e atribuem o color
valor da variável ao nome do grupo e o valor da group-value
variável ao valor do grupo.
16 <admin-groups> 17 <name> 18 <xsl:value-of select="$color"/> 19 </name> 20 <group-value> 21 <xsl:value-of select="$group-value"/> 22 </group-value> 23 </admin-groups>
As declarações de configuração resultantes são as seguintes:
admin-groups { blue 0; }
A Linha 24 seleciona o nome de cada parâmetro que não tem um valor atribuído a ele, que neste caso são os quatro endereços IP. Esta <xsl:for-each>
instrução de programação usa a recursão através da macro e seleciona cada endereço IP por sua vez. Os color
parâmetros e group-value
os parâmetros têm um valor atribuído (blue
e 0
, respectivamente), para que essa linha não se aplique a eles.
24 <xsl:for-each select="data[not(value)]/name">
A Linha 25 adiciona a label-switched-path
declaração na configuração.
25 <label-switched-path>
As linhas 26 a 28 atribuem o label-switched-path
nome que concatena o valor da color
variável, o texto-lsp
, e o endereço IP atualmente selecionado pela Linha 24 (representado pelo " .
" ).
26 <name> 27 <xsl:value-of select="concat($color, '-lsp-', .)"/> 28 </name>
A Linha 29 adiciona a to
declaração à configuração e define seu valor para o endereço IP atualmente selecionado pela Linha 24.
29 <to><xsl:value-of select="."/></to>
As linhas 30 a 34 adicionam a admin-group include-any
declaração à configuração e definem seu valor ao valor da color
variável.
30 <admin-group> 31 <include-any> 32 <xsl:value-of select="$color"/> 33 </include-any> 34 </admin-group>
As declarações de configuração resultantes (para um passe) são as seguintes:
label-switched-path blue-lsp-10.1.1.1 { to 10.1.1.1; admin-group include-any blue; }
As linhas 35 a 42 são tags de fechamento.
35 </label-switched-path> 36 </xsl:for-each> 37 </mpls> 38 </protocols> 39 </transient-change> 40 </xsl:for-each> 41 </xsl:template> 42 </xsl:stylesheet>
Sintaxe SLAX
O script SLAX equivalente é:
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"; match configuration { var $mpls = protocols/mpls; for-each ($mpls/apply-macro[data/name = 'color']) { var $color = data[name = 'color']/value; var $group-value = data[name='group-value']/value; <transient-change> { <protocols> { <mpls> { <admin-groups> { <name> $color; <group-value> $group-value; } for-each (data[not(value)]/name) { <label-switched-path> { <name> $color _ '-lsp-' _ .; <to> .; <admin-group> { <include-any> $color; } } } } } } } }
Sintaxe Python
A sintaxe Python a seguir produz as alterações de configuração idênticas:
from junos import Junos_Configuration import jcs def main(): # Get configuration root object root = Junos_Configuration for element in root.xpath("./protocols/mpls/ \ apply-macro[data/name='color']"): color = element.find("data[name='color']/value").text group_value = element.find("data[name='group-value']/value").text lsp_config ="" for element2 in element.xpath("data[not(value)]/name"): lsp_config = lsp_config + """ <label-switched-path> <name>{0}-lsp-{1}</name> <to>{1}</to> <admin-group> <include-any>{0}</include-any> </admin-group> </label-switched-path> """.format(color, element2.text) change_xml = """ <protocols> <mpls> <admin-groups> <name>{0}</name> <group-value>{1}</group-value> </admin-groups> {2} </mpls> </protocols> """.format(color, group_value, lsp_config).strip() jcs.emit_change(change_xml, "transient-change", "xml") if __name__ == '__main__': main()
Para obter mais informações sobre este exemplo, veja exemplo: configure grupos administrativos para LSPs.
Configuração
Procedimento
Procedimento passo a passo
Baixar, habilitar e testar o script:
Copie o script em um arquivo de texto, nomeie o arquivo lsp-admin.xsl, lsp-admin.slax ou lsp-admin.py conforme apropriado, e copie-o para o /var/db/scripts/commit directory no dispositivo.
Nota:Os scripts Python não assinados devem ser de propriedade de um root ou de um usuário na classe de login do Junos OS
super-user
, e apenas o proprietário do arquivo pode ter permissão de gravação para o arquivo.Se o script for escrito em Python, habilite a execução de scripts Python não assinados.
[edit] user@host# set system scripts language python
Nota:Configure a declaração para usar o
language python3
Python 3 para executar scripts Python ou configure a declaração para usar Pythonlanguage python
2.7 para executar scripts Python. Para obter mais informações, consulte a linguagem.Selecione as estrofes de configuração de teste a seguir e pressione Ctrl+c para copiá-las na prancheta. Se você estiver usando a versão SLAX ou Python do script, atualize o nome de arquivo no nível de
[edit system scripts commit file]
hierarquia.system { scripts { commit { allow-transients; file lsp-admin.xsl; } } } protocols { mpls { apply-macro blue-type-lsp { 10.1.1.1; 10.2.2.2; 10.3.3.3; 10.4.4.4; color blue; group-value 0; } } }
No modo de configuração, emita o
load merge terminal
comando para mesclar as estrofes na configuração do dispositivo.[edit] user@host# load merge terminal [Type ^D at a new line to end input] ... Paste the contents of the clipboard here ...
No prompt, cole o conteúdo da prancheta usando o mouse e o ícone da pasta.
Press Enter.
Pressione Ctrl+d.
Confirmar a configuração.
user@host# commit
Verificação
Verificando a execução do script
Propósito
Verifique se o script se comporta como esperado.
Ação
Para exibir as declarações de configuração criadas pelo script, emita o show protocols mpls | display commit-scripts
comando.
[edit] user@host# show protocols mpls | display commit-scripts apply-macro blue-type-lsp { 10.1.1.1; 10.2.2.2; 10.3.3.3; 10.4.4.4; color blue; group-value 0; } admin-groups { blue 0; } label-switched-path blue-lsp-10.1.1.1 { to 10.1.1.1; admin-group include-any blue; } label-switched-path blue-lsp-10.2.2.2 { to 10.2.2.2; admin-group include-any blue; } label-switched-path blue-lsp-10.3.3.3 { to 10.3.3.3; admin-group include-any blue; } label-switched-path blue-lsp-10.4.4.4 { to 10.4.4.4; admin-group include-any blue; }