Я оказался в ситуации, когда для простоты управления я хотел бы использовать один и тот же шаблон файла конфигурации для двух классов. Я ожидаю, что между ними будет отличаться только небольшая часть файла конфигурации, и, поскольку я ожидаю, что оба класса будут включены для большинства узлов, я хотел бы иметь простое условие, чтобы определить, какой класс включает файл.
В качестве примера предположим, что оба sensor
и snuffler
включены в один и тот же узел. Я бы хотел, чтобы шаблон выглядел примерно так
<% if scope.name == "sensor" %>
include sensor/file1
include sensor/file2
<% else %>
include snuffler/file1
include snuffler/file2
<% end %>
Возможно ли это напрямую или мне нужно вернуться к чему-то вроде определения переменных в определениях классов?
Переменная "scope" относится к Puppet::Parser::Scope
class, который, кажется, также отслеживает источник. Вы можете обратиться к нему с помощью scope.source.name
:
class classname::foo {
notice(inline_template("scope='<%= scope.source.name %>'"))
}
печатает
notice: Scope(Class[Classname::Foo]): scope='classname::foo'
Самый простой способ сделать это - посмотреть на scope.tags
переменная и проверьте наличие члена с именем интересующего вас класса. По умолчанию ресурс помечается его типом (например, 'class' или 'type'), а также именем определяющего ресурса ( вроде «сенсор» или «нюхатель»). В моем быстром тесте я сделал что-то вроде этого:
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 %>
При вызове из класса 'test' отображался дополнительный контент.