Use o Junos PyEZ para recuperar uma configuração
RESUMO Você pode criar aplicativos Junos PyEZ que recuperam dados de configuração do banco de dados de configuração especificado em um dispositivo Junos.
Os aplicativos Junos PyEZ podem executar chamadas de procedimento remoto (RPCs) sob demanda em dispositivos Junos. Após a criação de uma instância da Device
classe, um aplicativo pode executar RPCs como uma propriedade da Device
instância. Os aplicativos Junos PyEZ podem usar o get_config()
RPC para solicitar a configuração completa ou partes selecionadas da configuração tanto para a configuração nativa do Junos OS quanto para dados de configuração correspondentes aos modelos de dados padrão (IETF, OpenConfig) ou YANG personalizados que foram adicionados ao dispositivo.
O Junos PyEZ get_config
RPC invoca a operação de protocolo <get-configuration>
Junos XML. Para obter mais informações sobre a <get-configuration>
operação e suas opções, consulte < configuração deget>.
Este tópico discute como recuperar a configuração usando o Junos PyEZ get_config()
RPC. Para obter informações sobre como usar tabelas e visualizações para recuperar dados de configuração, consulte Definir tabelas de configuração do Junos PyEZ e usar tabelas de configuração do Junos PyEZ para recuperar dados de configuração.
Recuperar a configuração completa do candidato
Para recuperar a configuração completa do candidato em um dispositivo Junos, execute o get_config()
RPC. O formato de saída padrão é XML. Por exemplo:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True))
Especifique o banco de dados de origem para os dados de configuração
Quando um aplicativo Junos PyEZ usa o get_config()
RPC para recuperar informações de configuração de um dispositivo Junos, por padrão, o servidor retorna dados do banco de dados de configuração do candidato. Um aplicativo Junos PyEZ também pode recuperar dados de configuração do banco de dados de configuração comprometido ou do banco de dados de configuração efêmero.
Banco de dados de configuração de candidatos
Para recuperar dados do banco de dados de configuração do candidato, execute o get_config()
RPC e inclua opcionalmente quaisquer argumentos adicionais.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True))
Banco de dados de configuração comprometido
Para recuperar dados do banco de dados de configuração comprometido, inclua o options
argumento com 'database':'committed'
a get_config()
chamada de RPC.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(options={'database' : 'committed'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Banco de dados de configuração efêmero
O Junos PyEZ oferece suporte a operações no banco de dados de configuração efêmero em dispositivos que oferecem suporte a este banco de dados. Quando você recupera dados de configuração do banco de dados de configuração compartilhado, por padrão, os resultados não incluem dados do banco de dados de configuração efêmero.
O banco de dados efêmero é um banco de dados de configuração alternativo que fornece uma interface programática rápida para realizar atualizações de configuração em dispositivos Junos. O banco de dados de configuração efêmero é um recurso avançado que, se usado incorretamente, pode ter um impacto negativo sério na operação do dispositivo. Para obter mais informações, veja Entenda o banco de dados de configuração Efêmero.
Para recuperar dados da instância padrão do banco de dados de configuração efêmero, primeiro abra a instância efêmera padrão e depois solicite os dados. Para abrir a instância padrão, use um gerente de contexto para criar a Config
instância e incluir o mode='ephemeral'
argumento. Por exemplo:
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from lxml import etree dev = Device(host='router1.example.net') try: dev.open() with Config(dev, mode='ephemeral') as cu: data = dev.rpc.get_config(options={'format':'text'}) print(etree.tostring(data, encoding='unicode')) dev.close() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) except Exception as err: print (err)
Para recuperar dados de uma instância específica do banco de dados de configuração efêmero, primeiro abra a instância efêmera e depois solicite os dados. Para abrir uma instância definida pelo usuário do banco de dados de configuração efêmero, use um gerente de contexto para criar a Config
instância, incluir o mode='ephemeral'
argumento e definir o ephemeral_instance
argumento para o nome da instância efêmera.
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from lxml import etree dev = Device(host='router1.example.net') try: dev.open() with Config(dev, mode='ephemeral', ephemeral_instance='eph1') as cu: data = dev.rpc.get_config(options={'format':'text'}) print(etree.tostring(data, encoding='unicode')) dev.close() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) except Exception as err: print (err)
Especifique o escopo dos dados de configuração para retornar
Além de recuperar a configuração completa do Junos OS, um aplicativo Junos PyEZ pode recuperar partes específicas da configuração invocando o get_config()
RPC com o filter_xml
argumento. O filter_xml
parâmetro leva uma string contendo o filtro de sub-árvore que seleciona as declarações de configuração para retornar. O filtro subtree devolve os dados de configuração que correspondem aos critérios de seleção.
Para solicitar várias hierarquias, a filter_xml
corda deve incluir o <configuration>
elemento raiz. Caso contrário, o valor deve filter_xml
representar todos os níveis da hierarquia de configuração começando apenas sob o elemento raiz <configuration>
até a hierarquia a ser exibida. Para selecionar uma sub-árvore, inclua a tag vazia para esse nível de hierarquia. Para devolver um objeto específico, inclua um nó de correspondência de conteúdo que define o elemento e o valor a combinar.
O aplicativo Junos PyEZ a seguir recupera e imprime a configuração nos [edit interfaces]
níveis de hierarquia e [edit protocols]
na configuração do candidato:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<configuration><interfaces/><protocols/></configuration>' data = dev.rpc.get_config(filter_xml=filter) print (etree.tostring(data, encoding='unicode', pretty_print=True))
O exemplo a seguir recupera e imprime a configuração no nível de [edit system services]
hierarquia usando valores diferentes, mas equivalentes para o filter_xml
argumento:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='<system><services/></system>') print (etree.tostring(data, encoding='unicode', pretty_print=True)) data = dev.rpc.get_config(filter_xml='system/services') print (etree.tostring(data, encoding='unicode', pretty_print=True)) filter = etree.XML('<system><services/></system>') data = dev.rpc.get_config(filter_xml=filter) print (etree.tostring(data, encoding='unicode', pretty_print=True))
O exemplo a seguir recupera o <name>
elemento para cada <interface>
elemento sob a <interfaces>
hierarquia na configuração do candidato pós-herança:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<interfaces><interface><name/></interface></interfaces>' data = dev.rpc.get_config(filter_xml=filter, options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
user@server:~$ python3 junos-pyez-get-interface-names.py <configuration changed-seconds="1544032801" changed-localtime="2018-12-05 10:00:01 PST"> <interfaces> <interface> <name>ge-1/0/0</name> </interface> <interface> <name>ge-1/0/1</name> </interface> <interface> <name>lo0</name> </interface> <interface> <name>fxp0</name> </interface> </interfaces> </configuration>
O exemplo a seguir recupera a sub-árvore para a interface ge-1/0/1:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: filter = '<interfaces><interface><name>ge-1/0/1</name></interface></interfaces>' data = dev.rpc.get_config(filter_xml=filter, options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
user@server:~$ python3 junos-pyez-get-single-interface.py <configuration changed-seconds="1544032801" changed-localtime="2018-12-05 10:00:01 PST"> <interfaces> <interface> <name>ge-1/0/1</name> <description>customerA</description> <disable/> <unit> <name>0</name> <family> <inet> <address> <name>198.51.100.1/24</name> </address> </inet> </family> </unit> </interface> </interfaces> </configuration>
Especifique o formato para que os dados de configuração retornem
O Junos PyEZ get_config()
RPC invoca a operação de protocolo <get-configuration>
Junos XML, que pode devolver dados de configuração do Junos OS como elementos Junos XML, declarações de configuração CLI, comandos Junos OS set
ou Notação de objetos JavaScript (JSON). Por padrão, o get_config()
RPC retorna dados de configuração como XML.
Para especificar o formato em que devolver os dados de configuração, o aplicativo Junos PyEZ inclui o options
que há de melhor 'format':'format'
na get_config()
lista de argumentos. Para solicitar declarações de configuração de CLI, comandos do Junos OS set
ou formato JSON, defina o format
valor para text
, set
ou json
, respectivamente.
Como nas sessões de protocolo NETCONF e Junos XML, o Junos PyEZ retorna os dados de configuração no formato esperado dentro do elemento XML apropriado para esse formato. A resposta do RPC inclui dados de configuração em XML, texto ou formatos de set
comando em <configuration>
, <configuration-text>
e <configuration-set>
elementos, respectivamente.
from jnpr.junos import Device from lxml import etree from pprint import pprint with Device(host='router1.example.net') as dev: # XML format (default) data = dev.rpc.get_config() print (etree.tostring(data, encoding='unicode', pretty_print=True)) # Text format data = dev.rpc.get_config(options={'format':'text'}) print (etree.tostring(data, encoding='unicode', pretty_print=True)) # Junos OS set format data = dev.rpc.get_config(options={'format':'set'}) print (etree.tostring(data, encoding='unicode', pretty_print=True)) # JSON format data = dev.rpc.get_config(options={'format':'json'}) pprint (data)
Dependendo da versão do Python e do formato da saída, você pode precisar modificar a declaração de impressão para exibir uma saída mais legível pelo ser humano.
Recuperar dados de configuração para modelos de dados YANG padrão ou personalizados
Você pode carregar módulos YANG padronizados ou personalizados em dispositivos Junos para adicionar modelos de dados que não são suportados nativamente pelo Junos OS, mas podem ser suportados pela tradução. Você configura modelos de dados não nativos na configuração do candidato usando a sintaxe definida para esses modelos. Quando você confirma a configuração, os scripts de tradução do modelo de dados traduzem esses dados e confirmam a configuração correspondente do Junos OS como uma mudança transitória na configuração de checkout.
O candidato e as configurações ativas contêm os dados de configuração para modelos de dados YANG não nativos na sintaxe definida por esses modelos. Os aplicativos Junos PyEZ podem recuperar dados de configuração para modelos de dados YANG padrão e personalizados, além de recuperar a configuração nativa do Junos OS, incluindo os argumentos apropriados no get_config()
RPC. Por padrão, os dados de configuração não nativos não estão incluídos na resposta do get_config()
RPC.
Para recuperar dados de configuração definidos por um modelo de dados YANG não nativo, além de recuperar a configuração do Junos OS, executar o get_config()
RPC com o model
argumento e incluir o namespace
argumento quando apropriado. O model
argumento leva a um dos seguintes valores:
custom
— Recuperar dados de configuração definidos por modelos de dados YANG personalizados. Você deve incluir onamespace
argumento ao recuperar dados para modelos de dados YANG personalizados.ietf
— Recuperar dados de configuração definidos pelos modelos de dados YANG do IETF.openconfig
— Recuperar dados de configuração definidos pelos modelos de dados do OpenConfig YANG.True
— Recuperar todos os dados de configuração, incluindo a configuração completa do Junos OS e dados de qualquer modelo de dados YANG.
Se você especificar o valor ou openconfig
o ietf
valor para o argumento, o model
Junos PyEZ usa automaticamente o namespace apropriado. Se você recuperar dados para um modelo de dados YANG personalizado usandomodel='custom'
, você também deve incluir o namespace
argumento com o namespace correspondente.
Se você incluir o model
argumento com o valor custom
, ietf
ou openconfig
também incluir o filter_xml
argumento para devolver uma subtree XML específica, o Junos OS só retorna a hierarquia correspondente do modelo de dados não nativos. Se a configuração do Junos OS contém uma hierarquia de mesmo nome, por exemplo, "interfaces", ela não está incluída na resposta. A opção filter_xml
não é suportada ao usar model=True
.
No exemplo a seguir, o get_config()
RPC recupera a hierarquia de configuração do OpenConfig bgp
a partir da configuração do candidato no dispositivo. Se você omitir o filter_xml
argumento, o RPC retorna as configurações completas do junos OS e do candidato ao OpenConfig.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='bgp', model='openconfig') print (etree.tostring(data, encoding='unicode', pretty_print=True))
O RPC a seguir recupera a interfaces
hierarquia de configuração da configuração do candidato para um modelo de dados YANG IETF:
data = dev.rpc.get_config(filter_xml='interfaces', model='ietf') print (etree.tostring(data, encoding='unicode', pretty_print=True))
O RPC a seguir recupera a l2vpn
hierarquia de configuração da configuração do candidato para um modelo de dados YANG personalizado com o namespace determinado:
data = dev.rpc.get_config(filter_xml='l2vpn', model='custom', namespace='http://yang.juniper.net/customyang/demo/l2vpn') print (etree.tostring(data, encoding='unicode', pretty_print=True))
O RPC a seguir recupera a configuração completa do candidato do Junos OS, bem como os dados de configuração para outros modelos de dados YANG que foram adicionados ao dispositivo:
data = dev.rpc.get_config(model=True) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Especifique opções adicionais de RPC
Quando você usa o Junos PyEZ get_config()
RPC para recuperar a configuração, ele invoca a operação de protocolo <get-configuration>
Junos XML. O RPC oferece suporte ao options
argumento, que permite que você inclua um princípio de pares de chave/valor de quaisquer atributos suportados pela <get-configuration>
operação. Para obter a lista completa de atributos suportados pela operação de protocolo <get-configuration>
Junos XML, veja < configuração deget>.
Por exemplo, o get_config()
RPC recupera dados da configuração pré-herança, na qual as <apply-groups-except>
<groups>
<apply-groups>
etiquetas e <interface-range>
as etiquetas são elementos separados na saída de configuração. Para recuperar dados da configuração pós-herança, que exibe declarações herdadas de grupos definidos pelo usuário e varia conforme crianças das declarações herdadas, você pode incluir o options
argumento com 'inherit':'inherit'
.
Por exemplo, o código a seguir recupera a configuração no [edit system services]
nível de hierarquia a partir da configuração do candidato pós-herança. Neste caso, se a configuração também contém declarações configuradas no nível de [edit groups global system services]
hierarquia, essas declarações seriam herdadas sob a [edit system services]
hierarquia na configuração pós-herança e devolvidas nos dados de configuração recuperados.
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='system/services', options={'inherit':'inherit'}) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Como lidar com namespaces em dados de configuração
O Junos PyEZ get_config()
RPC, por padrão, elimina quaisquer namespaces nos dados de configuração devolvidos. Os aplicativos Junos PyEZ podem reter o namespace nos dados de configuração devolvidos, o que permite carregar os dados de volta em um dispositivo, como quando você deseja modificar rapidamente a configuração existente.
Para reter namespaces nos dados de configuração, inclua o remove_ns=False
argumento na get_config()
lista de argumentos. Por exemplo:
from jnpr.junos import Device from lxml import etree with Device(host='router1.example.net') as dev: data = dev.rpc.get_config(filter_xml='bgp', model='openconfig', remove_ns=False) print (etree.tostring(data, encoding='unicode', pretty_print=True))
Na saída truncada a seguir, o <bgp>
elemento retém o xmlns
atributo que define o namespace:
<bgp xmlns="http://openconfig.net/yang/bgp"> <neighbors> <neighbor> <neighbor-address>198.51.100.1</neighbor-address> <config> <peer-group>OC</peer-group> <neighbor-address>198.51.100.1</neighbor-address> <enabled>true</enabled> <peer-as>64496</peer-as> </config> </neighbor> </neighbors> ...
Se o get_config()
remove_ns=False
argumento for omitido, o namespace não será incluído na saída.
<bgp> <neighbors> <neighbor> <neighbor-address>198.51.100.1</neighbor-address> <config> <peer-group>OC</peer-group> <neighbor-address>198.51.100.1</neighbor-address> <enabled>true</enabled> <peer-as>64496</peer-as> </config> </neighbor> </neighbors> ...