Configurando Ansible para uso com equipamentos Juniper - Final
Tags: ansible, freebsd, juniper
Published: 2022-05-04 13:35:39

Na [parte 1](https://dev.to/cardosocristian/configurando-ansible-para-uso-com-equipamentos-juniper-parte-1-2io5) sobre uso do Ansible em equipamentos Juniper, mostrei como montar toda a infraestrutura para uso de Ansible em servidores rodando FreeBSD e também como se conectarmos no equipamento Juniper para execução de tarefas do Ansible, agora vamos à parte onde mostro como configurar alguns exemplos de tarefa que executamos no dia a dia e que podem ser útil para vocês.

Nesse post vamos criar 3 tipos distintos de tarefas, uma onde executamos comandos "literais", como se estivéssemos via cli, outro onde importamos um nível de configuração completo e por último como criarmos e configurarmos um vizinho BGP através de um template que se utiliza de variáveis para gerar o arquivo de configuração, ao fim do tutorial, vamos executar apenas a configuração do ASN e o vizinho BGP para mostrarmos a usabilidade das "tags" no ansible.

**Arquivos de template**

Lembre-se que na parte 1, criamos uma estrutura de diretórios base, para uso do Ansible, agora vamos criar mais um diretório, para mantermos nossos templates.
```
[ansible@ansible ~]$ mkdir roles/mx80/templates
```

Depois de criarmos o diretório vamos criar o arquivo "routing.conf" dentro do diretório de templates
[ansible@ansible ~]$ vim roles/mx80/templates/routing.conf

Ao acessar o arquivo, no meu caso, vou inserir a seguinte config:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4h2w92ztfz4cwmnhbt1f.png)

Por último vamos criar o arquivo para usarmos de template para configurações de vizinhos BGP, esse arquivo conterá diversos valores que vão ser editáveis via variáveis, dessa forma, o mesmo pode ser reutilizado em outros momentos, apenas mudando os valores das variáveis.
```
[ansible@ansible ~]$ vim roles/mx80/templates/bgp-neigh.j2
```


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/msyqks4u3rx8vhbd4nmm.png)

Como boa prática, o ideal em uma nova sessão BGP é que nada seja anunciado ou recebido, antes de validarmos se a sessão subiu corretamente e está tudo certo. Dessa forma em meu cenário existe a política de roteamento chamada "Nada", onde toda e qualquer rota é descartada em uma sessão BGP.
Quem tiver interesse em replicar ela em seu cenário, segue abaixo como ela é configurada.

```
ansible@mx80> show configuration policy-options policy-statement Nada | display set
set policy-options policy-statement Nada term End then reject
```
Basicamente a política acima, descarta qualquer rota BGP, quando inserida seja em um filtro de importação de rotas(import) ou filtro de exportação de rotas(export).

Isso garante que ao subirmos uma sessão BGP nada será recebido ou repassado de forma incorreta, além de ser uma boa prática.


**Populando variáveis para criação da tarefa de BGP**

Após mostrar como criar as tarefas e como gerar o template de configuração de vizinho BGP, vamos até o arquivo de variáveis do Ansible e vamos criar os campos que estão presentes no template e que na hora da execução irá buscar o valor no arquivo vars.yml para uso no template, que na execução da playbook, vão popular o arquivo.
```
[ansible@ansible ~]$ vim roles/mx80/vars/main.yml
```

No arquivo haverá os seguintes campos:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kbkv7qjucm2nwnnatjt7.png)

**Criação das tarefas**

Ao se logarmos com o usuário no servidor através do comando no terminal do nosso servidor, vamos abrir o arquivo de tarefas do ansible para iniciar a criação das tarefas
```
[root@ansible ~]# su - ansible
[ansible@ansible ~]$ vim roles/mx80/tasks/main.yml
```
Nos nossos arquivos vou usar o site [Carbon](https://carbon.now.sh/), porque acho que a visualização fica melhor 

Dentro do arquivo vamos criar as tarefas que mencionei anteriormente


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/szcgprkq0dy219414ohm.png)

O módulo de "tags" que existe em cada tarefa, pode ou não ser utilizado, dependendo da vontade de quem estiver executando a playbook, não efetuando a chamada de nenhuma tag, ele executará a playbook de cima para baixo da primeira à última tarefa.

**Botando pra rodar**

Agora com as tarefas já criadas, templates criados e variáveis populadas, vamos botar pra rodar a playbook e ver no que dá.

```
[ansible@ansible ~]$ ansible-playbook -i hosts prov-mx80.yml --tags routing-conf,bgp-arq-neighbor,bgp-conf-neighbor

PLAY [mx80] *****************************************************************************************************************************************************************************************************
TASK [mx80 : Inserindo routing-options] *************************************************************************************************************************************************************************changed: [mx80]

TASK [mx80 : Gerando arquivo de configuração BGP] ***************************************************************************************************************************************************************changed: [mx80 -> 127.0.0.1]

TASK [mx80 : configurando bgp via arquivo .conf] ****************************************************************************************************************************************************************changed: [mx80]

PLAY RECAP ******************************************************************************************************************************************************************************************************mx80-03-ita001             : ok=3    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```

A principio, tudo rodou corretamente, vamos ver agora no Juniper, se o router-id e o ASN foi inserido corretamente

```
ansible@mx80> show configuration routing-options
router-id 172.16.11.203;
autonomous-system 65001;
```
Acima temos as configurações de routing-options executada pelo nosso template routing.conf corretamente.

Agora, vamos ver se o BGP configurou o grupo de acordo com as variáveis inseridas:
```
ansible@mx80> show configuration protocols bgp group ansible-teste
type internal;
import Nada;
export Nada;
peer-as 65001;
neighbor 192.168.100.100 {
    description "Teste vizinho bgp via .conf ansible";
    local-address 192.168.100.101;
    import Nada;
    family inet {
        unicast;
    }
    export Nada;
}
neighbor 2001:db8::100:100 {
    description "Teste vizinho v6 bgp via .conf ansible";
    local-address 2001:db8::100:101;
    import Nada;
    family inet6 {
        unicast;
    }
    export Nada;
}
```

Agora vamos listar se a sessão BGP está sendo exibida, já que as configurações subiram corretamente

```
ansible@mx80> op show-bgp-neat | match 100
192.168.100.100                    65001  Idle         1:36             0       0         0         Teste vizinho bgp via .conf ansible
2001:db8::100:100                  65001  Idle         1:36             0       0         0         Teste vizinho v6 bgp via .conf ansible
```

Logicamente por motivos de estudo, não havia um vizinho BGP já ativo para a sessão já exibir estabelecida, por isso o estado em "Idle"

Nesse tutorial, foi dado continuidade na execução de tarefas com Ansible e automação de tarefas em Juniper, creio que já é um bom norte pra quem está começando e quer se aprofundar mais com automação de redes.

Deixo abaixo alguns links de referência que podem ser úteis:

[Módulos Ansible para Juniper](https://docs.ansible.com/ansible/latest/collections/junipernetworks/junos/index.html)

[Manual da Juniper sobre Ansible no Junos OS](https://www.juniper.net/documentation/us/en/software/junos-ansible/ansible/topics/concept/junos-ansible-overview.html)

[Módulos Ansible para Junos no Github](https://github.com/ansible-collections/junipernetworks.junos)