2

我的食谱中有两个资源。第一个是user设置用户 uid/gid/home 目录等的资源。它使用supports :manage_home => true.

我的第二个资源是bash资源。目前该脚本在每次运行 chef-client 时都会运行,这有点不必要。我希望脚本仅manage_home在运行用户资源时被调用时运行(例如,如果用户的主目录被更改并且文件被移动,则运行脚本,否则什么都不做)。

我只能找到使用only_if一些纯 Ruby 条件的示例(例如,如果某个文件存在,如果一个节点在其运行列表中具有某个元素等),但我想做的需要条件是链接到另一个厨师资源的结果。我知道用户资源只是运行usermod(或useradd),这似乎没有表明主目录是否已移动。那么这甚至可能吗?

4

2 回答 2

3

资源有能力在任何状态变化时通知其他资源。

user "whatever" do
  action :modify
  notifies :run, "bash[modify user]", :immediately
end

您可以将资源的默认操作更改为:nothing,然后资源将仅在通知时运行。

bash "modify user" do
  command "ls"
  action :nothing
end

构成“状态更改”的内容在资源内部进行控制,但通常应该在资源采取任何操作时触发(这在资源中使用名为 的标志设置updated_by_last_action)。这可能不完全符合您的manage_home要求,但它比您bash一直运行要好。

于 2015-02-04T00:31:49.473 回答
0

@Matt顺便说一句,这里的 bash 资源仅在执行用户资源时才执行。如果使用资源是最新的,那么 bash 资源将无法正确执行。然后如何做反向。那是 bash 资源仅在用户资源不执行时才执行?我们必须在哪里为此提供条件?

于 2015-03-13T12:22:44.523 回答