Crie sintaxe de configuração personalizada com macros de script commit
Confirmar macros de script permite que você crie sintaxe de configuração personalizada e expanda-a para declarações de configuração padrão do Junos OS. Sua sintaxe personalizada serve como entrada para um script de compromisso. A saída do script de compromisso é a sintaxe padrão de configuração do Junos OS, como mostrado na Figura 1. As declarações padrão do Junos OS são adicionadas à configuração para causar suas alterações operacionais pretendidas.

As macros usam elementos de mudança persistentes ou transitórios para expandir sua sintaxe personalizada em declarações de configuração padrão do Junos OS. Se você usar mudanças persistentes, tanto a sintaxe personalizada quanto a sintaxe padrão do Junos OS aparecem na configuração do candidato. Se você usar alterações transitórias, a sintaxe personalizada aparece na configuração do candidato, e a sintaxe padrão do Junos OS é copiada apenas para a configuração de checkout.
Esta seção discute os seguintes tópicos:
Criando uma sintaxe personalizada
As macros funcionam localizando apply-macro
declarações na configuração do candidato e usando os valores especificados na apply-macro
declaração como parâmetros para um conjunto de instruções definidas em um script de compromisso. Na verdade, sua sintaxe de configuração personalizada serve a um propósito duplo. A sintaxe permite que você simplifique suas tarefas de configuração, e fornece ao script os dados necessários para gerar uma configuração complexa.
Para inserir sintaxe personalizada, você inclui a apply-macro
declaração em qualquer nível de hierarquia e especifica os dados que quiser dentro da apply-macro
declaração, por exemplo:
apply-macro macro-name { parameter-name parameter-value; }
Você pode incluir a apply-macro
declaração em qualquer nível da hierarquia de configuração. Nesse sentido, a apply-macro
declaração é semelhante à apply-groups
declaração. Cada apply-macro
declaração deve ser nomeada com exclusividade, em relação a outras apply-macro
declarações no mesmo nível de hierarquia.
Uma apply-macro
declaração pode conter um conjunto de parâmetros com valores opcionais. O script de compromisso correspondente pode se referir ao nome macro, seus parâmetros ou aos valores dos parâmetros. Quando o script inspeciona a configuração e encontra os dados, o script executa as ações especificadas pela mudança persistente ou transitória correspondente.
Por exemplo, dada a seguinte estrofe de configuração, você pode escrever instruções de script para gerar uma configuração padrão com base no nome do parâmetro:
protocols { mpls { apply-macro blue-type-lsp { color blue; } } }
A instrução de programação a seguir <xsl:for-each>
encontra apply-macro
declarações no nível de [edit protocols mpls]
hierarquia que contêm um parâmetro chamado color
:
<xsl:for-each select="protocols/mpls/apply-macro[data/name = 'color']">
A instrução a seguir cria uma variável nomeada color
e atribui à variável o valor do color
parâmetro, que neste caso é blue
:
<xsl:variable name="color" select="data[name = 'color']/value"/>
A instrução a seguir adiciona a admin-groups
declaração à configuração e atribui o color
valor da variável ao nome do grupo:
<transient-change> <protocols> <mpls> <admin-groups> <name> <xsl:value-of select="$color"/> </name> </admin-groups> </mpls> </protocols> </transient-change>
As declarações de configuração resultantes são as seguintes:
protocols { mpls { admin-groups { blue; } } }
elemento <data>
Na renderização XML da sintaxe personalizada em uma declaração apply-macro
, parâmetros e seus valores estão contidos e <name>
<value>
elementos, respectivamente. Os <name>
elementos são <value>
filhos irmãos do <data>
elemento. Por exemplo, a apply-macro blue-type-lsp
declaração contém seis parâmetros, da seguinte forma:
[edit 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; }
Os parâmetros e valores são renderizados nos elementos de tag Junos XML da seguinte forma:
[edit protocols mpls] user@host# show | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/10.0R1/junos"> <configuration> <protocols> <mpls> <apply-macro> <name>blue-type-lsp</name> <data> <name>10.1.1.1</name> </data> <data> <name>10.2.2.2</name> </data> <data> <name>10.3.3.3</name> </data> <data> <name>10.4.4.4</name> </data> <data> <name>color</name> <value>blue</value> </data> <data> <name>group-value</name> <value>0</value> </data> </apply-macro> </mpls> </protocols> </configuration> </rpc-reply>
Quando você escreve macros de script commit, você pode extrair e manipular os parâmetros contidos nas apply-macro
declarações, referindo-se aos <data>
elementos e <value>
aos <name>
elementos.
No exemplo a seguir, a select
expressão XPath do atributo extrai o texto contido no <value>
elemento que é uma criança de um <data>
elemento que também contém um <name>
elemento infantil com o texto color
. A declaração variável atribui o texto do elemento a <value>
uma variável nomeada color
.
<xsl:variable name="color" select="data[name = 'color']/value"/>
O equivalente ao SLAX é:
var $color = ./data[name='color']/value;
O equivalente Python, que pressupõe ter element
selecionado um apply-macro
elemento, é:
color = element.find("data[name='color']/value").text
Expandindo a sintaxe personalizada
No script de compromisso correspondente, você inclui uma ou mais instruções de programação que inspecionam a configuração para a apply-macro
declaração em um nível de hierarquia especificado. Opcionalmente, você pode usar a data/name
expressão para selecionar um parâmetro na apply-macro
declaração.
<xsl:for-each select="xpath-expression/apply-macro[data/name = 'parameter-name']">
Por exemplo, a seguinte instrução de programação XSLT seleciona cada apply-macro
declaração que contém o color
parâmetro e que aparece no nível de [edit protocols mpls]
hierarquia:
<xsl:for-each select="protocols/mpls/apply-macro[data/name = 'color']">
O equivalente ao SLAX é:
for-each (protocols/mpls/apply-macro[data/name = 'color']) {
O equivalente Python, que abrange várias linhas para leitura, é:
for element in Junos_Configuration.xpath \ ("./protocols/mpls/apply-macro[data/name='color']"):
Ao expandir macros, uma instrução de programação especialmente útil em scripts XSLT é a <xsl:value-of>
instrução. Esta instrução seleciona um valor de parâmetro e o usa para criar valores de opção para as declarações do Junos OS. Por exemplo, a instrução a seguir concatena o valor da color
variável, do texto -lsp-
e do nó de contexto atual (representado por " .
" ) para criar um nome para um LSP.
<label-switched-path> <name> <xsl:value-of select="concat($color, '-lsp-', .)"/> </name> </label-switched-path>
O SLAX usa o sublinhado (_
) para condensar valores.
<label-switched-path> { <name> $color _ '-lsp-' _ .; }
Quando o script inclui instruções para encontrar os dados necessários, você pode fornecer conteúdo para uma mudança persistente ou transitória que usa os dados para construir uma configuração padrão do Junos OS.
A mudança transitória a seguir cria um grupo de administração e adiciona a label-switched-path
declaração à configuração. O caminho comutado por rótulos é atribuído a um nome que concatena o valor da color
variável, do texto -lsp-
e do endereço IP atualmente selecionado representado pelo período (".
"). A mudança transitória também adiciona a to
declaração e atribui o endereço IP selecionado atualmente. Por fim, a mudança transitória adiciona a admin-group include-any
declaração e atribui o valor da color
variável.
<transient-change> <protocols> <mpls> <admin-groups> <name><xsl:value-of select="$color"/></name> <group-value><xsl:value-of select="$group-value"/></group-value> </admin-groups> <xsl:for-each select="data[not(value)]/name"> <label-switched-path> <name><xsl:value-of select="concat($color, '-lsp-', .)"/></name> <to><xsl:value-of select="."/></to> <admin-group> <include-any><xsl:value-of select="$color"/></include-any> </admin-group> </label-switched-path> </xsl:for-each> </mpls> </protocols> </transient-change>
O equivalente ao SLAX é:
<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; } } } } } }
Da mesma forma em Python:
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")
O exemplo aqui mostrado é parcial. Para um exemplo completo, veja exemplo: criação de sintaxe de configuração personalizada com macros de script commit.
Depois de comprometer a configuração, o script é executado e a configuração completa resultante se parece com isso:
[edit] 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; } } }
O exemplo anterior demonstra como você pode usar uma sintaxe personalizada simplificada para configurar caminhos comutados por rótulos (LSPs). Se seu projeto de rede exigir que um grande número de LSPs seja configurado, usar uma macro de script de compromisso pode economizar tempo, garantir consistência e evitar erros de configuração.
Outras maneiras de usar macros
O exemplo discutido na criação de uma sintaxe personalizada mostra uma macro que usa mudanças transitórias para criar o impacto operacional pretendido. Alternativamente, você pode criar um script de compromisso que usa mudanças persistentes para adicionar as declarações padrão do Junos OS à configuração do candidato e excluir totalmente sua sintaxe personalizada. Dessa forma, um operador de rede que talvez não esteja familiarizado com sua sintaxe personalizada pode visualizar o arquivo de configuração e ver a configuração completa renderizada como declarações padrão do Junos OS. Ainda assim, como a macro de script commit permanece em vigor, você pode criar uma configuração complexa com rapidez e facilidade usando sua sintaxe personalizada.
Além do tipo de aplicativo discutido na criação de uma sintaxe personalizada, você também pode usar macros para impedir que um script de compromisso realize uma tarefa. Por exemplo, um script de compromisso básico que adiciona automaticamente a configuração MPLS às interfaces pode fazer uma exceção para interfaces que você marca explicitamente como não exigindo MPLS, testando a presença de uma declaração apply-macro
nomeada no-mpls
. Para um exemplo desse uso de macros, veja Exemplo: Configuração de LDP de controle.
Você pode usar a apply-macro
declaração como um lugar para armazenar dados externos. O script de compromisso não inspeciona a apply-macro
declaração, portanto, a apply-macro
declaração não tem impacto operacional no dispositivo, mas os dados podem ser transportados no arquivo de configuração a ser usado por aplicativos externos.