Lorsque l’objectif est d’utiliser Python 3 pour automatiser l’accès aux équipements Arista, le framework Python Nornir apporte une aide précieuse. Pour les connexions, Nornir peut utiliser NAPALM, Netmiko, Paramiko ou Netconf.
La librairie NAPALM (Network Automation and Programmability Abstraction Layer with Multivendor support) est indiqué pour se connecter aux équipements Arista. Il s’appuie sur la librairie pyeapi avec un bon niveau de support des fonctionnalités.
Fichier de configuration Nornir :
---
core:
num_workers: 100
inventory:
plugin: nornir.plugins.inventory.simple.SimpleInventory
options:
host_file: "inventory/hosts.yaml"
group_file: "inventory/groups.yaml"
defaults_file: "inventory/defaults.yaml"
Fichiers inventory/ :
---
ceos1:
hostname: 127.0.0.1
port: 4443
groups:
- ceos
veos1:
hostname: 192.168.1.60
groups:
- veos
veos2:
hostname: 192.168.1.61
groups:
- veos
---
ceos:
platform: 'eos'
veos:
platform: 'eos'
data:
vlans:
- {id: 10, name: test10, ip: 10.10.10.254}
- {id: 20, name: test20, ip: 10.10.20.254}
accesses:
- {interface: 3, vlan_id: 10}
- {interface: 4, vlan_id: 20}
trunks:
- {interface: 1, id: 1}
- {interface: 2, id: 1}
--- username: 'admin' password: 'arista'
Fichier script :
#!/usr/bin/env python
import nornir
import nornir.plugins.tasks.networking as nptn
import nornir.plugins.functions.text as npft
import nornir.core.filter as ncf
def arista_get_version():
nr = nornir.InitNornir(config_file='config.yaml')
veos = nr.filter(ncf.F(groups__contains='veos'))
npft.print_title('Playbook to display virtual switch version')
results = veos.run(
task=nptn.napalm_get,
getters=["facts"]
)
for host, r in results.items():
print(host, '-->', r.result['facts']['os_version'])
#!/usr/bin/env python
import nornir
import nornir.plugins.tasks.networking as nptn
import nornir.plugins.functions.text as npft
import nornir.core.filter as ncf
import datetime as date
def arista_get_config():
nr = nornir.InitNornir(config_file='config.yaml')
veos = nr.filter(ncf.F(groups__contains='veos'))
results = veos.run(
task=nptn.napalm_get,
getters=['config'],
getters_options={'config': {'retrieve': 'running'}}
)
for host, r in results.items():
npft.print_title('Record ' + host + ' virtual switch running config')
out_filename = host + '_' + date.datetime.now().strftime('%Y-%m-%d_%H:%M:%S') + '.conf'
with open(out_filename, 'w') as out_file:
out_file.write(r.result['config']['running'])
if __name__ == '__main__':
arista_get_config()
#!/usr/bin/env python
import nornir
import nornir.plugins.tasks.networking as nptn
import nornir.plugins.tasks.text as nptt
import nornir.plugins.functions.text as npft
import nornir.core.filter as ncf
def arista_configuration(task):
template = task.run(
task=nptt.template_file,
template='configuration.j2',
path='templates/'
)
task.host['config'] = template.result
results = task.run(
task=nptn.napalm_configure,
configuration=task.host['config']
)
def arista_config_template():
nr = nornir.InitNornir(config_file='config.yaml')
veos = nr.filter(ncf.F(groups__contains='veos'))
npft.print_title('Playbook to configure virtual switch with template')
results = veos.run(task=arista_configuration)
npft.print_result(results)
if __name__ == '__main__':
arista_config_template()
{%- for vlan in host['vlans'] %}
vlan {{ vlan.id }}
name {{ vlan.name }}
{% endfor %}
{%- if host.name == 'veos1' %}
{%- for vlan in host['vlans'] %}
interface Vlan{{ vlan.id }}
ip address {{ vlan.ip }}/24
{% endfor %}
ip routing
{% endif %}
{%- for access in host['accesses'] %}
interface Ethernet{{ access.interface }}
switchport access vlan {{ access.vlan_id }}
{% endfor %}
{%- for trunk in host['trunks'] %}
interface Ethernet{{ trunk.interface }}
channel-group {{ trunk.id }} mode active
{% endfor %}
interface Port-Channel{{ host['trunks'][0]['id'] }}
switchport mode trunk


