【发布时间】:2016-12-23 23:00:01
【问题描述】:
我正在创建 jinja2 模板来为具有 1K+ 路由器的网络生成纯文本路由器配置。在最终状态下,我将使用 ansible 将生成的配置推送到路由器。构建模板具有挑战性,因为配置文件表现出相当大的变化。我相信需要一种迭代方法,在改进模板时执行模糊匹配。随着最终模板的构建,一些变化将被消除。将使用角色、group_vars 和 host_vars 处理必要的变化。
我的问题完全是关于比较两个文本文件:一个是 jinja2 模板,另一个是配置文件。为了简化任务,我可以只使用 jinja2 变量而不使用任何其他 jinja2 构造。我不关心验证配置。如果两个文本文件都匹配但 jinja2 变量除外,则会发生模糊匹配。
为了简单起见,我将举一个使用部分配置的示例。
模板:
system {
host-name {{ hostname }};
root-authentication {
encrypted-password "{{ root_password }}";
}
login {
user ansible {
uid 2000;
class super-user;
authentication {
ssh-rsa "ssh-rsa {{ private_key }}";
}
}
}
services {
ssh;
netconf {
ssh;
}
}
}
现有配置:
system {
host-name router1;
root-authentication {
encrypted-password "$1$pRoJeWbG$S.s2PL77OZJ/g.xAQ5d5E/";
}
login {
user ansible {
uid 2000;
class super-user;
authentication {
ssh-rsa "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCjdOJzdhpjOBm042fykczzPOmDSf98TRaiomT8hGzCJ1svMV/sq9yH2lsY5ixsundWAQHmq6pv78SmFTj8/26UQHoM/pHYYhTyRRWe3g7PJ9NQ+MV+AZ/bnAYX8p8BD6EOudMJHleuCTQ3HJ9F87Mbvtd8W5eXv+qtSr+dTBQSKRJuqMUde+ofrdCYAezFSo87B3s/K4HrlT92D79BfabCztepvCREwOjr9Leppast17HBnbhsHIZBt/VX6oVlZynN7wpyjssbLmu84cCxDNOse0aCG7yddsdQ124asjfvb4lvYqRIgG9S4oMkem8IuiHkRcrVihmdV10TkJ8Puxq/ root@7f826f01cf36";
}
}
}
services {
ssh;
netconf {
ssh;
}
}
}
上面的例子是匹配的。如果配置不包括 netconf 节,则不会匹配,并且会标记偏差。如果配置文件包含模板中没有的文本,这也会被标记。
我已经尝试过 python 的fuzzywuzzy 模块。由于需要进行额外的手动检查,因此该解决方案似乎并不完美。
我可以设想一个使用正则表达式的解决方案;但是,我想避免配置特定于语法的正则表达式。换句话说,我可以使用相同的解决方案来检查 nginx 配置文件中的偏差。
是否有现有的 Python 模块可用于查找我在上面定义的偏差?有没有更好的方法来解决这个问题?
【问题讨论】:
-
不要为了解析配置文件而解析配置文件,而应该将配置应用到构建服务器(即路由器)并验证配置。
-
检查合规性是什么意思?你能举一些例子吗?
-
我会针对这些 cmets 更新问题。