如何使用Chef以递归方式更改目录上的所有者和组?

zab*_*mba 21 file-permissions chef-infra

在resource_directory有可用的只有2个动作:create和delete

我需要递归更新目录的所有者和组.

我怎么做?

使用简单resource_execute?

execute "chown-data-www" do
  command "chown -R www-data:www-data /var/www/myfoler"
  user "root"
  action :run
end
Run Code Online (Sandbox Code Playgroud)

Bil*_*ner 12

您可以将默认操作设置为空,然后使用可能搞砸的资源通知perm修复程序:

execute "chown-data-www" do
  command "chown -R www-data:www-data /var/www/myfoler"
  user "root"
  action :nothing
end

resource "that may screw up perms" do
  stuff "one two three"
  notifies :run, execute "chown-data-www"
end
Run Code Online (Sandbox Code Playgroud)

如果有更多选项,您可以执行操作:运行但不是如果父文件夹已经是正确的权限.您可以将其更改为包含更深/有问题的文件/目录,或者使用与此类似的find命令

execute "chown-data-www" do
  command "chown -R www-data:www-data /var/www/myfoler"
  user "root"
  action :run
  not_if '[ $(stat -c %U /var/www/myfolder) = "www-data" ]'
end
Run Code Online (Sandbox Code Playgroud)

编辑:修复以反映下面的评论


lam*_*ont 2

我们可以编写一个 Chef 资源,它会遍历目录层次结构,并为其找到的每个文件创建一个文件或目录资源,然后将其设置为管理这些文件的所有者和组。然而,您不会喜欢这样,因为如果该目录中有一千个文件,那么您将获得一千个厨师资源,并且您的收敛速度会很慢。

事实上,如果您愿意,您可以编写自己的代码,该代码的功能类似于我在 @name 引用的票证Tickets.opscode.com/browse/CHEF-690中编写的代码,但我不推荐这样做。

如果您试图防止“篡改”并修复用户和组属性的随机损坏,那么您的解决方案可能是正确的。您将始终在每次厨师收敛时执行该命令,并且资源将始终显示为正在更新,但该命令将尽可能快地运行(chown -R 基本上是收敛和幂等的,因为它在尝试设置权限之前检查权限)。您不会得到有关固定权限的报告,这是唯一的缺点。

如果您只是尝试在构建服务器时修复一次权限,那么您应该在其中添加一个 not_if 条件来检查根目录是否具有正确的权限,您不必每次都运行它。这将为您提供幂等行为,并且不会在每次运行时执行该命令,但缺点显然是,如果该目录结构下的某个文件的权限将来被某人或某物破坏,那么它将无法得到纠正。

这里有一个单一资源的可能用例,其行为类似于 chown -R,然后报告它修复的内容(以及权限已更改的文件数组),这对于 SOX 和 PCI-DSS 报告等情况很有用,但我们不这样做目前涵盖该用例。

tl;dr 是你的解决方案很好,如果你愿意,你可以添加一个 not_if 防护