#ruby #operators #erb #puppet
#рубиновый #операторы #erb #кукольный
Вопрос:
Используя puppet (3.6), у меня есть следующий шаблон erb
<% if @redis_port != ''%>
redis['port'] = <%= @redis_port %>
<% end %>
Желаемое поведение заключается в том, что if $redis_port
является чем-то иным, кроме nil
или пустым, затем распечатайте его. В противном случае опустите строку
redis['port'] = 6379
$redis_port определен в кукольном манифесте params.pp
$ cat params.pp
class foobar::params {
$redis_port = nil #'6379'
}
$ cat init.pp
class foobar {
$redis_port = $foobar::params::redis_port
}
Почему шаблон erb работает корректно, только если $redis_port является строкой?
Я безуспешно пробовал следующие комбинации.
Тестовая матрица: ($redis_port из params.pp, оператор if находится в шаблоне erb)
$redis_port = '6379' #Success
<% if @redis_port != ''%>
$redis_port = 6379 #Fail
<% if @redis_port != ''%>
$redis_port = 6379 #Fail
<% if @redis_port %>
$redis_port = 6379 #Fail
<% if scope['::foobar::redis_port'] %>
$redis_port = 6379 #Fail
<% if @redis_port != ''%>
$redis_port = 6379 #Fail
<% if @redis_port != nil %>
Документация puppetlabs показывает, что я должен иметь возможность просто запросить, равно ли значение nil или нет, просто используя @redis_port .
http://docs.puppetlabs.com/guides/templating.html
Дополнительные ресурсы
https://ask.puppetlabs.com/question/3420/if-else-statement-in-erb-template/
Комментарии:
1. Во-первых: выполнение
$varname = nil
в манифесте является ошибочным, посколькуnil
не имеет особого значения на языке марионеток. Вы получаете строку"nil"
в качестве значения. Вы хотите$varname = undef
, но у этого есть предостережения, как видно из опубликованной вами таблицы.2. Спасибо @FelixFrank, ваш комментарий привел меня к правильному ответу. Мне пришлось использовать undef. Если вы опубликуете ответ, я приму его.
Ответ №1:
Центральная проблема здесь заключается в том, что nil
это не зарезервированное слово в Puppet и вместо этого считается строкой без разделителей, представляющей значение 'nil'
. Как указано в приведенной документации, аналог закрытия Puppet для этого undef
:
$redis_port = undef
Я поражаюсь сбою обоих if @var
и if @var != ''
когда в манифесте присвоено целочисленное значение. Это должно распространяться на ERB либо как строковое представление, либо как числовое значение, для которого оба выражения должны иметь значение true (только для Ruby nil
и false
являются false, если я не ошибаюсь).
Я попытаюсь воспроизвести, это может быть ошибкой.