【问题标题】:Puppet erb template - how do you compare two integersPuppet erb 模板 - 你如何比较两个整数
【发布时间】:2014-08-16 13:40:42
【问题描述】:

使用 puppet (3.6),我有以下 erb 模板

<% if @redis_port != ''%>
  redis['port'] = <%= @redis_port %>             
<% end %>

期望的行为是,如果$redis_port 不是nil 或空白,则将其打印出来。否则省略该行

redis['port'] = 6379

$redis_port 在 params.pp puppet manifest 中定义

$ 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 文档显示,我应该能够简单地使用 @redis_port 来简单地查询该值是否为 nil。

http://docs.puppetlabs.com/guides/templating.html



其他资源

https://ask.puppetlabs.com/question/3420/if-else-statement-in-erb-template/

【问题讨论】:

  • 首先:在 manifest 中执行 $varname = nil 是有缺陷的,因为 nil 在 Puppet 语言中没有特殊含义。您将字符串 "nil" 作为值。您想要$varname = undef,但有一些警告,如您发布的表格中所示。
  • 感谢@FelixFrank,您的评论让我找到了正确的答案。我不得不使用undef。如果您发布答案,我会接受。

标签: ruby operators erb puppet


【解决方案1】:

这里的核心问题是nil 不是 Puppet 中的保留字,而是被视为非定界字符串,表示值 'nil'。正如引用的文档所述,Puppet 的关闭模拟是 undef,因此:

$redis_port = undef

当清单分配一个整数值时,if @varif @var != '' 都失败了。这应该作为字符串表示或数值传播到 ERB,对于这两个表达式 应该 评估为真(对于 Ruby,只有 nilfalse 是假的,如果我不是错了)。

我会尝试重现,这可能是一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多