Puppet-ERB 模板-关于定义类的问题

Puppet-ERB 模板-关于定义类的问题

Puppet 模板文件是 erb rails 文件。

我想要这一行:

Include modsecurity.d/*.conf

如果包含类 mod_security,则将其包含在最终文件中。

来自 Puppet 文档: http://docs.puppetlabs.com/guides/templating.html-

此代码片段将打印目录中所有定义的类:

<% classes.each do |klass| -%>
The class <%= klass %> is defined
<% end -%>

有条件的:

<% if broadcast != "NONE" %>        broadcast <%= broadcast %> <% end %>

我对语法还不熟悉。defined 和 included 的意思一样吗?对于条件,我该如何检查特定类,即 if isdefined(mod_security)...?

答案1

已定义的类确实意味着包含该类。需要明确的是,该<% if broadcast ...位不是检查广播类是否包含的方法,而是使用广播变量值的条件语法,类数组包含所有已定义类的名称。

例如,您可以这样检查 mod_security 类:

<% 如果 classes.include?("mod_security") %>
条件文本
<% 结束 %>

编辑:

哎呀...该方法称为 include? 而不是 includes?。已在上面修复。

答案2

执行此操作时要小心,因为该类是否包含在“classes”变量中取决于什么时候在 Puppet 运行中,会评估此特定模板,这可能是不确定的。很有可能您的模板会被评估,然后在运行期间您的 mod_security 类会被包含和评估。

有两种方法可以解决这个问题:

  1. 如果你能保证它会被外部节点分类器添加,那么它是安全的

  2. 更好的是,创建一个自定义事实来确定 mod_security 的存在,并使用该事实名称作为条件变量。

    Facter.add("mod_security_version") do setcode do version = %{rpm -qa | grep mod_security} 如果 version.empty? version = 0 end version end end

然后在您的模板中:

<% if ! mod_security_version.eql?("0") %>
Include modsecurity.d/*.conf
<% end %>

请注意,这需要进行字符串比较(不是mod_security_version != 0),因为一旦所有事实达到 ERB,它们都是字符串。

相关内容