hiera работает с неопределенными переменными в шаблонах erb

Я начинаю использовать hiera для переменных среды или конкретных машин, но сталкиваюсь с проблемой, когда переменная нигде не может быть найдена. Желаемое поведение - это не включать в шаблон. Я сделал следующее: В моем манифестном коде

$yarn_app_mapreduce_am_command_opts=hiera('yarn.app.mapreduce.am.command-opts',undef) 

и в шаблоне erb у меня есть:

<% if !@yarn_app_mapreduce_am_command_opts.nil? %>   
    <property>
    <name>yarn.app.mapreduce.am.command-opts</name>
    <value><%= @yarn_app_mapreduce_am_command_opts %></value>
  </property>
<%end %>

Согласно документации здесь безопаснее всего тестировать на nil . Я пробовал несколько вариантов, но ни один из них не работал.

Может кто-нибудь помочь?


person jaksky    schedule 12.08.2014    source источник
comment
Каков результат приведенного выше кода? Какая у вас основная версия?   -  person Felix Frank    schedule 12.08.2014
comment
Спецификация свойства каждый раз включается (даже я пробовал обратную логику). Используем puppet 3.4.2, но в идеале мы хотели бы сохранить совместимость даже с 2.7, если это возможно. Я попробовал несколько условий (в том числе из прикрепленного марионеточного документа), и результат был таким же. Я нашел разные ссылки, и единственная разница была -% ›в конце тега, не знаю, что означает   -  person jaksky    schedule 12.08.2014


Ответы (1)


Похоже, это проблема с функцией hiera(). Я проверил следующий манифест.

$without_hiera = undef
$with_hiera = hiera('undefined_key', undef)

$no_hiera_template = 'Without Hiera: <% if @without_hiera.nil? %>nil<% else %>not nil: "<%= @without_hiera %>"<% end %>'
$hiera_template = 'With Hiera: <% if @with_hiera.nil? %>nil<% else %>not nil: "<%= @with_hiera %>"<% end %>'

notify {
    'hiera':
        message => inline_template($hiera_template);
    'no_hiera':
        message => inline_template($no_hiera_template);
}

Это дает:

Notice: Without Hiera: nil
Notice: /Stage[main]/Main/Notify[no_hiera]/message: defined 'message' as 'Without Hiera: nil'
Notice: With Hiera: not nil: ""
Notice: /Stage[main]/Main/Notify[hiera]/message: defined 'message' as 'With Hiera: not nil: ""'

Проблема известна и подробно обсуждалась, но приемлемого решения пока нет. Проблема воспроизводится с текущими ветвями master и puppet-4.

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

  1. Если значение логического false (обратите внимание, что оно отличается от String "false") никогда не подходит для ваших ключей, вы можете сделать false значением по умолчанию и просто протестировать <% if ! @value -%> в своих шаблонах.
  2. Если пустая строка никогда не является разумным значением, вы можете сделать это значение по умолчанию и проверить его, используя <% if ! @value.to_s.empty? -%>
  3. Наконец, вы могли бы написать свою собственную оболочку для функции hiera, которая перезаписывает произвольное значение по умолчанию, такое как __KEY_NOT_FOUND__ на nil. Ваш пробег может отличаться. См. Отчет об ошибке для некоторых указателей на предыдущую работу, которая может быть полезна.

Также может быть полезно узнать, была ли одна из связанных ошибок перенесена в Jira, и оставить голосование и примечание там, что это все еще проблема с Hiera.

person Felix Frank    schedule 12.08.2014
comment
Спасибо за отличный ответ! Есть ли разница между -% ›и%› в конце тега? - person jaksky; 13.08.2014
comment
Кстати: @ value.empty? не сработало для меня в случае, когда значение было определено как число в hiera, и я получал ошибку в том смысле, что функция пуста? не определено. - person jaksky; 13.08.2014
comment
Хорошая точка зрения! Я исправлю свой ответ, включив в этот образец to_s. :-) - person Felix Frank; 13.08.2014