【问题标题】:Chef recipe - how to run a resource only if user resource did manage_home厨师食谱-仅当用户资源执行manage_home时如何运行资源
【发布时间】:2015-04-02 23:07:58
【问题描述】:

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

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

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

【问题讨论】:

  • 你能在运行前后检查主目录的差异吗?您可以将命令的值分配给像node[:blah] = `ls -la /home/blah` 这样的节点,请参阅stackoverflow.com/questions/16309808/…
  • 感谢您的帮助!

标签: ruby chef-infra cookbook recipe


【解决方案1】:

资源能够在任何状态更改时notify 其他资源。

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 要好。

【讨论】:

  • 谢谢,我不知道。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多