Exemplo: use o Junos PyEZ para carregar dados de configuração de um arquivo
A biblioteca Junos PyEZ permite que você execute tarefas operacionais e de configuração em dispositivos Junos. Este exemplo usa o utilitário Junos PyEZ jnpr.junos.utils.config.Config
para carregar dados de configuração de um arquivo local no servidor de gerenciamento de configuração em um dispositivo Junos.
Requisitos
Este exemplo usa os seguintes componentes de hardware e software:
Servidor de gerenciamento de configuração executando Python 3.5 ou posterior e Junos PyEZ Versão 2.0 ou posterior
Dispositivo Junos com NETCONF habilitado e uma conta de usuário configurada com permissões apropriadas
Par de chave SSH público/privado configurado para o usuário apropriado no servidor e dispositivo Junos
Visão geral
Este exemplo apresenta um aplicativo Python que usa o utilitário Junos PyEZ Config
para habilitar um novo script de operação na configuração do dispositivo especificado. O arquivo junos-config-add-op-script.conf , localizado no servidor de gerenciamento de configuração, contém os dados de configuração relevantes formatados como texto ASCII.
O aplicativo Python importa a Device
classe, que lida com a conexão com o dispositivo Junos; a Config
classe, que é usada para fazer alterações de configuração não estruturadas no dispositivo alvo; e exigiu exceções do módulo, que jnpr.junos.exception
contém exceções encontradas ao gerenciar dispositivos Junos. Este exemplo vincula a Config
instância à Device
instância em vez de criar uma variável independente para a instância da Config
classe.
Depois de criar a Device
instância para o dispositivo alvo, o open()
método estabelece uma sessão de conexão e NETCONF com o dispositivo. Os Config
métodos de utilidade então bloqueiam a configuração do candidato, carregam as alterações de configuração na configuração do candidato como uma load merge
operação, comprometem a configuração do candidato e depois a desbloqueiam.
O parâmetro do load()
método path
é definido para o caminho do arquivo de configuração. Como a extensão do arquivo de configuração indica o formato dos dados de configuração, o format
parâmetro é omitido da lista de argumentos. A configuração merge=True
indica que o dispositivo deve realizar uma load merge
operação.
Após a conclusão das operações de configuração, o aplicativo chama o close()
método para encerrar a sessão e a conexão netconf. O aplicativo inclui código para lidar com exceções, como LockError
erros que ocorrem ao bloquear a configuração e CommitError
para erros que ocorrem durante a operação de confirmação. O aplicativo também inclui código para lidar com quaisquer exceções adicionais que possam ocorrer.
Configuração
Criar o arquivo de dados de configuração
Procedimento passo a passo
Para criar o arquivo de dados de configuração que é usado pelo aplicativo Junos PyEZ:
Crie um novo arquivo com a extensão apropriada com base no formato dos dados de configuração, que neste exemplo é o texto ASCII.
Inclua as alterações de configuração desejadas no arquivo, por exemplo:
system { scripts { op { file bgp-neighbors.slax; } } }
Crie o aplicativo Junos PyEZ
Procedimento passo a passo
Para criar um aplicativo Python que usa o Junos PyEZ para fazer alterações de configuração em um dispositivo Junos:
Importe quaisquer módulos, aulas e objetos necessários.
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from jnpr.junos.exception import LockError from jnpr.junos.exception import UnlockError from jnpr.junos.exception import ConfigLoadError from jnpr.junos.exception import CommitError
Inclua quaisquer variáveis necessárias, que para este exemplo incluem o nome de host do dispositivo gerenciado e o caminho até o arquivo que contém os dados de configuração.
host = 'dc1a.example.com' conf_file = 'configs/junos-config-add-op-script.conf'
Crie uma
main()
definição de função e chamada de função e coloque as declarações restantes dentro da definição.def main(): if __name__ == "__main__": main()
Crie uma instância da
Device
classe e forneça o nome de host e quaisquer parâmetros necessários para essa conexão específica.Em seguida, abra uma conexão e estabeleça uma sessão netconf com o dispositivo.
# open a connection with the device and start a NETCONF session try: dev = Device(host=host) dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) return
Vincule a
Config
instância àDevice
instância.dev.bind(cu=Config)
Bloqueie a configuração.
# Lock the configuration, load configuration changes, and commit print ("Locking the configuration") try: dev.cu.lock() except LockError as err: print ("Unable to lock configuration: {0}".format(err)) dev.close() return
Carregue as mudanças de configuração e lide com quaisquer erros.
print ("Loading configuration changes") try: dev.cu.load(path=conf_file, merge=True) except (ConfigLoadError, Exception) as err: print ("Unable to load configuration changes: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return
Confirmar a configuração.
print ("Committing the configuration") try: dev.cu.commit(comment='Loaded by example.') except CommitError as err: print ("Unable to commit configuration: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return
Desbloqueie a configuração.
print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err))
Encerre a sessão da NETCONF e feche a conexão com o dispositivo.
# End the NETCONF session and close the connection dev.close()
Resultados
No servidor de gerenciamento de configuração, analise o aplicativo concluído. Se o aplicativo não exibir o código pretendido, repita as instruções neste exemplo para corrigir o aplicativo.
from jnpr.junos import Device from jnpr.junos.utils.config import Config from jnpr.junos.exception import ConnectError from jnpr.junos.exception import LockError from jnpr.junos.exception import UnlockError from jnpr.junos.exception import ConfigLoadError from jnpr.junos.exception import CommitError host = 'dc1a.example.com' conf_file = 'configs/junos-config-add-op-script.conf' def main(): # open a connection with the device and start a NETCONF session try: dev = Device(host=host) dev.open() except ConnectError as err: print ("Cannot connect to device: {0}".format(err)) return dev.bind(cu=Config) # Lock the configuration, load configuration changes, and commit print ("Locking the configuration") try: dev.cu.lock() except LockError as err: print ("Unable to lock configuration: {0}".format(err)) dev.close() return print ("Loading configuration changes") try: dev.cu.load(path=conf_file, merge=True) except (ConfigLoadError, Exception) as err: print ("Unable to load configuration changes: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return print ("Committing the configuration") try: dev.cu.commit(comment='Loaded by example.') except CommitError as err: print ("Unable to commit configuration: {0}".format(err)) print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) dev.close() return print ("Unlocking the configuration") try: dev.cu.unlock() except UnlockError as err: print ("Unable to unlock configuration: {0}".format(err)) # End the NETCONF session and close the connection dev.close() if __name__ == "__main__": main()
Execute o aplicativo Junos PyEZ
Execute o aplicativo
-
No servidor de gerenciamento de configuração, execute o aplicativo.
user@server:~$ python3 junos-pyez-config.py Locking the configuration Loading configuration changes Committing the configuration Unlocking the configuration
Verificação
Verifique a configuração
Propósito
Verifique se a configuração foi atualizada corretamente no dispositivo Junos.
Ação
Faça login no dispositivo Junos e visualize a configuração, o histórico de confirmações e os arquivos de log para verificar a configuração e confirmar. Por exemplo:
user@dc1a> show configuration system scripts op { file bgp-neighbors.slax; }
user@dc1a> show system commit 0 2014-07-29 14:40:50 PDT by user via netconf ...
user@dc1a> show log messages Jul 29 14:40:36 dc1a sshd[75843]: Accepted publickey for user from 198.51.100.1 port 54811 ssh2: RSA 02:dd:53:3e:f9:97:dd:1f:d9:31:e9:7f:82:06:aa:67 Jul 29 14:40:36 dc1a sshd[75843]: subsystem request for netconf by user user Jul 29 14:40:42 dc1a file[75846]: UI_COMMIT: User 'user' requested 'commit' operation (comment: Loaded by example.) Jul 29 14:40:45 dc1a mspd[75888]: mspd: No member config Jul 29 14:40:45 dc1a mspd[75888]: mspd: Building package info Jul 29 14:40:51 dc1a mspd[1687]: mspd: No member config Jul 29 14:40:51 dc1a mspd[1687]: mspd: Building package info Jul 29 14:40:51 dc1a file[75846]: UI_COMMIT_COMPLETED: commit complete
Significado
A configuração e o conteúdo do arquivo de log indicam que as declarações de configuração corretas foram configuradas e comprometidas com sucesso no dispositivo.
Solucionando problemas
- Resolução de problemas de erros de tempo limite
- Solucionar problemas de bloqueio de configuração
- Resolução de problemas de erros de mudança de configuração
Resolução de problemas de erros de tempo limite
Problema
O código Junos PyEZ gera uma mensagem RpcTimeoutError ou uma mensagem TimeoutExpiredError e não atualiza a configuração do dispositivo.
RpcTimeoutError(host: dc1a.example.com, cmd: commit-configuration, timeout: 30)
O tempo padrão de um RPC NETCONF para o tempo de saída é de 30 segundos. Grandes mudanças de configuração podem exceder esse valor, fazendo com que a operação fique sem tempo antes que a configuração possa ser carregada e comprometida.
Solução
Para acomodar mudanças de configuração que possam exigir um tempo de confirmação maior do que o intervalo de tempo limite padrão, definir o intervalo de tempo limite para um valor apropriado e refazer o código. Para configurar o intervalo, configure a Device
timeout
propriedade a um valor apropriado ou inclua o timeout=seconds
argumento quando você liga para o commit()
método para confirmar os dados de configuração em um dispositivo. Por exemplo:
dev = Device(host="host") dev.open() dev.timeout = 300 ... dev.cu.commit(timeout=360)
Solucionar problemas de bloqueio de configuração
Problema
O código Junos PyEZ gera uma mensagem lockerror indicando que a configuração não pode ser bloqueada. Por exemplo:
LockError(severity: error, bad_element: None, message: configuration database modified)
Um erro de bloqueio de configuração pode ocorrer pelos seguintes motivos:
Outro usuário tem um bloqueio exclusivo na configuração.
O banco de dados de configuração compartilhada não comprometeu as alterações.
O usuário que executa o código Junos PyEZ não tem permissões para configurar o dispositivo.
Solução
Se outro usuário tiver um bloqueio exclusivo na configuração ou tiver modificado a configuração, aguarde até que a fechadura seja liberada ou as alterações sejam comprometidas e execute o código novamente. Se a causa do problema for que o usuário não tem permissões para configurar o dispositivo, execute o aplicativo com um usuário que tenha as permissões necessárias ou, se apropriado, configure o dispositivo Junos para dar ao usuário atual as permissões necessárias para fazer as alterações.
Resolução de problemas de erros de mudança de configuração
Problema
O código Junos PyEZ gera uma mensagem do ConfigLoadError indicando que a configuração não pode ser modificada devido a um problema de permissões.
ConfigLoadError(severity: error, bad_element: scripts, message: permission denied)
Essa mensagem de erro pode ser gerada quando o usuário que executa o código Junos PyEZ tiver permissão para alterar a configuração, mas não tem permissão para alterar a parte desejada da configuração.
Solução
Execute o aplicativo com um usuário que tenha as permissões necessárias ou, se apropriado, configure o dispositivo Junos para dar ao usuário atual as permissões necessárias para fazer as alterações.