【问题标题】:Passing and updating chef node attributes传递和更新厨师节点属性
【发布时间】:2023-07-22 11:50:01
【问题描述】:

我正在考虑为我们在食谱中使用的一些常见功能创建 LWRP 的选项。有没有办法在 LWRP 中传递节点属性并更新它?

第二个选项是创建库函数。如果调用者将节点属性传递给库函数,如何在函数中设置新值?

任何指向这些的指针都非常感谢。

【问题讨论】:

    标签: chef-infra


    【解决方案1】:

    确实需要更多细节才能确定地回答。

    如果你只是阅读和设置属性

    然后你会想要使用库函数而不是资源/提供者。您不必“传递”任何东西,因为 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,而不是在编译时,或者可能在加载任何覆盖节点值的说明书之前。
    • 感谢 Tejay 和 Martin。