【问题标题】:How can I compare jinja2 templates with existing configuration files to test for deviation?如何将 jinja2 模板与现有配置文件进行比较以测试偏差?
【发布时间】: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 更新问题。

标签: python ansible jinja2


【解决方案1】:

如果您有初始构建的路由器特定模板,您可以只渲染 jinja 模板以创建路由器特定配置文件,然后进行比较。这可能需要更多的流程,但实施起来会更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-05
    • 2016-09-02
    • 2011-12-16
    • 2020-10-20
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多