Ruby 奇怪的厨师问题对真/假的评估

Ruby 奇怪的厨师问题对真/假的评估,ruby,chef-infra,Ruby,Chef Infra,我在Windows上使用chef客户端(12.18.31,嵌入式Ruby是Ruby 2.3.1p112)时遇到了一个奇怪的问题(bug)。仅在配方中使用节点属性的值是不够的-我需要将其与true进行比较。具体而言: desired_mcafee_state = node['McAfee_enabled'] ? [:enable, :start] : [:disable, :stop] puts "DEBUG: McAfee is #{node['McAfee_enabled']}, des

我在Windows上使用chef客户端(12.18.31,嵌入式Ruby是Ruby 2.3.1p112)时遇到了一个奇怪的问题(bug)。仅在配方中使用节点属性的值是不够的-我需要将其与
true
进行比较。具体而言:

desired_mcafee_state =
  node['McAfee_enabled'] ? [:enable, :start] : [:disable, :stop]

puts "DEBUG: McAfee is #{node['McAfee_enabled']}, desired state is: #{desired_mcafee_state}"
这将生成调试输出:

DEBUG: McAfee is false, desired state is: [:enable, :start]
而此语法:

desired_mcafee_state =
  node['McAfee_enabled'] == true ? [:enable, :start] : [:disable, :stop]

puts "DEBUG: McAfee is #{node['McAfee_enabled']}, desired state is: #{desired_mcafee_state}"
正确产生:

DEBUG: McAfee is false, desired state is: [:disable, :stop]
这在irb中运行良好:

$ irb
irb(main):001:0> node={}
=> {}
irb(main):002:0> node['McAfee_enabled']=false
=> false
irb(main):003:0> desired_mcafee_state =
irb(main):004:0* node['McAfee_enabled'] ? [:enable, :start] : 
[:disable, :stop]
=> [:disable, :stop]

一个我不理解的bug或厨师的怪癖?

在注释中解决,值是字符串
“false”
,在Ruby的世界观中这是真实的。

在第一个例子中,你确定它不是字符串
“false”
?如果它是字符串,请小心,因为它是“true”!=重要的是,“false”是一个真实值(因为每个字符串都是真实值)。是的。愚蠢的我。。。我在
attributes/default.rb
中将它设置为
true
,但在环境的json定义文件中,它被设置为
“false”
。。。