Como especificar a instância de roteamento em aplicativos Python 3 em dispositivos que executam o Junos OS Evolved
Entender o módulo libpyvrf
Uma instância de roteamento é uma coleção de tabelas de roteamento, interfaces e parâmetros de protocolo de roteamento. Cada instância de roteamento tem um nome único e uma tabela ip unicast correspondente, que pode ser usada para separar o tráfego dessa instância de outro tráfego. Por exemplo, em dispositivos que executam o Junos OS Evolved, você pode habilitar uma instância mgmt_junos
dedicada de roteamento e encaminhamento virtual de gerenciamento (VRF), que usa uma tabela de roteamento administrativa separada dedicada a tarefas de gerenciamento.
As instâncias de roteamento permitem isolar o tráfego que atravessa a rede sem usar vários dispositivos para segmentar sua rede. Quando você usa instâncias de roteamento para isolar o tráfego, os serviços de rede gostam ping
e ssh
devem fazer referência à instância de roteamento correta, a fim de enviar o tráfego para um destino que possa ser alcançado por essa instância.
A imagem do Junos OS Evolved é executado nativamente no Linux, fornecendo acesso direto a todos os serviços e operações do Linux, incluindo as bibliotecas Python que fazem parte da imagem base. A biblioteca Python 3 em dispositivos que executam o Junos OS Evolved também inclui o módulo Juniper Networks libpyvrf
, que permite que aplicativos Python 3 executados na shell especifiquem a instância de roteamento a ser usada para processos específicos e serviços de rede.
A Tabela 1 descreve as libpyvrf
funções que você pode usar em aplicativos Python 3 executados na camada Linux. Você pode usar as funções para instruir um processo a usar uma instância de roteamento específica. Se o mesmo processo exigir várias instâncias de roteamento, você também pode definir o contexto da instância de roteamento para um soquete específico, o que não afeta o contexto do processo em si. Os pacotes por meio do soquete usam a tabela de roteamento associada a essa instância. Quando você define a instância de roteamento para um processo ou soquete, o libpyvrf
módulo define o contexto para o Linux VRF que corresponde à instância de roteamento do Junos OS.
|
Descrição |
---|---|
|
Devolva o Linux VRF correspondente a uma instância de roteamento do Junos OS. |
|
Devolva o índice da tabela de roteamento associado à instância de roteamento especificada. |
|
Devolva a instância de roteamento associada à tarefa especificada.
Nota:
Essa função é preterida a partir do Junos OS Evolved Release 22.1R1. |
|
Devolva a instância de roteamento associada ao processo atual. |
|
Defina a instância de roteamento para o soquete especificado. |
|
Defina a instância de roteamento para o processo especificado.
Nota:
Essa função é preterida a partir do Junos OS Evolved Release 22.1R1. |
|
Defina a instância de roteamento para o processo atual. |
As funções do libpyvrf
módulo podem aumentar as seguintes exceções, dependendo da função e do erro:
libpyvrf.error
— Gerado quandolibvrf
retorna um erro.libpyvrf.evo_not_ready
— Gerado quando a pilha de rede Junos OS Evolved não está pronta, por exemplo, quando o dispositivo está inicializando.libpyvrf.invalid_table
— Gerado quando a instância de roteamento ou o ID da tabela especificados são inválidos.
A amostra a seguir do script Python tenta encontrar um host que só pode ser alcançado por meio da mgmt_junos
instância de roteamento. O script inicialmente pinga no host antes de chamar a set_vrf()
função. O script então chama a set_vrf()
função para associar a mgmt_junos
instância de roteamento ao processo atual e coloca o host novamente.
[vrf:none] user@host:~# cat libpyvrf-ping.py import libpyvrf as vrf import subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: # Ping the host before setting the routing instance subprocess.call(command) == 0 # Set the routing instance vrf.set_vrf("mgmt_junos") print ("\nUsing routing instance:", vrf.get_vrf()) # Ping the host after setting the routing instance subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e : print ("Junos OS Evolved network stack is not ready") except vrf.error as e : print ("Generic libvrf error")
Quando você executa o script, o primeiro comando de ping falha, porque o processo usa a instância de roteamento padrão neste caso, e o host só pode ser alcançado por meio da mgmt_junos
instância de roteamento. O segundo comando de ping, que usa a mgmt_junos
instância de roteamento, tem sucesso.
[vrf:none] user@host:~# python3 libpyvrf-ping.py ping: unknown host host1.example.net Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Você pode redefinir a instância de roteamento de volta à associação de instâncias de roteamento padrão em um aplicativo Python especificando uma string vazia para o nome da instância de roteamento. Por exemplo:
vrf.set_vrf("")
Se um aplicativo não especificar uma instância de roteamento, a associação de instâncias de roteamento padrão depende do ambiente do processo. Se o ambiente pré-carregar a biblioteca libsi.so , por padrão, o aplicativo usará a instância e a tabela de roteamento padrão. default.inet
Caso contrário, não há uma instância de roteamento padrão associada ao processo ou tomadas.
Para determinar se o ambiente pré-carrega a biblioteca libsi.so , verifique se o LD_PRELOAD
valor da variável do ambiente inclui o caminho até a biblioteca.
[vrf:none] user@host:~# env | grep LD_PRELOAD LD_PRELOAD=libsi.so
Se a LD_PRELOAD
variável não incluir o caminho da biblioteca libsi.so , você pode usar os comandos apropriados para sua concha para adicioná-lo, por exemplo:
[vrf:none] user@host:~# export LD_PRELOAD="/path/to/libsi.so" [vrf:none] user@host:~# env | grep LD_PRELOAD LD_PRELOAD=libsi.so
função get_host_vrf_name()
Sintaxe
host_vrf_name get_host_vrf_name(vrf_name)
Descrição
Devolva o Linux VRF correspondente a uma instância de roteamento do Junos OS.
Parâmetros
vrf_name |
Nome de uma instância de roteamento Junos OS. |
Valor de retorno
host_vrf_name | Nome do Linux VRF correspondente à instância de roteamento Junos OS. |
Exemplos de uso
O exemplo a seguir imprime o Linux VRF correspondente a várias instâncias de roteamento do Junos OS:
[vrf:none] user@host:~# cat libpyvrf-get-host-vrf-name.py import libpyvrf as vrf try: print ("mgmt_junos VRF:", vrf.get_host_vrf_name("mgmt_junos")) print ("default VRF:", vrf.get_host_vrf_name("default")) print ("L3VPN-1 VRF:", vrf.get_host_vrf_name("L3VPN-1")) except vrf.invalid_table as e: print ("Invalid Table")
[vrf:none] user@host:~# python3 libpyvrf-get-host-vrf-name.py mgmt_junos VRF: mgmt_junos default VRF: vrf0 L3VPN-1 VRF: vrf52
Informações de lançamento
Função introduzida no Junos OS Evolved Release 20.3R1.
função get_table_id()
Sintaxe
table_id get_table_id(vrf_name)
Descrição
Devolva o índice da tabela de roteamento associado à instância de roteamento especificada. Se a instância de roteamento não for definida, a função retorna -1.
Parâmetros
vrf_name |
Nome de uma instância de roteamento Junos OS. |
Valor de retorno
table_id | Índice da tabela de roteamento para uma determinada instância de roteamento. |
Exemplos de uso
O exemplo a seguir recupera e imprime o índice de tabela para a mgmt_junos
instância de roteamento e uma instância foo
de roteamento indefinida.
user@host> show route forwarding-table extensive table mgmt_junos Routing table: mgmt_junos.inet [Index 36738] Internet: ... Routing table: mgmt_junos.inet6 [Index 36738] Internet6: ...
[vrf:none] user@host:~# cat libpyvrf-get-table-id.py import libpyvrf as vrf try: print (vrf.get_table_id("mgmt_junos")) print (vrf.get_table_id("foo")) except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
O script devolve o índice de tabela para a mgmt_junos
instância e retorna -1 para a instância indefinida.
[vrf:none] user@host:~# python3 libpyvrf-get-table-id.py 36738 -1
Informações de lançamento
Função introduzida no Junos OS Evolved Release 20.3R1.
função get_task_vrf()
Sintaxe
vrf_name get_task_vrf(tid)
Descrição
Devolva a instância de roteamento junos OS associada ao ID do processo especificado.
Parâmetros
tid |
ID de processo para o qual recuperar a instância de roteamento associada. |
Valor de retorno
vrf_name | Nome da instância de roteamento associada ao ID do processo. |
Exemplos de uso
O exemplo a seguir recupera o ID do processo para o processo atual e associa a instância de roteamento a mgmt_junos
esse processo. Quando o script liga para a get_task_vrf()
função para solicitar a instância de roteamento para esse ID de processo, ele retorna a mgmt_junos
instância de roteamento.
[vrf:none] user@host:~# cat libpyvrf-set-task-vrf.py import libpyvrf as vrf import os, subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: pid = os.getpid() vrf.set_task_vrf(pid, "mgmt_junos") print ("Using routing instance:", vrf.get_task_vrf(pid)) subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
[vrf:none] user@host:~# python3 libpyvrf-set-task-vrf.py Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Informações de lançamento
Função introduzida no Junos OS Evolved Release 20.3R1.
Função preterida no Junos OS Evolved Release 22.1R1.
função get_vrf()
Sintaxe
vrf_name get_vrf()
Descrição
Devolva a instância de roteamento Junos OS associada ao processo atual.
Valor de retorno
vrf_name |
Nome da instância de roteamento associada ao processo atual. |
Exemplos de uso
O exemplo a seguir associa a mgmt_junos
instância de roteamento ao processo atual. Quando o script chama a get_vrf()
função para solicitar a instância de roteamento para o processo atual, ele retorna a mgmt_junos
instância de roteamento.
[vrf:none] user@host:~# cat libpyvrf-set-vrf.py import libpyvrf as vrf import subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: vrf.set_vrf("mgmt_junos") print ("Using routing instance:", vrf.get_vrf()) subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
[vrf:none] user@host:~# python3 libpyvrf-set-vrf.py Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Informações de lançamento
Função introduzida no Junos OS Evolved Release 20.3R1.
função set_socket_vrf()
Sintaxe
set_socket_vrf(socket_fd, vrf_name)
Descrição
Defina a instância de roteamento usada pelo soquete especificado. Definir a instância de roteamento para um soquete é útil quando vários soquetes dentro da mesma aplicação precisam usar diferentes instâncias de roteamento. Você pode definir o contexto da instância de roteamento para cada soquete individualmente sem afetar o contexto da instância de roteamento para o processo ou a aplicação.
Parâmetros
socket_fd |
Descritor de arquivos da Socket. |
vrf_name |
Nome de uma instância de roteamento Junos OS.
|
Informações de lançamento
Função introduzida no Junos OS Evolved Release 20.3R1.
função set_task_vrf()
Sintaxe
set_task_vrf(tid, vrf_name)
Descrição
Defina a instância de roteamento que o processo com o ID de processo especificado usará para realizar operações.
Considerando que set_vrf()
define a instância de roteamento para o processo atual, set_task_vrf()
define a instância de roteamento para o processo com o ID do processo especificado.
Parâmetros
tid |
Identificação de processo para o processo que usará a instância de roteamento especificada. |
vrf_name |
Nome de uma instância de roteamento Junos OS.
|
Exemplos de uso
O script Python da amostra a seguir recupera o ID do processo para o processo atual e associa a instância de roteamento a mgmt_junos
esse processo. Em seguida, o script encontra um host que só pode ser alcançado por essa instância de roteamento.
[vrf:none] user@host:~# cat libpyvrf-set-task-vrf.py import libpyvrf as vrf import os, subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: pid = os.getpid() vrf.set_task_vrf(pid, "mgmt_junos") print ("Using routing instance:", vrf.get_task_vrf(pid)) subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
[vrf:none] user@host:~# python3 libpyvrf-set-task-vrf.py Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Informações de lançamento
Função introduzida no Junos OS Evolved Release 20.3R1.
Função preterida no Junos OS Evolved Release 22.1R1.
função set_vrf()
Sintaxe
set_vrf(vrf_name)
Descrição
Defina a instância de roteamento que o processo atual usará para realizar operações. As buscas futuras usarão essa instância de roteamento.
Para associar uma instância de roteamento a um processo específico em vez do processo atual, use a set_task_vrf()
função.
Parâmetros
vrf_name |
Nome de uma instância de roteamento Junos OS.
|
Exemplos de uso
O script Python da amostra a seguir associa a mgmt_junos
instância de roteamento ao processo atual. Em seguida, o script encontra um host que só pode ser alcançado por essa instância de roteamento.
import libpyvrf as vrf import subprocess command = [ 'ping', '-c', '3', 'host1.example.com' ] try: vrf.set_vrf("mgmt_junos") print ("Using routing instance:", vrf.get_vrf()) subprocess.call(command) == 0 except vrf.invalid_table as e: print ("Invalid Table") except vrf.evo_not_ready as e: print ("Junos OS Evolved network stack is not ready") except vrf.error as e: print ("Generic libvrf error")
[vrf:none] user@host:~# python3 libpyvrf-set-vrf.py Using routing instance: mgmt_junos PING host1.example.com (198.51.100.10) 56(84) bytes of data. 64 bytes from host1.example.com (198.51.100.10): icmp_seq=1 ttl=60 time=1.02 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=2 ttl=60 time=0.672 ms 64 bytes from host1.example.com (198.51.100.10): icmp_seq=3 ttl=60 time=0.741 ms --- host1.example.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 0.876/0.946/1.001/0.063 ms
Informações de lançamento
Função introduzida no Junos OS Evolved Release 20.3R1.