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_junosdedicada 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 quandolibvrfretorna 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 foode 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.