Шаблон Puppet erb — как вы сравниваете два целых числа

#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, если я не ошибаюсь).

Я попытаюсь воспроизвести, это может быть ошибкой.