DEV Community

Cover image for Utilizando Ansible para configuração de equipamentos Fortinet
Cristian Cardoso
Cristian Cardoso

Posted on

Utilizando Ansible para configuração de equipamentos Fortinet

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 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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Image description

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
Enter fullscreen mode Exit fullscreen mode

Após a execução sem erros, vamos ver como ficou na config:

Image description

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

Aqui link 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
Enter fullscreen mode Exit fullscreen mode

Image description

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
Enter fullscreen mode Exit fullscreen mode

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

Link 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
Enter fullscreen mode Exit fullscreen mode

Image description

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
Enter fullscreen mode Exit fullscreen mode

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

Image description

Link 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
Enter fullscreen mode Exit fullscreen mode

Image description

[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
Enter fullscreen mode Exit fullscreen mode

Depois da execução, vamos validar na interface se está tudo ok.

Image description

Link 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
Enter fullscreen mode Exit fullscreen mode

Image description

[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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Link 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.

Latest comments (4)

Collapse
 
rodsuzuki profile image
rodsuzuki

Muito bom conteúdo.
Vc sabe de algum playbook obde somente consulta as configurações ja aplicadas?
Pretendo usar ansible oara coletar infos dia meus devices periodicamente, porem nao encontrei cinteudo explicando isso.

Collapse
 
cardosocristian profile image
Cristian Cardoso

Creio que o que tu procura é isso aqui : ansible-galaxy-fortios-docs.readth...

Collapse
 
rodsuzuki profile image
rodsuzuki

Cristian, obrigado pela ajuda.
Vou testar com o que vc me passou.
Quando rodo no Ubuntu na minha maquina funciona q eh uma beleza as configuracoes, outro dos meus problemas, eh q o cliente usa o AWX e qdo rodo o playbook nele que da o erro...mas vou validar primeiro e um passo de cada vez.
Obrigado pela ajuda novamente

Thread Thread
 
cardosocristian profile image
Cristian Cardoso • Edited

Nunca rodei em AWX, mas a playbook do ansible é meio que padrão, deve ser algum detalhe