NESTA PÁGINA
Exemplo: usar sal para configurar dispositivos que executam o Junos OS
A Juniper Networks oferece suporte para o uso de 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 pingar e realizar 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.
Hostname |
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
set
o formato de comando. O modelo usa a extensão de arquivo .set para indicar o formato.Arquivos pillar — Defina 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 no diretório /srv/pillar/bgp no salt master.
Arquivo superior pilar — mapeia cada arquivo de pilar para o minion proxy apropriado.
Arquivo de estado — define o estado para aplicar aos dispositivos-alvo. Nesse caso, o arquivo de estado usa a
junos.install_config
função para aplicar a configuração BGP a um dispositivo.Estado de arquivo superior — 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 é carregado e comprometido 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 de modelo é colocado no diretório /srv/sal/configurações do mestre salt.
Em seguida, você cria arquivos de pilar separados para cada dispositivo e define os dados de configuração específicos do dispositivo no arquivo. Cada arquivo de pilar define uma BGP_data
chave que contém todos os parâmetros variáveis mencionados no modelo de configuração. O arquivo superior do pilar mapeia cada arquivo de pilar 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 estado a junos_bgp_config
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 do pilar 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á for 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 de Established
cada peer definido nos dados ou horários do pilares desse dispositivo. Esse estado pressupõe que o BGP esteja em execução 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 pilar 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.3
Defina 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.3
Defina 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.2
No 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/r3
Atualize 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 usado para gerar a configuração BGP:
Crie um arquivo chamado /srv/salt/configs/junos-config-bgp-template.set no salt master.
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 mestre salt.
Defina um estado que usa a
junos.install_config
funçã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: True
Nota: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_config
função pode precisar ser definidatemplate_vars: True
para renderizar o modelo.No arquivo superior, defina as metas às quais o estado de junos_bgp_config se aplica. Os alvos incluem todos os dispositivos que têm um
BGP_data
item 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 BPG têm um peer-state
de Established
:
Crie um arquivo chamado /srv/salt/junos_bgp_verify_peers.sls no mestre salt.
Definir um estado que usa a
junos.rpc
função para executar oget-bgp-neighbor-information
RPC e, em seguida, verifica a resposta RPC para umpeer-state
deEstablished
.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 alto, os estados do 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 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 aos dispositivos-alvo e revise 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 o peer-state
seja igual a Established
cada peer. A saída indica que essa condição é atendida para todos os pares em cada dispositivo. Como alternativa, 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 Erros de carga de configuração
Problema
O mestre salt gera um ConfigLoadError
erro indicando que ele falhou em carregar a configuração no dispositivo por causa de 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 pilar definidos para esse dispositivo. O sal 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.