Cristian Cardoso
Posted on June 2, 2022
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
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.
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
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:
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
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.
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
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
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
[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.
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
[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 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.
Posted on June 2, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.