【问题标题】:Chef recipes - use node name in attributes厨师食谱 - 在属性中使用节点名称
【发布时间】:2017-09-29 03:57:49
【问题描述】:

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

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'][...]...

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

【问题讨论】:

  • node 的示例值是什么,属于哪类对象?
  • 抱歉,我的属性以default 开头,而不是node。我计划将不同的服务器名称作为您看到server1, server2, etc 的属性的第一部分。计划是传入服务器名称并与属性匹配。

标签: ruby chef-infra


【解决方案1】:

取决于您的命名约定。 ohai 看起来不像是自动收集节点名称信息,但确实收集了很多信息。

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

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

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

要查看 ohai 的全部内容(node 下的所有内容)登录到引导计算机并在 shell 中键入 ohai。它相当多,因此您可能希望输出到文本文件并使用编辑器滚动/搜索它。

编辑1: 在测试厨房中,位置发生了变化。它变成<your kitchen cache location>\client.rb> EX,如果你在windows上使用vagrant,它的默认值变成c:\users\vagrant\appdata\local\temp\kitchen\client.rb

编辑2: 回到你原来的例子,如果你的 node['server'] 的内容可以是 PT1 或 PT2 那么你可以执行以下操作

setup(node['server'])

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

【讨论】:

  • 如果需要,我可以将其更改为相同的主机名。因此,如果我这样做了,node['hostname'][PT1] 在我的配方中,如果主机名是server1,它会找到属性default['server1']['PT1]?我认为它会寻找以default['hostname'] 开头的实际属性,而不是转换它。
  • 编辑以匹配您的编辑:node['hostname'] 返回 Chef 正在运行的当前服务器的主机名。如果您的主机名是 server1,它将返回“server1”,而 server2 上的相同代码将返回“server2”。 ohai 只知道它的当前节点。
【解决方案2】:

你甚至可以让它完全动态化:

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

【讨论】:

    最近更新 更多