Можно ли объявить переменную в узел и чем продвигать его к шаблону erb?
Пример:
node basenode {
$myvar = "bar" # default
include myclass
}
node mynode extends basenode {
$myvar = "foo"
}
class myclass {
file { "/root/myfile":
content => template("myclass/mytemplate.erb")
ensure => present,
}
}
Источник mytemplate.erb:
myvar has value: <%= myvar %>
Я знаю, что мой пример может быть сложным. Но я пытаюсь распространить файл (почти) на все мои узлы, и я хочу, чтобы его содержимое изменялось в зависимости от узел который запрашивает файл. В $myvar = "bar"
оператор должен быть по умолчанию, если узел не переопределяет свое значение.
Есть ли решение моей проблемы? Я использую марионетку 0,24,5
Редактировать: Проблема здесь, вероятно, в порядке наследования переменных. это $ myvar переменная не будет фу ценность в Mynode узел. Решением здесь было бы включить мой класс прямо в Mynode. Но я действительно не хочу этого делать. Есть ли возможность переопределить значение переменной класса после класс был включен?
Наследование марионеточного узла не так же, как наследование в большинстве других языков программирования. Включенные классы оцениваются немедленно когда оценивается ребенок. И родительский узел оценивается после этого. Поэтому мой пример никогда не сработает. Если вы хотите узнать рекомендуемое решение для этого, прочтите марионетка - распространенные заблуждения. Я так сделал, и это работает.
Хотя я должен признать, что сейчас я очень разочарован, потому что сложный синтаксис марионеток может сбивать с толку новичков.
В других ответах уже указывалась проблема определения объема. Что вы, вероятно, захотите сделать, так это использовать базовый узел только для определений переменных и выделить фактическую логику (включая определения базовых классов) в отдельный класс, который включается всеми вашими узлами. Это сохраняет желаемую область видимости и добавляет только одну дополнительную строку ко всем вашим определениям узлов.
node basenode {
$myvar = "bar" # default
}
node mynode extends basenode {
$myvar = "foo"
include baseclass
}
class baseclass {
include myclass
}
class myclass {
file { "/root/myfile":
content => template("myclass/mytemplate.erb"),
ensure => present
}
}
Вместо объявления значения по умолчанию в базовом узле я бы объявил значение по умолчанию в самом шаблоне. Поскольку ERB в значительной степени основан на Ruby, вы можете обойтись довольно обширной логикой. Вот пример из шаблона, который я использую для управления файлом конфигурации snort.
var DNS_SERVERS <% if has_variable?("dns_servers") then %>[<%= dns_servers.flatten.join(',') %>]<% else %>$HOME_NET<% end %>
В этом случае я использую массив, который, если он существует, превращается в список, разделенный запятыми, для включения. В противном случае используется значение по умолчанию $ HOME_NET. Если мы упростим его до вашего примера, мы могли бы использовать:
myvar has value <% if has_variable?("myvar") %><% then %><%= myvar %><% else %>bar<% end %>
Опять же, если переменная myvar
был установлен тогда, который будет расширен, в противном случае будет напечатана строка «bar». Таким образом, переменная myvar
могут быть безнаказанно установлены или нет в определениях ваших узлов.