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" 的花哨词)。
首先,我对编码和 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" 的花哨词)。