【发布时间】:2023-07-22 11:50:01
【问题描述】:
我正在考虑为我们在食谱中使用的一些常见功能创建 LWRP 的选项。有没有办法在 LWRP 中传递节点属性并更新它?
第二个选项是创建库函数。如果调用者将节点属性传递给库函数,如何在函数中设置新值?
任何指向这些的指针都非常感谢。
【问题讨论】:
标签: chef-infra
我正在考虑为我们在食谱中使用的一些常见功能创建 LWRP 的选项。有没有办法在 LWRP 中传递节点属性并更新它?
第二个选项是创建库函数。如果调用者将节点属性传递给库函数,如何在函数中设置新值?
任何指向这些的指针都非常感谢。
【问题讨论】:
标签: chef-infra
确实需要更多细节才能确定地回答。
然后你会想要使用库函数而不是资源/提供者。您不必“传递”任何东西,因为 node 对象已经在库和 LWRP 中可用。您可以像使用node['path']['to']['attribute'] 一样访问属性,并使用node.default['path']['to']['attribute'](或.normal、.override 等)将它们设置为相同。如果你想真正花哨,并让方法变量,你可以做这样的事情。
*未经测试的代码(获取属性的路径,并将该属性设置为块的返回值,将属性的当前值传递给块)
def check_and_set(*attr_path, &check)
current, parent = node
leaf = nil
current = attr_path.reduce do |current, branch|
current[branch]
parent = current
leaf = branch
value = check.yield(current)
parent[leaf] = value
end
如果您不只是读取设置,那么您可能需要 LWRP。上述所有内容仍然适用。 node 对象仍然可用,您可以像在配方中一样读取和写入它。
【讨论】:
node 不是您期望的数据。将节点对象传递给库函数始终是一种更好的做法,这样您就可以在调用时获得node,而不是在编译时,或者可能在加载任何覆盖节点值的说明书之前。