gpt4 book ai didi

ruby - 访问 Chef 库中的节点属性

转载 作者:数据小太阳 更新时间:2023-10-29 06:39:05 26 4
gpt4 key购买 nike

我想创建一个 Chef 库:

  • 提供一些命名空间函数
  • 访问节点的属性

该库旨在与外部系统交互并从那里检索一些输入。我需要访问节点属性以允许用户覆盖从外部系统接收的输入:

所需的用法(配方)

inputs = MyLib.get_inputs

图书馆(我现在拥有的)

这是受 those docs 的启发.

class Chef::Recipe::MyLib
def self.get_inputs
override_inputs = node.fetch(:mylib, Hash.new).fetch(:override_inputs, nil)

unless override_inputs.nil?
return override_inputs
end

# Do stuff and return inputs (no problem here)
# ...
end
end

问题

现在我得到:

undefined local variable or method `node' for Chef::Recipe::Scalr:Class

最佳答案

您无权访问库中的节点对象,除非您将它传递给初始化程序:

class MyHelper
def self.get_inputs_for(node)
# Your code will work fine
end
end

然后你调用它:

inputs = MyHelper.get_inputs_for(node)

或者,您可以创建一个模块并将其混合到 Chef Recipe DSL 中:

module MyHelper
def get_inputs
# Same code, but you'll get "node" since this is a mixin
end
end

Chef::Recipe.send(:include, MyHelper)

然后您就可以在菜谱中访问 get_inputs 方法:

inputs = get_inputs

请注意,这是一个实例方法,而不是一个类方法。

简而言之,除非作为参数给出,否则库无法访问 node 对象。模块会,如果它们混合到 Recipe DSL 中的话。此外,node 对象实际上是一个实例变量,因此它在类级别(即self.)不可用。

关于ruby - 访问 Chef 库中的节点属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22078318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com