0

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

if node[:etc][:group].has_key?('someuser') and node[:etc][:group][:someuser][:gid] == 12345
    # do something...
else
    # do something else...
end

我曾经knife 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子句正在执行?谢谢。

4

1 回答 1

0

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

您不能覆盖自动属性。

您可以在此处了解有关厨师运行的更多详细信息,并在此处了解有关属性的详细信息

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

示例(深受doc启发):

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

但是组创建可以在您的 else 块中,并且下一次厨师运行将进入 if 块,因为该组将存在。

于 2015-02-04T08:02:55.203 回答