Usando modelos avançados de velocidade no Cisco DNA Center

Usando modelos avançados de velocidade no Cisco DNA Center

Usando modelos avançados de velocidade no Cisco DNA Center 1
cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


O blog anterior desta série abordou a incorporação de comandos interativos e de nível de executivo em modelos. Este blog se concentra em passar dados estruturados para modelos, algo aplicável principalmente a chamadas de API.

Se você precisar de uma atualização na API do programador de modelos ou um exemplo de script python para usá-los, confira esta postagem no blog. Ele também contém um link para um repositório do github com o código de exemplo.

Enviando variáveis ​​para um modelo.

A interface do usuário é um pouco restritiva, pois não permite o envio de cargas JSON. A API funciona e a ferramenta de modelo mostra como funciona. Primeiro, liste o conteúdo do modelo (chamado “int-desc” na pasta “adam”). O corpo é bem simples, apenas duas variáveis, o script também as chama explicitamente. Como esse é um código educacional, mostra as chamadas de API necessárias. A primeira chamada de API procura o modelo (você não pode procurar um modelo pelo nome) e a segunda obtém a versão mais recente (lembre-se de que os modelos têm versão). Nesse caso, a versão 7 é a mais recente. Em seguida, mostra o corpo do modelo e os parâmetros necessários (se houver). Os parâmetros são formatados de tal maneira que podem ser recortados e colados como um argumento para o script na próxima etapa.

$ ./template.py --template adam/int-desc
Looking for: adam/int-desc
https://dnac:443/dna/intent/api/v1/template-programmer/template
TemplateId: 019eaa38-a62e-4a12-adf6-866696d69e8f Version: 7 

https://dnac:443/dna/intent/api/v1/template-programmer/template/019eaa38-a62e-4a12-adf6-866696d69e8f
Showing Template Body:
interface $int
description ${desc}:AUTO


Required Parameters for template body: {"int":"","desc":""}

Bindings []

Para chamar a API do modelo, você precisa enviar um dicionário JSON de parâmetros. Observe que o JSON está entre aspas simples, para proteger as aspas duplas “”, que são obrigatórias para JSON. Neste exemplo, os valores para “int” e “desc” são fornecidos como uma carga útil JSON.

$ ./template.py --template adam/int-desc --device 10.10.15.200 --params '{"int":"g2/0/10","desc":"Example"}'

Dados digitados

As cargas úteis JSON têm tipos, cadeias, números inteiros e booleanos. Pode ser importante garantir que a carga útil seja passada usando o tipo apropriado.

Leia Também  APIdays Paris: tudo leva a APIs

Considere o seguinte modelo. Se o “interfaceMax” estiver definido como 3, g2 / 0 / 11-13 será executado em loop. Geralmente, isso é usado para membros da pilha, mas o exemplo usa o número da interface para fins ilustrativos.

#foreach ($intf in [1..${interfaceMax}])
interface range gig 2/0/1${intf}
description ADAM
#end

Se esse modelo for chamado da seguinte maneira, nada acontecerá.

./template.py --template adam/int-loop --device 10.10.15.200 --params '{"interfaceMax" : "3"}'

Uma mudança sutil trará o resultado certo. A diferença é que “3” é uma string, enquanto 3 é um número inteiro. O loop passará pelos valores 1,2,3.

./template.py --template adam/int-loop --device 10.10.15.200 --params '{"interfaceMax" : 3}'

Dados Estruturados

O exemplo permite apenas uma interface e descrição. Que tal enviar uma lista delas? Isto é realmente simples. Considere o seguinte modelo. $ {pairs} é uma lista e cada elemento possui dois atributos e interface ($ pair.int) e uma descrição ($ pair.desc).

#foreach ($pair in ${pairs})
interf $pair.int
desc $pair.desc
#end

Para executar este modelo, forneça a seguinte carga útil. Isso pode parecer complexo, mas é bastante simples (lembre-se de que são dados estruturados, provavelmente gerados por máquina). Uma lista de pares int / desc é fornecida.

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br
./template.py --template adam/json_input  --device 10.10.15.200 --params '{"pairs" : [{"int":"g2/0/10", "desc" : "one"},{"int":"g2/0/11", "desc":"two"}]}' 

Uma dica simples é colocar a carga útil do json em um mecanismo de validação JSON (você pode até usar python).

$ python
Python 3.7.6 (default, Dec 30 2019, 19:38:36) 
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import json
>>> print(json.dumps(json.loads('{"pairs" : [{"int":"g2/0/10", "desc" : "one"},{"int":"g2/0/11", "desc":"two"}]}'), indent=2))
{
  "pairs": [
    {
      "int": "g2/0/10",
      "desc": "one"
    },
    {
      "int": "g2/0/11",
      "desc": "two"
    }
  ]
} 

Outro exemplo permite enviar trechos de configuração para um conjunto de interfaces. Bem parecido com o exemplo acima, exceto que é preciso uma sequência de configurações (em vez de apenas uma descrição).

#foreach ($pair in ${pairs})
int $pair.int
$pair.config
#end

E pode ser executado da seguinte maneira. Isso enviará as linhas de configuração necessárias para cada interface.

./template.py --template adam/json_int_config  --device 10.10.15.200 --params '{"pairs" : [{"int":"g2/0/10", "config" : "switchport mode accessnswitchport access vlan 100"},{"int":"g2/0/11", "config":" switchport mode accessnswitchport access vlan 101"}]}'

Usando macros

Embora o anterior seja muito flexível, permitindo qualquer configuração para qualquer interface, ele não promove a padronização. O modelo a seguir usa macros de velocidade para configurações de porta padrão. Uma macro é usada para “userport” e recebe um argumento “$ vlan”. Esta é uma variável privada. A macro “apport” recebe dois argumentos. O nome da macro é passado (como parâmetro). O “#AvalieO comando ”é necessário para executar a macro.

#macro  (userport $vlan)
description User Port
switchport access vlan $vlan
switchport mode access
switchport voice vlan 20
switchport host
#end

#macro (apport $desc $vlanrange)
 description $desc
 switchport trunk allowed vlan 10,$vlanrange
 switchport trunk native vlan 10
 switchport mode trunk
 spanning-tree portfast trunk
 ip arp inspection limit none
 cdp enable
#end

#foreach ($config in ${configs})
interface $config.int
#evaluate($config.macro_)
#end

O apport de macro requer seqüências de caracteres como argumentos, portanto, as aspas precisam ser escapadas.

./template.py --template adam/macro_loop_json  --device 10.10.15.200 --params '{"configs" : [{"int":"g2/0/10", "macro_" : "#userport(100)"},{"int":"g2/0/11", "macro_":"#apport("link_AP1", "100,101")"}]}'

Qual o proximo?

Este blog mostra exemplos de transmissão de dados estruturados. Não fique impressionado com a complexidade percebida das cargas úteis nesses exemplos. Lembre-se, eles serão gerados programaticamente e fornecidos como entrada para a chamada da API. Os exemplos são apenas uma ilustração simples dos conceitos.

Leia Também  Qual é o segundo elemento fundamental que você precisa para uma rede pronta para multicloud?

O próximo blog examinará a interface do usuário e como vários modelos podem ser aplicados a um site.

Se você estiver interessado em usar a API para aplicar modelos a dispositivos, esta postagem no blog terá uma ferramenta python de exemplo para aplicar modelos.

Enquanto isso, se você quiser saber mais sobre o Cisco DNA Center, visite o Cisco Devnet.

Obrigado pela leitura

@ adamradford123

Recursos relacionados:

Compartilhar: