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