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 类会被包含和评估。
有两种方法可以解决这个问题:
如果你能保证它会被外部节点分类器添加,那么它是安全的
更好的是,创建一个自定义事实来确定 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,它们都是字符串。