📚 Boris School
← Voltar ao curso

Automation and Programmability

Automação com Ansible e Python

Automação de Rede

Ferramentas modernas permitem gerenciar centenas de dispositivos de forma programática e consistente.

Ansible (Red Hat)

Ferramenta de automação agentless (usa SSH). Ideal para configurar equipamentos de rede.

Arquitetura:

  • Control node: Onde o Ansible é instalado (pode ser um servidor Linux)
  • Managed nodes: Dispositivos gerenciados (roteadores, switches)
  • Inventory: Lista de dispositivos em formato INI ou YAML
  • Playbook: Arquivo YAML com as tarefas a executar

Exemplo de inventário (hosts.ini):

[switches]
sw01 ansible_host=10.0.0.1
sw02 ansible_host=10.0.0.2

[routers]
rtr01 ansible_host=10.0.0.10

Exemplo de Playbook (config-vlan.yml):

---
- name: Configurar VLANs nos switches
  hosts: switches
  gather_facts: no
  tasks:
    - name: Criar VLAN 10
      cisco.ios.ios_vlan:
        vlan_id: 10
        name: VENDAS
        state: present

    - name: Configurar interface access na VLAN 10
      cisco.ios.ios_interface:
        name: GigabitEthernet0/1
        mode: access
        access_vlan: 10

Módulos Cisco no Ansible:

  • cisco.ios.ios_config — Comandos IOS arbitrários
  • cisco.ios.ios_vlan — Gerenciamento de VLANs
  • cisco.ios.ios_interface — Configuração de interfaces
  • cisco.ios.ios_l3_interface — Configuração L3
  • cisco.ios.ios_lldp — LLDP
  • cisco.ios.ios_static_route — Rotas estáticas

Python + Netmiko / NAPALM

Netmiko: Biblioteca Python simplifica SSH para dispositivos de rede (multi-vendor).

from netmiko import ConnectHandler

cisco_router = {
    'device_type': 'cisco_ios',
    'host': '10.0.0.1',
    'username': 'admin',
    'password': 'senha',
}

connection = ConnectHandler(**cisco_router)
output = connection.send_command('show ip interface brief')
print(output)
connection.disconnect()

NAPALM: Biblioteca que abstrai diferenças entre fabricantes:

from napalm import get_network_driver
driver = get_network_driver('ios')
device = driver('10.0.0.1', 'admin', 'senha')
device.open()
print(device.get_facts())
print(device.get_interfaces())
print(device.get_bgp_neighbors())
device.close()

JSON e JSON Path:

Formato leve de troca de dados, amplamente usado em APIs REST:

{
  "hostname": "SW01",
  "interfaces": [
    {"name": "G0/1", "status": "up", "vlan": 10},
    {"name": "G0/2", "status": "up", "vlan": 20}
  ]
}