Назад | Перейти на главную страницу

Использование включения имени класса в условные выражения с шаблонами марионеток

Я оказался в ситуации, когда для простоты управления я хотел бы использовать один и тот же шаблон файла конфигурации для двух классов. Я ожидаю, что между ними будет отличаться только небольшая часть файла конфигурации, и, поскольку я ожидаю, что оба класса будут включены для большинства узлов, я хотел бы иметь простое условие, чтобы определить, какой класс включает файл.

В качестве примера предположим, что оба 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' отображался дополнительный контент.