Fin TP3
This commit is contained in:
@@ -1,46 +1,66 @@
|
||||
from nornir import InitNornir
|
||||
from nornir.core.task import Task, Result
|
||||
from nornir_utils.plugins.functions import print_result
|
||||
from nornir_napalm.plugins.tasks import napalm_get,napalm_configure, napalm_cli
|
||||
from nornir_netmiko.tasks import netmiko_send_config,netmiko_send_command, netmiko_save_config, netmiko_commit
|
||||
|
||||
def question_13(nr):
|
||||
print(nr.__dict__)
|
||||
for key in nr.__dict__.keys():
|
||||
print(f" - {key}")
|
||||
|
||||
def question_14(nr):
|
||||
pass
|
||||
print(nr.inventory.hosts)
|
||||
print(type(nr.inventory.hosts))
|
||||
|
||||
def question_15(nr):
|
||||
pass
|
||||
print(nr.inventory.hosts["R1-CPE-BAT-A"])
|
||||
print(type(nr.inventory.hosts["R1-CPE-BAT-A"]))
|
||||
|
||||
def question_16(nr):
|
||||
pass
|
||||
print(dir(nr.inventory.hosts["R1-CPE-BAT-A"]))
|
||||
first_host = list(nr.inventory.hosts.values())[0]
|
||||
print(f"Adresse IP (hostname): {first_host.hostname}")
|
||||
print(f"Username: {first_host.username}")
|
||||
print(f"Password: {first_host.password}")
|
||||
|
||||
def question_17(nr):
|
||||
pass
|
||||
print(dir(nr.inventory.hosts["R1-CPE-BAT-A"]))
|
||||
|
||||
def question_18(nr):
|
||||
pass
|
||||
print(nr.inventory.hosts["R1-CPE-BAT-A"].data["room"])
|
||||
|
||||
def question_19(nr):
|
||||
pass
|
||||
print(nr.inventory.groups)
|
||||
|
||||
|
||||
def question_20(nr):
|
||||
pass
|
||||
print(nr.inventory.hosts.get('R1-CPE-BAT-A').groups)
|
||||
|
||||
def question_21(nr):
|
||||
pass
|
||||
print(nr.inventory.hosts.get('R1-CPE-BAT-A').groups[0].keys())
|
||||
|
||||
def question_22(nr):
|
||||
pass
|
||||
print(nr.inventory.hosts.get('R1-CPE-BAT-A').groups[0].get('vendor'))
|
||||
|
||||
def question_23(nr):
|
||||
pass
|
||||
for host_name in nr.inventory.hosts:
|
||||
print(nr.inventory.hosts.get(host_name).hostname)
|
||||
|
||||
def question_24(nr):
|
||||
pass
|
||||
print(nr.filter(device_type='router').inventory.hosts.keys())
|
||||
|
||||
def question_25(nr):
|
||||
pass
|
||||
print(nr.filter(device_type='router_switch').inventory.hosts.keys())
|
||||
|
||||
def hello_world(task: Task) -> Result:
|
||||
return Result(
|
||||
host=task.host,
|
||||
result=f"{task.host.name} says hello world!"
|
||||
)
|
||||
|
||||
def question_26(nr):
|
||||
pass
|
||||
result = nr.run(task=hello_world)
|
||||
print(result)
|
||||
|
||||
def question_27(nr):
|
||||
result = nr.run(task=hello_world)
|
||||
@@ -51,31 +71,153 @@ def question_29(nr):
|
||||
print_result(result)
|
||||
|
||||
def question_30(nr):
|
||||
pass
|
||||
host = nr.filter(device_type='router_switch')
|
||||
print_result(host.run(task=hello_world))
|
||||
|
||||
|
||||
def display_interfaces(task):
|
||||
task.run(
|
||||
task=napalm_cli,
|
||||
commands=["show ip interface brief"]
|
||||
)
|
||||
def question_32(nr):
|
||||
pass
|
||||
|
||||
def question_33(nr):
|
||||
pass
|
||||
filtre = nr.filter(device_type='router')
|
||||
result = filtre.run(task=display_interfaces)
|
||||
print_result(result)
|
||||
|
||||
def get_arp_table(task):
|
||||
task.run(
|
||||
task=napalm_get,
|
||||
getters=["arp_table"]
|
||||
)
|
||||
|
||||
def configure_loopback_r1(task):
|
||||
task.run(
|
||||
task=napalm_configure,
|
||||
configuration="""
|
||||
interface Lo1
|
||||
ip address 1.1.1.1 255.255.255.255
|
||||
description Loopback pour R1-CPE-BAT-A
|
||||
"""
|
||||
)
|
||||
|
||||
def configure_loopback_r2(task):
|
||||
task.run(
|
||||
task=napalm_configure,
|
||||
configuration="""
|
||||
interface Lo1
|
||||
ip address 2.2.2.2 255.255.255.255
|
||||
description Loopback pour R2-CPE-BAT-A
|
||||
"""
|
||||
)
|
||||
|
||||
|
||||
def question_34(nr):
|
||||
pass
|
||||
R1 = nr.filter(name='R1-CPE-BAT-A')
|
||||
result_R1 = R1.run(task=configure_loopback_r1)
|
||||
R2 = nr.filter(name='R2-CPE-BAT-A')
|
||||
result_R2 = R2.run(task=configure_loopback_r2)
|
||||
print_result(result_R1)
|
||||
print_result(result_R2)
|
||||
|
||||
def save_running_config(task):
|
||||
# Exécute la commande de sauvegarde de la configuration
|
||||
task.run(
|
||||
task=napalm_cli,
|
||||
commands=["wr"]
|
||||
)
|
||||
|
||||
def question_35(nr):
|
||||
pass
|
||||
result = nr.run(task=save_running_config)
|
||||
print_result(result)
|
||||
|
||||
def question_36(nr):
|
||||
pass
|
||||
filtre = nr.filter(device_type='router')
|
||||
result = filtre.run(task=netmiko_send_command,command_string="show ip interface brief")
|
||||
print_result(result)
|
||||
|
||||
def configure_loopback2_r1(task):
|
||||
config_commands = [
|
||||
"interface loopback 2",
|
||||
"ip address 1.1.1.2 255.255.255.255",
|
||||
"description Loopback2 pour R1-CPE-BAT-A"
|
||||
]
|
||||
task.run(task=netmiko_send_config, config_commands=config_commands)
|
||||
|
||||
def configure_loopback2_r2(task):
|
||||
config_commands = [
|
||||
"interface loopback 2",
|
||||
"ip address 2.2.2.3 255.255.255.255",
|
||||
"description Loopback2 pour R2-CPE-BAT-A"
|
||||
]
|
||||
task.run(task=netmiko_send_config, config_commands=config_commands)
|
||||
|
||||
def question_37(nr):
|
||||
pass
|
||||
result_r1 = nr.filter(name='R1-CPE-BAT-A').run(task=configure_loopback2_r1)
|
||||
result_r2 = nr.filter(name='R2-CPE-BAT-A').run(task=configure_loopback2_r2)
|
||||
print_result(result_r1)
|
||||
print_result(result_r2)
|
||||
|
||||
|
||||
|
||||
def question_38(nr):
|
||||
pass
|
||||
filtreR1 = nr.filter(name='R1-CPE-BAT-A')
|
||||
resultR1 = filtreR1.run(task=netmiko_save_config)
|
||||
filtreR2 = nr.filter(name='R2-CPE-BAT-A')
|
||||
resultR2 = filtreR2.run(task=netmiko_save_config)
|
||||
print_result(resultR1)
|
||||
print_result(resultR2)
|
||||
def deploy_config_from_file(task: Task, config_file: str) -> Result:
|
||||
"""Déploie la configuration depuis un fichier sur un équipement via Nornir/Netmiko."""
|
||||
with open(config_file, "r") as f:
|
||||
commands = f.read().splitlines()
|
||||
result = task.run(task=netmiko_send_config, config_commands=commands)
|
||||
print_result(result)
|
||||
result = task.run(task=netmiko_save_config)
|
||||
print_result(result)
|
||||
return result
|
||||
|
||||
def deploy_to_hosts(nr, host_patterns):
|
||||
"""Déploie les configurations pour tous les hôtes et ajoute le fichier VRRP pour les routers."""
|
||||
for pattern in host_patterns:
|
||||
# Filtrer uniquement par nom pour tous
|
||||
filtered_hosts = nr.filter(name=pattern)
|
||||
if not filtered_hosts.inventory.hosts:
|
||||
print(f"Aucun hôte correspondant à '{pattern}'")
|
||||
continue
|
||||
|
||||
for host_name, host_obj in filtered_hosts.inventory.hosts.items():
|
||||
# Nom de fichier principal
|
||||
filename = host_obj.name.replace("-", "_").replace("CPE", "CPE_LYON")
|
||||
|
||||
# Déploiement du fichier principal
|
||||
filtered_hosts.run(
|
||||
task=deploy_config_from_file,
|
||||
config_file=f"config/{filename}.conf",
|
||||
name=f"Déploiement config {host_obj.name}"
|
||||
)
|
||||
|
||||
# Déploiement des fichiers VRRP uniquement pour les routers
|
||||
routers = nr.filter(device_type='router')
|
||||
for host_name, host_obj in routers.inventory.hosts.items():
|
||||
vrrp_filename = host_obj.name.replace("-", "_").replace("CPE", "CPE_LYON") + "_VRRP.conf"
|
||||
routers.run(
|
||||
task=deploy_config_from_file,
|
||||
config_file=f"config/{vrrp_filename}",
|
||||
name=f"Déploiement VRRP {host_obj.name}"
|
||||
)
|
||||
|
||||
def question_39(nr):
|
||||
pass
|
||||
host_patterns = [
|
||||
'R1-CPE-BAT-A',
|
||||
'R2-CPE-BAT-A',
|
||||
'R1-CPE-BAT-B',
|
||||
'R2-CPE-BAT-B',
|
||||
'ESW1-CPE-BAT-A',
|
||||
'ESW1-CPE-BAT-BS'
|
||||
|
||||
]
|
||||
deploy_to_hosts(nr, host_patterns)
|
||||
|
||||
def question_39_d(nr):
|
||||
pass
|
||||
@@ -87,7 +229,7 @@ def question_40(nr):
|
||||
if __name__ == "__main__":
|
||||
nr = InitNornir(config_file="inventory/config.yaml")
|
||||
|
||||
question_13(nr)
|
||||
#question_13(nr)
|
||||
#question_14(nr)
|
||||
#question_15(nr)
|
||||
#question_16(nr)
|
||||
@@ -101,7 +243,7 @@ if __name__ == "__main__":
|
||||
#question_24(nr)
|
||||
#question_25(nr)
|
||||
#question_26(nr)
|
||||
question_27(nr)
|
||||
#question_27(nr)
|
||||
#question_29(nr)
|
||||
#question_30(nr)
|
||||
|
||||
@@ -112,7 +254,7 @@ if __name__ == "__main__":
|
||||
#question_36(nr)
|
||||
#question_37(nr)
|
||||
#question_38(nr)
|
||||
#question_39(nr)
|
||||
question_39(nr)
|
||||
#question_39_d(nr)
|
||||
|
||||
#question_40(nr)
|
||||
|
||||
Reference in New Issue
Block a user