Chef infra 如何使用Chef递归地更改目录上的所有者和组?

Chef infra 如何使用Chef递归地更改目录上的所有者和组?,chef-infra,file-permissions,Chef Infra,File Permissions,resource\u目录只有两个可用操作:create和delete 我需要递归地更新目录的所有者和组 我该怎么做 使用简单的资源\u执行 execute "chown-data-www" do command "chown -R www-data:www-data /var/www/myfoler" user "root" action :run end 我们可以编写一个chef资源,它可以遍历目录层次结构,为找到的每个文件创建一个文件或目录资源,然后将其设置为管理这些文件的所有

resource\u目录
只有两个可用操作:
create
delete

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

我该怎么做

使用简单的
资源\u执行

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

我们可以编写一个chef资源,它可以遍历目录层次结构,为找到的每个文件创建一个文件或目录资源,然后将其设置为管理这些文件的所有者和组。但是,您不会喜欢这样,因为如果您在该目录中有1000个文件,那么您将获得1000个chef资源,并且您的聚合将非常缓慢

如果你想,你可以,事实上,滚动你自己的代码,就像我在@name引用的票证中写的那样,但我不推荐这样做

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

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

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


tl;dr表示您的解决方案很好,如果您愿意,您可以添加一个not_if防护装置您可以将默认操作设置为nothing,然后拥有可能会出错的资源通知烫发修复者:

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
如果有更多选项,您可以执行以下操作:运行,但如果父文件夹已经是正确的烫发,则不能运行。您可以将其更改为包含更深层次的/problem文件/目录,或者使用类似于的find命令


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

如果这是一次性修复权限,您的最短路径可能就是ssh。(我是在自己搜索到这里后才这么做的。)

ssh'name:'“sudo chown-R$user:$group/full/path/to/directory”

ssh'name:'“sudo chmod-R 770/full/path/to/directory”

如果我从头开始设置,我想我需要用一行设置路径和适当的权限(注意:显式地将perm应用于路径中的每个父级)


然后将每个人创建为一个烹饪书文件。

我将使用普通资源目录
操作:创建
。 根据文件:

:create
Default. Create a directory. If a directory already exists (but does not match), update that directory to match

答案满足了我的需要,但
grep
命令存在问题,即使用户是
apache2
apach
,grep退出代码将是
0
,但我需要用户完全是
apache
(CentOS 7.7上的apache web服务器用户)

这是我的食谱:

node[“apache”][“sites”]。每个节点都有| sitename和数据|
document_root=“/content/sites/#{sitename}”
目录文档\u根目录
行动:创建
模式“0755”
递归真
所有者“apache”
“apache”组
结束
执行“chown_to_apache_user”do
命令“chown-R apache:apache/content”
用户“根”
操作:运行
如果“[$(stat-c%U/content/)=”apache“],则不是
结束
模板“/etc/httpd/conf.d/#{sitename}.conf”do
来源“vhost.erb”
模式“0644”
变数(
:document\u root=>document\u root,
:port=>data[“port”],
:domain=>data[“domain”]
)
通知:重新启动,“服务[httpd]”
结束
结束
作为比较:

注意:要同时检查

node[“apache”][“sites”]。每个节点都有| sitename和数据|
document_root=“/content/sites/#{sitename}”
目录文档\u根目录
行动:创建
模式“0755”
递归真
所有者“apache”
“apache”组
结束
执行“chown_to_apache_user”do
命令“chown-R apache:apache/content”
用户“根”
操作:运行
如果“[$(stat-c%U/content/)=“apache”]&&&[$(stat-c%G/content/)=“apache”]”,则不可用
结束
模板“/etc/httpd/conf.d/#{sitename}.conf”do
来源“vhost.erb”
模式“0644”
变数(
:document\u root=>document\u root,
:port=>data[“port”],
:domain=>data[“domain”]
)
通知:重新启动,“服务[httpd]”
结束
结束

您是在创建目录还是只是浏览现有目录
resource\u目录
将允许您设置
模式
,您可以使用该模式设置粘性位,并使其下的所有内容都从该模式继承。另请参考:关于为什么他们从未添加递归chmod。execute语句可能是确定它是否覆盖目录或只是更改权限的最简单方法,但您可以使用
目录
资源和
递归true
选项。@jarsever无关用户,类似问题。使用目录资源和递归操作不会编辑目录中所有文件的所有者。文档中说只有叶节点是chowned。@jarsever recursive选项是指定创建父目录,如果需要的话。在上一节中,我猜您的意思是:如果“stat-c%U/var/www/myfolder | grep www data”,您可以运行
chown
,使用
--verbose
将其列出
%w[ /foo /foo/bar /foo/bar/baz ].each do |path|
  directory path do
    owner 'root'
    group 'root'
    mode '0755'
  end
:create
Default. Create a directory. If a directory already exists (but does not match), update that directory to match