Utilizando Ansible para configuração de equipamentos Fortinet
Tags: ansible, fortinet, freebsd
Published: 2022-06-02 15:58:44

Nesse post vou tentar mostrar como executar playbooks do Ansible em equipamentos da marca Fortinet.
Para essa empreitada, vamos reutilizar o servidor criado no tutorial referente à utilização de ansible com Juniper, aqui tem o [link](https://dev.to/cardosocristian/configurando-ansible-para-uso-com-equipamentos-juniper-parte-1-2io5) para quem quiser reproduzir o ambiente, ou simplesmente quer copiar minhas configurações de Ansible já criadas. Mas quem estiver lendo pode utilizar qualquer máquina com Linux que execute Ansible ou até mesmo um docker com Ansible, vai do gosto do freguês.

Importante lembrar, que no meu exemplo estou utilizando VDOMs no meu equipamento da Fortinet e já possuímos conexão via IP em uma interface pré-configurada para conexão.

**1 - Preparando o ambiente**

Como informei acima, vou reutilizar meu servidor FreeBSD para execução do Ansible e as playbooks, então para que o Ansible já instalado seja compatível com equipamentos da Fortinet, é necessário instalarmos a coleção de bibliotecas referentes à Fortinet.

```
[ansible@ansible ~]$ ansible-galaxy collection install fortinet.fortios
```
Com o comando acima instalamos a biblioteca necessária para executação das playbooks com Ansible.

```
[ansible@ansible ~]$ ansible-galaxy collection list

# /home/ansible/.ansible/collections/ansible_collections
Collection        Version
----------------- -------
ansible.netcommon 2.6.1
ansible.utils     2.5.2
fortinet.fortios  2.1.6
```

Feito a instalação da coleção acima, vamos configurar o arquivo de hosts, com nosso Fortigate, a senha e a variável que informa ao Ansible qual coleção utilizar para conexão.

```
[fortigate]
60f ansible_user="ansible-fortinet" ansible_password="patobranco123"

[fortigate:vars]
ansible_network_os=fortinet.fortios.fortios
```
Acima inserimos o host **"60f"** com o usuário ansible-fortinet e a senha de conexão, além de referenciarmos para o ansible que os hosts do tipo **"fortigate"**, vão usar a coleção **"fortinet.fortios.fortios"**

No arquivo de **"/etc/hosts"**, vamos inserir o hostname 60f com o IP do equipamento, uma vez que não estamos usando um servidor DNS para resolver automaticamente o nome.

```
[ansible@ansible ~]$ cat /etc/hosts | grep 60f
192.168.10.1 60f
```

Também é necessário criar no Fortigate o usuário ansible-fortinet, para conexão do ansible, com permissão de super-admin.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/67slvej72n6y02mzl8s7.PNG)
Acima limitamos os hosts confiáveis de acesso desse usuário à apenas o IP do nosso servidor Ansible por razões de segurança.

Após as configurações de host e usuário do Fortinet, vamos criar a estrutura de diretórios.

```
[ansible@ansible ~]$ mkdir -p roles/fortinet
[ansible@ansible ~]$ mkdir -p roles/fortinet/system
[ansible@ansible ~]$ mkdir -p roles/fortinet/firewall
[ansible@ansible ~]$ mkdir -p roles/fortinet/router
```
Criamos acima diretórios para separarmos as playbooks de forma organizada, onde **"system"** é para configurações de interface, **"firewall"**, para regras de firewall, criação de objetos IP e novas portas TCP/UDP, por último a pasta **"router"** é para configurações de roteador, seja OSPF, BGP ou mesmo rotas estáticas.


**2 - Criando playbooks de inserção de interface com VLAN + IP's**

Com toda a estrutura criada, vamos criar nossa primeira playbook, vamos começar pela inserção de interface vlan + IP's via Ansible


```
[ansible@ansible ~]$ nvim roles/fortinet/system/interface.yml
```


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

Após a inserção da playbook no diretório, vamos para a execução:

```
[ansible@ansible ~]$ ansible-playbook -i hosts roles/fortinet/system/interface.yml

PLAY [60f] ****************************************************************************************************************************************************************************************************

TASK [Inserindo VLAN/IP no roteador] ****************************************************************************************************************************************************************************
changed: [60f]

PLAY RECAP ******************************************************************************************************************************************************************************************************
60f                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```
Após a execução sem erros, vamos ver como ficou na config:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7oss0a6973xzrj8roxki.PNG)

Com a criação da playbook, executamos com sucesso a configuração da VLAN 100, na VDOM **"Publica"** no equipamento.


Aqui [link](https://ansible-galaxy-fortios-docs.readthedocs.io/en/latest/gen/fortios_system_interface.html) para o módulo de interfaces, para quem quiser explorar todas as funções de configuração.

**3 - Criando playbook de regra de firewall de Entrada/Saída na rede local do Fortinet**

OBS: Vamos partir do principio, que já existia uma interface VLAN para a rede interna nessa configuração

Agora que já temos a interface criada e configurada, vamos criar uma playbook com regras de Entrada e saída de firewall para a VLAN100 e a rede interna da VDOM **"Publica"**

```
[ansible@ansible ~]$ nvim roles/fortinet/firewall/regras.yml
```

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

Após criamos a playbook acima, vamos botar pra executar e ver se tudo funcionou:

```
[ansible@ansible ~]$ ansible-playbook -i hosts roles/fortinet/firewall/regras.yml

PLAY [60f] ****************************************************************************************************************************************************************************************************

TASK [Regras de firewall de entrada da rede] ********************************************************************************************************************************************************************
changed: [60f]

TASK [Regras de firewall de saida da rede] **********************************************************************************************************************************************************************
changed: [60f]

PLAY RECAP ******************************************************************************************************************************************************************************************************
60f                      : ok=2    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```


Após a execução retornar que funcionou e executou as modificações corretamente, vamos verificar na interface do Fortinet se ficou tudo como esperado.


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

[Link](https://ansible-galaxy-fortios-docs.readthedocs.io/en/galaxy-2.1.6/gen/fortios_firewall_policy.html) do módulo

**4 - Criando playbook de criação de objetos dentro do firewall**

Agora vamos botar para executar uma playbook, onde criamos um objeto dentro do firewall.

```
[ansible@ansible ~]$ nvim roles/fortinet/firewall/objeto.yml
```

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

Depois de criamos a playbook com o objeto desejado, vamos botar pra rodar

```
[ansible@ansible ~]$ ansible-playbook -i hosts roles/fortinet/firewall/objeto.yml

PLAY [60f] ****************************************************************************************************************************************************************************************************

TASK [Cadastro IP de DNS do Google] *****************************************************************************************************************************************************************************
changed: [60f]

PLAY RECAP ************************************************************************************************************************************
******************************************************************
60f                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```

Depois do sucesso na execução, vamos ver se o objeto foi criado no equipamento


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0kycpqims3ube57mjown.PNG)

[Link](https://ansible-galaxy-fortios-docs.readthedocs.io/en/galaxy-2.1.6/gen/fortios_firewall_address.html) do módulo

**5 - Criando playbook de criação de serviços no firewall**

Vamos também criar um serviço no Fortinet, para quem não sabe é assim que o equipamento chama uma porta com protocolo TCP/UDP no sistema, vamos lá

```
[ansible@ansible ~]$ nvim roles/fortinet/firewall/servico.yml
```



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

```
[ansible@ansible ~]$ ansible-playbook -i hosts roles/fortinet/firewall/servico.yml

PLAY [60f] ****************************************************************************************************************************************************************************************************

TASK [Criando porta GRAFANA] ************************************************************************************************************************************************************************************
[WARNING]: The value "3000" (type int) was converted to "'3000'" (type string). If this does not look like what you expect, quote the entire value to ensure it does not change.
changed: [60f]

PLAY RECAP ******************************************************************************************************************************************************************************************************
60f                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```
Depois da execução, vamos validar na interface se está tudo ok.


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

[Link](https://ansible-galaxy-fortios-docs.readthedocs.io/en/galaxy-2.1.6/gen/fortios_firewall_service_custom.html) do módulo

**6 - Criando playbook para uso de roteador OSPF**

Digamos que em algum cenário, a gente vá querer usar OSPF no Fortinet, também é possível de se criar playbook para configuração do roteamento.

```
[ansible@ansible ~]$ nvim roles/fortinet/router/ospf.yml
```

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


```
[ansible@ansible ~]$ ansible-playbook -i hosts roles/fortinet/router/ospf.yml

PLAY [60f] ***********************************************************************************************************
TASK [Configurando roteador ospf] **************************************************************************************
changed: [60f]

PLAY RECAP *************************************************************************************************************
60f                      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```

Após a correta execução, vamos validar se o OSPF foi configurado corretamente.

Lembrando que, para visualização das configurações de OSPF em sua totalidade, o ideal é ir via cli.

```
60f-01 (Publica) # show router ospf
config router ospf
    set router-id 172.16.16.16
    config area
        edit 0.0.0.0
        next
    end
    config ospf-interface
        edit "vlan100"
            set interface "vlan100"
        next
    end
    config network
        edit 1
            set prefix 192.168.250.0 255.255.255.0
        next
        edit 2
            set prefix 172.16.16.16 255.255.255.255
        next
    end
    set passive-interface "lo-publica"
    config redistribute "connected"
    end
    config redistribute "static"
    end
    config redistribute "rip"
    end
    config redistribute "bgp"
    end
    config redistribute "isis"
    end
end
```

[Link](https://ansible-galaxy-fortios-docs.readthedocs.io/en/galaxy-2.1.6/gen/fortios_router_ospf.html) do módulo


No telecurso de hoje, mostramos como configurar desde uma interface até roteamento dinâmico com playbooks de Ansible em um equipamento da Fortinet.