Introdução à automação de redes com Ansible

Este é o post com o passo-a-passo do workshop que tivemos no dia 21-06-2020 (cuja gravação pode ser acessada na sala de webinars do blog).

Instalação do Ansible

Eu utilizei Ansible em um servidor Ubuntu 20.04 LTS. Os passos à seguir funcionam para Ubuntu, e imagino que também para Debian. Para outras distros / OS, sugiro dar uma olhada na documentação do Ansible.

Passo 1: Instalar as dependências (tree é opcional, mas eu gosto de usar esta ferramenta)

sudo apt-get update
sudo apt install -y python python3-pip sshpass tree

Passo 2: Instalar Paramiko (Paramiko é uma implementação Python do protocolo SSHv2)

pip3 install paramiko

Passo 3: Instalar o Ansible

sudo apt-get install ansible -y

Topologia adotada

Para o Workshop, eu criei uma topologia contendo os seguintes elementos:

  • 1 Servidor Linux Ubuntu – É neste servidor que instalaremos a ferramenta Ansible
  • 1 Switch Cisco – Como estou usando EVE-NG, o switch é IOL e está usando a imagem I86BI_LINUX_L2-ADVENTERPRISEK9-M
  • 3 roteadores Cisco – Também IOL, rodando a imagem I86BI_LINUX-ADVENTERPRISEK9-M
NOTA: É importante que a imagem IOS que você utilizar para este lab ofereça suporte SSH!

A rede que usarei, como ilustrado acima, será a 172.28.0.0 /24. O servidor Linux tem o endereço 172.28.0.1, o Switch 172.28.0.2 e os roteadores R1, R2 e R3 172.28.0.101, 102 e 103 – respectivamente.

Demo Ansible – Mãos à obra!

Etapa 1: Onboarding do Switch S1 e dos roteadores R1, R2 e R3

O Switch S1 agirá como servidor DHCP e TFTP para o ambiente ilustrado. O objetivo é automatizar o máximo possível o processo de configuração, evitando qualquer contato com os roteadores R1, R2 e R3. Para tornar isso possivel, o Switch S1 não apenas servirá o endereço IP para cada um deles, mas também um arquivo básico de configuração.

Como Ansible requer acesso SSH (é um requisito e não uma opção), qualquer elemento que você deseja configurar via Ansible necessita ter suporte ao protocolo SSH. Assim, o arquivo básico de configuração que ser#a enviado de S1 para os roteadores cuidará da configuração e ativação do SSH em cada um deles.

Para alcançar esta configuração inicial nos elementos (chamada de “onboarding”), precisamos preparar o switch S1. A configuração inicial do switch S1 precisa ser realizada manualmente, e inclui:

  1. Configuração e ativação do serviço SSH
  2. Criação dos arquivos básicos de configuração que serão enviados aos roteadores R1, R2 e R3 via TFTP

O restante das configurações de S1 (DHCP, etc) será feito via Ansible (claro!).

Abaixo, as configurações iniciais do switch S1 (necessárias para que a ferramenta Ansible consiga acessá-lo)

a) Criação dos arquivos que serão enviados aos roteadores (usaremos a funcionalidade TCL para a criação destes arquivos)

tclsh

puts [ open "unix:R1-confg" w+ ] {
enable secret cisco
hostname R1
ip domain-name home.lab
username cisco privilege 15 password cisco
crypto key generate rsa modulus 2048
interface e0/0
ip address 172.28.0.101 255.255.255.0
no shut
line vty 0 4
logging synchronous
login local
transport input all
end
}

puts [ open "unix:R2-confg" w+ ] {
enable secret cisco
hostname R2
ip domain-name home.lab
username cisco privilege 15 password cisco
crypto key generate rsa modulus 2048
interface e0/0
ip address 172.28.0.102 255.255.255.0
no shut
line vty 0 4
logging synchronous
login local
transport input all
end
}

puts [ open "unix:R3-confg" w+ ] {
enable secret cisco
hostname R3
ip domain-name home.lab
username cisco privilege 15 password cisco
crypto key generate rsa modulus 2048
interface e0/0
ip address 172.28.0.103 255.255.255.0
no shut
line vty 0 4
logging synchronous
login local
transport input all
end
}

b) Agora, configuramos e ativamos SSH e outras funções necessários ao funcionamento do mesmo, como endereço IP, username, etc.

conf t
no ip routing
host S1
int vlan 1
ip add 172.28.0.2 255.255.255.0
no sh
int e0/0
switchport
switchport mode access
switchport access vlan 1
no sh

!!!! SSH
ip domain-name home.lab
username cisco privilege 15 secret cisco
crypto key generate rsa modulus 2048
line vty 0 4
login local
transport input all

Etapa 2: E vamos ao Ansible!

Neste momento, nosso servidor Ansible já é capaz de acessar o switch e, portanto, podemos automatizar o restante das configurações.

Antes de partirmos para o Ansible, vamos criar o hosts file Ansible que usaremos para direcionar nossas configurações. Antes, vale mencionar que, no meu lab, eu adicionei entradas no Linux hosts file para mapear meus roteadores e o switch para os IPs que estou usando. Este passo não é necessário… você pode criar o hosts file no seu Ansible usando IPs ao invés de nomes, se quiser. Meu Linux hosts file ficou assim:

# Ansible hosts
172.28.0.2 S1
172.28.0.101 R1
172.28.0.102 R2
172.28.0.103 R3

E o hosts file do meu Ansible ficou assim:

[switches]
S1
[switches:vars]
ansible_user=cisco
ansible_password=cisco

[routers]
R1
R2
R3
[routers:vars]
ansible_user=cisco
ansible_password=cisco

Notem que estou adicionando username e password no arquivo hosts do Ansible, e isso não é recomendado em um ambiente de produção. Opte por usar a funcionalidade Ansible Vault para isso (não coberto no workshop).

No mesmo diretório onde criamos o hosts file, vamos agora criar um playbook com as ações que desejamos realizar no switch.

Para uma explicação sobre Ansible, sintaxe e seus elementos, como playbooks,  hosts file e outros, sugiro que assistam à gravação do workshop.

 

No workshop, uma parte da demo deu errado porque eu tentei agrupar todas as configurações em um único “task”, ao invés de tentar organizar as ações em tasks distintos. Abaixo, a versão 100% funcional do playbook criado para o switch:

---

- name: Demo Ansible blog.ccna.com.br
hosts: switches
gather_facts: false
connection: local

tasks:
- name: exclui IPs do DHCP e adiciona arquivos ao TFTP
ios_config:
lines:
- ip dhcp excluded-address 172.28.0.1
- ip dhcp excluded-address 172.28.0.2
- tftp-server unix:R1-confg
- tftp-server unix:R2-confg
- tftp-server unix:R3-confg

- name: configura DHCP-pools switch
ios_config:
lines:
- ip dhcp pool R1
- ip dhcp pool R2
- ip dhcp pool R3


- name: configura DHCP R1
ios_config:
parents: "ip dhcp pool R1"
lines:
- host 172.28.0.101 255.255.255.0
- client-identifier 0063.6973.636f.2d61.6162.622e.6363.3030.2e32.6130.302d.4574.302f.30
- bootfile R1-confg
- default-router 172.28.0.1
- option 150 ip 172.28.0.2

- name: configura DHCP R2
ios_config:
parents: "ip dhcp pool R2"
lines:
- host 172.28.0.102 255.255.255.0
- client-identifier 0063.6973.636f.2d61.6162.622e.6363.3030.2e33.6130.302d.4574.302f.30
- bootfile R2-confg
- default-router 172.28.0.1
- option 150 ip 172.28.0.2

- name: configura DHCP R3
ios_config:
parents: "ip dhcp pool R3"
lines:
- host 172.28.0.103 255.255.255.0
- client-identifier 0063.6973.636f.2d61.6162.622e.6363.3030.2e34.6130.302d.4574.302f.30
- bootfile R3-confg
- default-router 172.28.0.1
- option 150 ip 172.28.0.2

...

E, finalmente, vamos executar o playbook e verificar o resultado. Este playbook afetará APENAS o switch, pois na sessão hosts (no topo do playbook), estamos referenciado apenas a sessão “switches” do hosts file.

Como podemos ver, o playbook foi executado com sucesso e, verificando o switch, é possível perceber que tudo está lá, como deveria. Agora, podemos iniciar os roteadores. Assim que eles completarem o boot, o switch deve enviar as configurações para cada um deles, de acordo com os comandos DHCP que adicionamos ao switch. Abaixo, um exemplo do boot de R2:

Agora, com os devidos IPs configurados e SSH habilitado nos três roteadores, podemos passar a usar o Ansible para configurá-los como bem entendermos. Abaixo, um exemplo de playbook que configurará todos os roteadores com algumas definições padrão, e vamos salvar a configuração no final:

---
- name: Demo Ansible blog.ccna.com.br - configuracao geral routers
hosts: routers
gather_facts: false
connection: local

tasks:
- name: MOTD banner
ios_config:
lines:
- banner motd &**************** TESTE ANSIBLE BLOG CCNA *********************&

- name: Interface duplex full
ios_config:
lines:
- duplex full
- no shut
- description Configurada via Ansible
parents:
- interface range e0/0-3  

- name: save running to startup quando alterada com sucesso
  ios_config:
    save_when: modified

...

Vamos executá-lo e ver o resultado:

E, verificando um dos roteadores, é possível ver que sua configuração foi, de fato, alterada:

Referências

Conclusão

Obviamente, cobri apenas o básico do básico com relação à ferramenta Ansible e elementos Cisco. Mas acho que é o suficiente para dar aquele empurrão que você precisava para, pelo menos, começar a estudar mais o assunto 🙂

Espero que seja útil!

Abraço

Marco

 

Deixe um comentário