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

марионетка распространяет переменную от узла к шаблону erb?

Можно ли объявить переменную в узел и чем продвигать его к шаблону 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 могут быть безнаказанно установлены или нет в определениях ваших узлов.