![使用 Puppet 模板在条件语句中包含类名](https://linux22.com/image/581836/%E4%BD%BF%E7%94%A8%20Puppet%20%E6%A8%A1%E6%9D%BF%E5%9C%A8%E6%9D%A1%E4%BB%B6%E8%AF%AD%E5%8F%A5%E4%B8%AD%E5%8C%85%E5%90%AB%E7%B1%BB%E5%90%8D.png)
我的情况是,为了便于管理,我想对两个类使用相同的配置文件模板。我只希望配置文件的一小部分在两个类之间有所不同,而且由于我希望大多数节点都包含这两个类,所以我想有一个简单的条件来确定哪个类包含该文件。
举个例子,假设sensor
和snuffler
都包含在同一个节点中。我希望模板看起来像这样
<% if scope.name == "sensor" %>
include sensor/file1
include sensor/file2
<% else %>
include snuffler/file1
include snuffler/file2
<% end %>
这是否直接可行,还是我需要回到诸如在类定义中定义变量之类的操作?
答案1
最简单的方法是查看scope.tags
变量,并检查具有您感兴趣的类名称的成员。默认情况下,资源会用其类型(如“class”或“type”)以及定义资源的名称(如“sensor”或“snuffler”)进行标记。在我的快速测试中,我做了类似的事情:
class other {
file { '/etc/test':
content => template('test/test.erb'),
}
}
class test {
file { '/etc/test':
content => template('test/test.erb'),
}
}
include test
使用如下模板:
I am an erb template:
<% if scope.tags.member? 'test' %>
I was made in the Test class!
<% end %>
从“测试”类调用时,会显示额外的内容。
答案2
“scope”变量指的是Puppet::Parser::Scope
类,它似乎也跟踪源。你可以用以下命令引用它scope.source.name
:
class classname::foo {
notice(inline_template("scope='<%= scope.source.name %>'"))
}
印刷
notice: Scope(Class[Classname::Foo]): scope='classname::foo'