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:
- Configuração e ativação do serviço SSH
- 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
- https://docs.ansible.com/ansible/2.5/modules/list_of_network_modules.html#ios
- https://networklore.com/ansible-ios_config/
- https://www.cisco.com/en/US/docs/ios/12_1t/12_1t5/feature/guide/dt_dhcpa.html
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
Comentários Recentes