Ruby 厨师菜谱节点哈希不';t与chef服务器节点数据中的数据不同

Ruby 厨师菜谱节点哈希不';t与chef服务器节点数据中的数据不同,ruby,chef-infra,recipe,Ruby,Chef Infra,Recipe,我在配方中有一个条件,用于检查某些节点数据: if node[:etc][:group].has_key?('someuser') and node[:etc][:group][:someuser][:gid] == 12345 # do something... else # do something else... end 我使用node edit hostname.mydomain.com将此数据添加到我的节点对象中,如所示 $ knife node show hostn

我在配方中有一个条件,用于检查某些节点数据:

if node[:etc][:group].has_key?('someuser') and node[:etc][:group][:someuser][:gid] == 12345
    # do something...
else
    # do something else...
end
我使用
node edit hostname.mydomain.com
将此数据添加到我的节点对象中,如所示

$ knife node show hostname.mydomain.com -m
Node Name:   hostname.mydomain.com
Environment: ...
FQDN:        hostname.mydomain.com
IP:          ...
Run List:    ...
Roles:       ...
Recipes:     ...
Platform:    ...
Tags:        ...
Attributes:..
etc:
  group:
    someuser:
      gid:     12345
      members:

tags:        ...

但是,执行的是
else
子句,而不是
if
子句。我检查了这是在节点上运行的配方的版本(查看了下载到节点上的配方)。我以为我已经正确地设置了节点来执行
if
子句,那么为什么执行
else
子句呢?谢谢。

节点etc键由ohai创建(并在自动键下)并在每次运行时重写,尝试在节点对象中设置这些属性将不起作用

不能覆盖自动属性

您可以了解有关在厨师运行中执行的操作的更多详细信息以及有关属性的详细信息

您可以在这里使用
group
资源在配方中创建组,并在进入循环之前重新加载ohai数据

示例(灵感来源于):

但是组创建可以在else块中,下一次chef运行将进入if块,因为组将存在

ohai "reload_passwd" do
  action :nothing
  plugin "etc"
end
group 'somegroup' do
  gid 12345
  notifies :reload, "ohai[reload_passwd]", :immediately
end

ruby_block "your code" do # in a ruby block to be run at converge time and not at compile time.
  if node[:etc][:group].has_key?('someuser') and node[:etc][:group][:someuser][:gid] == 12345
    # do something...
  else
    # do something else...
  end
end