使用 Puppet 模板在条件语句中包含类名

使用 Puppet 模板在条件语句中包含类名

我的情况是,为了便于管理,我想对两个类使用相同的配置文件模板。我只希望配置文件的一小部分在两个类之间有所不同,而且由于我希望大多数节点都包含这两个类,所以我想有一个简单的条件来确定哪个类包含该文件。

举个例子,假设sensorsnuffler都包含在同一个节点中。我希望模板看起来像这样

<% 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'

相关内容