Chef配方 - 在属性中使用节点名称

时间:2017-09-28 15:31:08

标签: ruby chef

在厨师食谱中,我有以下代码:

if (node['server1']['PT1'] == true)
   setup('PT1')
elsif (node['server1']['PT2'] == true)
   setup('PT2')
end

我正在检查我的属性,以查看PT1或PT2的值是否等于true。如果我将server1硬编码到代码中,但我想知道根据运行此代码的服务器动态执行此操作,这是正常的。如何使用node['server1']之类的内容替换node.name以在属性文件中查找不同的服务器。我的属性的一个例子是:

default['server1'][...]...
default['server2'][...]...
default['server3'][...]...
default['server4'][...]...

如果我能动态地查看不同的服务器,那将是理想的结果。

2 个答案:

答案 0 :(得分:1)

取决于您的命名约定。它看起来并不像ohai自动收集节点名称信息,但它收集了大量信息。

如果您的节点名称周围有标准,例如使用其主机名或fqdn作为节点名称,那么您可以简单地查询它。

node['hostname']... node['fqdn']...

如果您使用更深奥的方法来命名与您的主机信息无关的节点,您仍然可以查询位于您的节点上的client.rb,这是您的节点知道如何识别自己的主厨服务器。在Windows上,它位于C:/chef/client.rb,在UNIX上位于/etc/chef/client.rb。我会把解析文件留给你。

要查看ohai(node下的所有内容)的完整范围,请登录到自举机器并在shell中键入ohai。它相当多,所以您可能希望输出到文本文件并使用编辑器滚动/搜索它。

EDIT1: 在测试厨房中,位置发生变化。它变为<your kitchen cache location>\client.rb> EX,如果你使用带有窗口的vagrant并且它的默认值变为c:\users\vagrant\appdata\local\temp\kitchen\client.rb

EDIT2: 要将其恢复到原始示例,如果节点['server']的内容可以是PT1或PT2,那么您可以执行以下操作

setup(node['server'])

您可以通过各种机制控制服务器的内容。如果您通过主机名控制它,那么您可以这样做 attributes/default.rb ... node['server']= node['hostname'] 或者更简单地说,如果你的标准允许它 recipes/default.rb ... setup(node['hostname']) 虽然通常您可以控制在运行列表中定义的单独配方中设置的内容。

答案 1 :(得分:1)

你甚至可以使它完全动态:

node['whatever'][node.name].each do |key, value|
  setup(key) if value == true
end