Проверьте, является ли переменная undef в шаблоне puppet

как правильно проверить, является ли переменная undef в шаблоне марионетки?

в манифесте переменная определяется следующим образом

$myvar = undef

как это проверяется в шаблоне?

увидено следующие два варианта

<% if @myvar -%>
<% end -%>

и

<% if not @myvar.nil? and @myvar -%>
<% end -%>

Они оба, кажется, работают в моем случае, но мне интересно, если первый подход не срабатывает в определенных случаях?

3 ответов


документация марионетки (на момент написания этого ответа) объясняет это очень хорошо: https://docs.puppet.com/puppet/latest/reference/lang_template_erb.html#testing-for-undefined-variables

С undef - Это не то же самое как false, просто с помощью if это не лучший способ проверить это. Также, когда переменная определена, но имеет значение false или nil также невозможно проверить с помощью простого if.

это почему вы хотите использовать scope.lookupvar(‘variable’) и проверьте его возвращаемое значение для :undef или :undefined (или nil), чтобы узнать, было ли установлено значение undef, или не ставить вообще.


первый должен работать как шарм, это то, что преподается на курсах, а также.

номер два, кажется... избыточный.


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

Я использую следующие правила:

требуются переменной

проверьте в своем кукольном скрипте, содержит ли переменная ожидаемое значение, прежде чем даже рассматривать рендеринг шаблона:

if $myvar == undef {
    fail {"You really must set myvar, seriously."}
}

if ! $anothervar {
    fail {"anothervar is false, undefined or empty."}
}

вы можете сделать вашу жизнь проще, установив тип параметров явно. Это избавляет вас от сравнения типов и преобразования.

в вашем шаблоне вы просто пишете переменные, а затем:

<%= @myvar %>
<%= @anothervar %>

необязательная переменная, которая должна быть определена

если вы предполагаете, что переменная определена, вы можете рассматривать ее как логическую.

отображение выглядит следующим образом (источник):

  • falsey: пустая строка, false, undef
  • истина: все остальное

В Кукольный >=4:

  • falsey: false, undef
  • истина: все остальное

примеры:

print 'something', если @myvar оценивает значение true, в противном случае'something else'.

<% if @myvar %>something<% else %>something else<% end %>

печать "что-то", если @myvar оценивает значение true

<% if @myvar %>something<% end %>

print @myvar, если он оценивает значение true, в противном случае "альтернатива"%>

<%= @myvar ? @myvar : 'alternative'  %>

необязательная переменная, которая может быть определено

если вы не уверены, что переменная даже определена и не хотите делать неправильные предположения, проверьте ее в шаблоне.

примеры:

напечатайте "что-то", а затем @myvar, если @myvar определен и не пуст

<% if defined?(@myvar) && ! @myvar.empty? %>something<%= @myvar %><% end %>

print @myvar, если он определен и больше 10

<%= @myvar if defined?(@myvar) && @myvar > 10 %>