Chef 执行块

Chef execute block

首先,我对编码和 Chef 还很陌生,所以如果我提出愚蠢的问题,请多多包涵。

如果用户不匹配,有没有办法让我的执行块仅在配方中 运行。这只是一个简单的一行语句:chown -R aaa:aaa file/path。所以如果file/path的拥有者已经是aaa了,就不要运行这个。

如果我对这个问题不清楚,我深表歉意,我会尽力解决。

如有任何帮助,我们将不胜感激。感谢您的宝贵时间。

您可以使用 not_if,像这样:

require 'etc'

execute "chown file/path" do
  command "chown -R aaa:aaa file/path"
  not_if { Etc.getpwuid(File.stat("file/path").uid).name == "aaa" }
end

如果您还想检查组,只需将其添加到条件中即可。

请注意,您的方法并不是真正的幂等,因为该目录可能属于 aaa 但包含其他人的文件。似乎总是 运行 chown 更好,没有条件,这样它会强制所有内容为 aaa:aaa。如果文件已经 aaa:aaa,则什么也不会发生。

所以另一个答案在技术上是正确的,但真正的方法是使用 file 资源:

file 'file/path' do
  owner 'aaa'
  group 'aaa'
end

这在内部已经是幂等的("don't change things that are already fine" 的花哨词)。