Hi,
I am trying to replace an ACL configuration on Cisco IOS with Nornir and NAPALM but I'm getting this error :
Error:
Traceback (most recent call last):
File "/home/carl/.local/lib/python3.8/site-packages/nornir/core/task.py", line 99, in start
r = self.task(self, **self.params)
File "/home/carl/.local/lib/python3.8/site-packages/nornir_napalm/plugins/tasks/napalm_configure.py", line 39, in napalm_configure
device.commit_config()
File "/home/carl/.local/lib/python3.8/site-packages/napalm/ios/ios.py", line 531, in commit_config
output = self._commit_handler(cmd)
File "/home/carl/.local/lib/python3.8/site-packages/napalm/ios/ios.py", line 470, in wrapper
return f(self, *args, **kwargs)
File "/home/carl/.local/lib/python3.8/site-packages/napalm/ios/ios.py", line 487, in _commit_handler
output = self.device.send_command_expect(cmd, expect_string=patterns)
File "/home/carl/.local/lib/python3.8/site-packages/netmiko/base_connection.py", line 1582, in send_command_expect
return self.send_command(*args, **kwargs)
File "/home/carl/.local/lib/python3.8/site-packages/netmiko/utilities.py", line 500, in wrapper_decorator
return func(self, *args, *kwargs)
File "/home/carl/.local/lib/python3.8/site-packages/netmiko/base_connection.py", line 1535, in send_command
raise IOError(
OSError: Search pattern never detected in send_command: (?:[>##]\s$|.*all username.*confirm)
Script:
import logging
import re
from nornir import InitNornir
from nornir_napalm.plugins.tasks import napalm_get
from nornir_napalm.plugins.tasks import napalm_configure
from nornir_jinja2.plugins.tasks import template_file
from nornir_utils.plugins.tasks.data import load_yaml
from nornir_utils.plugins.functions import print_result
nr = InitNornir(config_file="config.yaml")
etx = chr(3)
def replace_acl(task):
data = task.run(
task=load_yaml,
file=f"./host_vars/{task.host}.yaml",
severity_level=logging.DEBUG,
)
task.host["facts"] = data.result
config = task.run(task=napalm_get, getters=["config"], severity_level=logging.DEBUG)
showrun = config.result["config"]["running"]
pattern = re.compile("^ip access-list([^!]+)", flags=re.I | re.M)
routing_template = task.run(
task=template_file,
name="Building ACL Configuration",
template="acl.j2",
path="./templates",
)
template_to_load = routing_template.result
newconfig = re.sub(pattern, template_to_load, showrun)
final_config = newconfig.replace("^C", etx)
return final_config
def replace_feature(task):
config = replace_acl(task)
task.run(task=napalm_configure, configuration=config, replace=True)
results = nr.run(task=replace_feature)
print_result(results)
acl.j2 :
ip access-list standard SSH_IN
permit 172.21.{{ host.facts.subnet }}.0 0.0.0.255
permit 172.24.11.0 0.0.0.255
permit 172.24.40.0 0.0.3.255
deny any
R1.yaml :
subnet: 101
Info
Cisco IOS Software, IOSv Software (VIOS-ADVENTERPRISEK9-M), Version 15.8(3)M
Any ideas ?
Thanks