NESTA PÁGINA
Exemplo: use o sal para configurar dispositivos que executam o Junos OS
A Juniper Networks oferece suporte para usar o Salt para gerenciar dispositivos que executam o Junos OS. Este exemplo usa Salt para configurar vários dispositivos que executam o Junos OS.
Requisitos
Este exemplo usa os seguintes componentes de hardware e software:
Três roteadores da Série MX executando o Junos OS com NETCONF habilitado
Mestre de sal com os seguintes requisitos:
Versão salt 3001 ou posterior
Pode ping e executar operações nos dispositivos que executam o Junos OS
Visão geral
Este exemplo define um estado Salt que configura sessões de peering BGP nos dispositivos alvo que executam o Junos OS. A Tabela 1 descreve os nomes de host do dispositivo, IDs proxy e arquivos específicos do dispositivo.
Nome de host |
Proxy ID |
Arquivo de configuração de proxy (/srv/pilar) |
Arquivo de dados BGP (/srv/pilar/bgp) |
|---|---|---|---|
r1 |
r1 |
r1-proxy.sls |
r1.sls |
r2 |
r2 |
r2-proxy.sls |
r2.sls |
r3 |
r3 |
r3-proxy.sls |
r3.sls |
O exemplo usa os seguintes componentes:
Modelo de configuração jinja2 — define a configuração BGP como um modelo Jinja usando
setformato de comando. O modelo usa a extensão de arquivo .set para indicar o formato.Arquivos pilar — Definir os dados de configuração específicos do dispositivo exigidos pelo modelo Jinja2. Os dados de cada dispositivo são armazenados em um arquivo separado sob o diretório /srv/pillar/bgp no mestre Salt.
Arquivo superior do pilar — mapeia cada arquivo de pilares para o minion proxy apropriado.
Arquivo de estado — define o estado a ser aplicado aos dispositivos-alvo. Neste caso, o arquivo de estado usa a
junos.install_configfunção para aplicar a configuração BGP a um dispositivo.Estado superior do arquivo — mapeia o arquivo de estado para os dispositivos nos quais o estado deve ser aplicado.
Neste exemplo, você cria um modelo Jinja2 para gerar a configuração BGP que é carregada e comprometida no dispositivo. O modelo substitui as variáveis por dados de configuração específicos do dispositivo para que possam ser reutilizados conforme necessário. O arquivo modelo é colocado sob o diretório /srv/sal/configs no mestre salt.
Em seguida, você cria arquivos de pilares separados para cada dispositivo e define os dados de configuração específicos do dispositivo no arquivo. Cada arquivo pilar define uma BGP_data chave que contém todos os parâmetros variáveis que são mencionados no modelo de configuração. O arquivo superior do pilar mapeia cada arquivo de pilares para seu respectivo minion proxy. Armazenar os dados em pilares garante que cada minion proxy só possa acessar os dados desse dispositivo.
O arquivo de estado junos_bgp_config.sls define um estado que usa a junos.install_config função para aplicar a configuração BGP no modelo. Quando invocada, a função bloqueia o banco de dados de configuração, carrega a configuração específica para o dispositivo alvo, compromete a configuração e, em seguida, desbloqueia o banco de dados. A função inclui o diffs_file parâmetro para armazenar as diferenças de configuração em um arquivo no servidor de minion proxy. O nome do arquivo usa o id grão para gerar nomes de arquivo específicos do dispositivo para os arquivos de saída.
O arquivo superior do estado aplica o junos_bgp_config estado a qualquer minion com uma BGP_data chave de pilar com qualquer valor. Quando você executa um estado alto ou aplica esse estado a um dispositivo, Salt usa o modelo e os dados dos pilares para gerar a configuração específica para o alvo e, em seguida, invoca a junos.install_config função para carregar e comprometer a configuração no dispositivo. Se a configuração já estiver aplicada, a junos.install_config função não reaplica a configuração.
Depois de configurar os dispositivos, você aplica o junos_bgp_verify_peers estado. Esse estado executa o get-bgp-neighbor-information RPC em cada dispositivo até que ele devolva um peer-state valor Established para cada peer definido nos dados ou horários pilares desse dispositivo. Esse estado assume que o BGP está sendo executado no dispositivo.
Configuração
Para configurar os dispositivos que usam Salt, execute as tarefas incluídas nesta seção.
Definir os dados do pilar
Procedimento passo a passo
Para definir os dados de pilares que são usados com o modelo Jinja2 para gerar a configuração BGP:
No mestre Salt, crie um arquivo separado chamado /srv/pillar/bgp/hostname.sls para cada dispositivo gerenciado.
Defina os dados do host r1 no arquivo r1.sls .
BGP_data: loopback: 192.168.0.1 local_asn: 64521 neighbors: - interface: ge-0/0/0 name: to-r2 asn: 64522 peer_ip: 198.51.100.2 local_ip: 198.51.100.1 peer_loopback: 192.168.0.2 - interface: ge-0/0/1 name: to-r3 asn: 64523 peer_ip: 198.51.100.6 local_ip: 198.51.100.5 peer_loopback: 192.168.0.3Defina os dados do host r2 no arquivo r2.sls .
BGP_data: loopback: 192.168.0.2 local_asn: 64522 neighbors: - interface: ge-0/0/0 name: to-r1 asn: 64521 peer_ip: 198.51.100.1 local_ip: 198.51.100.2 peer_loopback: 192.168.0.1 - interface: ge-0/0/1 name: to-r3 asn: 64523 peer_ip: 198.51.100.10 local_ip: 198.51.100.9 peer_loopback: 192.168.0.3Defina os dados do host r3 no arquivo r3.sls .
BGP_data: loopback: 192.168.0.3 local_asn: 64523 neighbors: - interface: ge-0/0/0 name: to-r1 asn: 64521 peer_ip: 198.51.100.5 local_ip: 198.51.100.6 peer_loopback: 192.168.0.1 - interface: ge-0/0/1 name: to-r2 asn: 64522 peer_ip: 198.51.100.9 local_ip: 198.51.100.10 peer_loopback: 192.168.0.2No arquivo superior do pilar, mapeie o arquivo pilar com os dados BGP sob o ID do dispositivo apropriado para permitir que o dispositivo acesse os dados.
saltuser@salt-master:~$ cat /srv/pillar/top.sls base: 'r1': - r1-proxy - bgp/r1 'r2': - r2-proxy - bgp/r2 'r3': - r3-proxy - bgp/r3Atualize os dados dos pilares.
saltuser@salt-master:~$ sudo salt '*' saltutil.refresh_pillar r3: True r1: True r2: True
Definir o modelo Jinja2
Procedimento passo a passo
Para criar o modelo Jinja2 que é usado para gerar a configuração BGP:
Crie um arquivo chamado /srv/salt/configs/junos-config-bgp-template.set no mestre do sal.
Adicione o modelo de configuração BGP ao arquivo e reserve-o.
saltuser@salt-master:~$ cat /srv/salt/configs/junos-config-bgp-template.set {% if pillar.BGP_data %} set interfaces lo0 unit 0 family inet address {{ pillar.BGP_data.loopback }}/32 set policy-options policy-statement bgp-ecmp then load-balance per-packet set policy-options policy-statement bgp-in then accept set policy-options policy-statement bgp-out then next-hop self set policy-options policy-statement bgp-out then accept set protocols bgp group underlay type external set protocols bgp group underlay import bgp-in set protocols bgp group underlay export bgp-out set protocols bgp group underlay local-as {{ pillar.BGP_data.local_asn }} set protocols bgp group underlay multipath multiple-as set routing-options router-id {{ pillar.BGP_data.loopback }} set routing-options forwarding-table export bgp-ecmp {% for neighbor in pillar.BGP_data.neighbors %} set interfaces {{ neighbor.interface }} unit 0 description {{ neighbor.name }} set interfaces {{ neighbor.interface }} unit 0 family inet address {{ neighbor.local_ip }}/30 set protocols bgp group underlay neighbor {{ neighbor.peer_ip }} peer-as {{ neighbor.asn }} set protocols lldp interface {{ neighbor.interface }} {% endfor %} {% endif %}
Definir os Estados
Definir o arquivo de estado de configuração
Para definir o arquivo de estado que aplica a configuração:
Crie um arquivo chamado /srv/salt/junos_bgp_config.sls no salt master.
Definir um estado que usa a
junos.install_configfunção para aplicar a configuração BGP no modelo.saltuser@salt-master:~$ cat /srv/salt/junos_bgp_config.sls Apply BGP configuration: junos.install_config: - name: salt://configs/junos-config-bgp-template.set - comment: Configuring BGP using Salt - diffs_file: /var/log/salt/output/{{ grains['id'] }}_junos_bgp_config_diff - template_vars: TrueNota:Se o seu modelo incluir apenas variáveis internas de sal, como dados de pilares, dados de grãos e funções, a
junos.install_configfunção pode precisar ser definidatemplate_vars: Truepara renderizar o modelo.No arquivo superior, defina as metas a que o estado junos_bgp_config se aplica. Os alvos incluem todos os dispositivos que têm um
BGP_dataitem pilar definido.saltuser@salt-master:~$ cat /srv/salt/top.sls base: BGP_data:*: - match: pillar - junos_bgp_config
Definir o arquivo de estado de verificação BGP
Para definir o estado que verifica que os pares do BPG têm um peer-state de Established:
Crie um arquivo chamado /srv/salt/junos_bgp_verify_peers.sls no salt master.
Defina um estado que usa a
junos.rpcfunção para executar oget-bgp-neighbor-informationRPC e, em seguida, verifica a resposta do RPC para obter umpeer-statedeEstablished.saltuser@salt-master:~$ cat /srv/salt/junos_bgp_verify_peers.sls {% for peer in pillar['BGP_data']['neighbors'] %} validate_bgp_session_state_with_{{ peer['peer_ip'] }}: loop.until: - name: junos.rpc - condition: m_ret['rpc_reply']['bgp-information']['bgp-peer']['peer-state'] == 'Established' - period: 5 - timeout: 20 - m_args: - get-bgp-neighbor-information - m_kwargs: neighbor-address: {{ peer['peer_ip'] }} {% endfor %}
Resultados
Quando você executa um estado superior, os estados no top.sls arquivo são aplicados aos dispositivos alvo apropriados.
saltuser@salt-master:~$ sudo salt '*' state.apply
r1:
----------
ID: Apply BGP configuration
Function: junos.install_config
Name: salt://configs/junos-config-bgp-template.set
Result: True
Comment:
Started: 07:07:14.449582
Duration: 3379.914 ms
Changes:
----------
message:
Successfully loaded and committed!
out:
True
Summary for r1
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 3.380 s
r2:
----------
ID: Apply BGP configuration
Function: junos.install_config
Name: salt://configs/junos-config-bgp-template.set
Result: True
Comment:
Started: 07:07:14.485640
Duration: 3132.677 ms
Changes:
----------
message:
Successfully loaded and committed!
out:
True
Summary for r2
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 3.133 s
r3:
----------
ID: Apply BGP configuration
Function: junos.install_config
Name: salt://configs/junos-config-bgp-template.set
Result: True
Comment:
Started: 07:07:14.388629
Duration: 3431.723 ms
Changes:
----------
message:
Successfully loaded and committed!
out:
True
Summary for r3
------------
Succeeded: 1 (changed=1)
Failed: 0
------------
Total states run: 1
Total run time: 3.432 s
Verificação
Verificando a configuração do BGP
Propósito
Verifique se a sessão BGP está estabelecida para cada endereço vizinho.
Ação
Aplique o junos_bgp_verify_peers estado nos dispositivos-alvo e analise a saída.
saltuser@salt-master:~$ sudo salt '*' state.apply junos_bgp_verify_peers
r1:
----------
ID: validate_bgp_session_state_with_198.51.100.2
Function: loop.until
Name: junos.rpc
Result: True
Comment: Condition m_ret['rpc_reply']['bgp-information']['bgp-peer']['peer-state'] == 'Established' was met
Started: 07:17:01.825414
Duration: 125.241 ms
Changes:
----------
ID: validate_bgp_session_state_with_198.51.100.6
Function: loop.until
Name: junos.rpc
Result: True
Comment: Condition m_ret['rpc_reply']['bgp-information']['bgp-peer']['peer-state'] == 'Established' was met
Started: 07:17:01.950786
Duration: 148.944 ms
Changes:
Summary for r1
------------
Succeeded: 2
Failed: 0
------------
Total states run: 2
Total run time: 274.185 ms
r3:
----------
ID: validate_bgp_session_state_with_198.51.100.5
Function: loop.until
Name: junos.rpc
Result: True
Comment: Condition m_ret['rpc_reply']['bgp-information']['bgp-peer']['peer-state'] == 'Established' was met
Started: 07:17:02.849612
Duration: 99.527 ms
Changes:
----------
ID: validate_bgp_session_state_with_198.51.100.9
Function: loop.until
Name: junos.rpc
Result: True
Comment: Condition m_ret['rpc_reply']['bgp-information']['bgp-peer']['peer-state'] == 'Established' was met
Started: 07:17:02.949265
Duration: 165.041 ms
Changes:
Summary for r3
------------
Succeeded: 2
Failed: 0
------------
Total states run: 2
Total run time: 264.568 ms
r2:
----------
ID: validate_bgp_session_state_with_198.51.100.1
Function: loop.until
Name: junos.rpc
Result: True
Comment: Condition m_ret['rpc_reply']['bgp-information']['bgp-peer']['peer-state'] == 'Established' was met
Started: 07:17:02.811094
Duration: 143.335 ms
Changes:
----------
ID: validate_bgp_session_state_with_198.51.100.10
Function: loop.until
Name: junos.rpc
Result: True
Comment: Condition m_ret['rpc_reply']['bgp-information']['bgp-peer']['peer-state'] == 'Established' was met
Started: 07:17:02.954551
Duration: 170.651 ms
Changes:
Summary for r2
------------
Succeeded: 2
Failed: 0
------------
Total states run: 2
Total run time: 313.986 ms
Significado
O arquivo de estado exige que seja peer-state igual para Established cada peer. A saída indica que essa condição é atendida para todos os pares em cada dispositivo. Alternativamente, você pode usar a junos.cli função para executar o show bgp summary comando nos dispositivos e revisar a saída para verificar se a sessão BGP está estabelecida para cada endereço vizinho.
Solucionando problemas
Resolução de problemas de erros de carga de configuração
Problema
O mestre do Salt gera um ConfigLoadError erro que indica que ele falhou em carregar a configuração no dispositivo devido a um erro de sintaxe.
message:
Could not load configuration due to : "ConfigLoadError(severity: error, bad_element: interface1, message: error: syntax error)"
Solução
Salt torna a configuração do Junos OS usando o modelo Jinja2 e os dados de pilares definidos para esse dispositivo. Salt gera um erro de sintaxe quando o modelo Jinja2 produz uma configuração inválida. Para corrigir esse erro, atualize o modelo Jinja2 para corrigir o elemento identificado pela bad_element chave na mensagem de erro.