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 colore 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 python3Python 3 para executar scripts Python ou configure a declaração para usar Pythonlanguage python2.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 terminalcomando 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;
}