我正在尝试更改目录中每个文件的所有者,组和权限:
%w(/etc/nginx/ /etc/nginx/conf.d/ /var/l0g/nginx/).each do |path|
directory path do
owner "owner1"
group "group1"
mode '0755'
end
end
字符串
但是它只改变了%w()
中指定的目录的值,我希望这是递归的,特别是directory
关键字。
我怎么能让这个脚本更改所有者,组和权限的所有文件在指定的目录,包括目录本身?
多谢帮忙!
2条答案
按热度按时间kcwpcxri1#
directory
资源有一个recursive
属性,记录如下:recursive
个Ruby类型:
true
、false
|默认值:false
递归创建父目录,或递归删除目录和所有子目录。对于所有者、组和模式属性,此属性的值仅适用于叶目录。
因此,没有内置的方法来递归地设置目录中所有文件的权限。这也不是一个好主意,因为您的
mode
或755
将所有配置文件标记为可执行文件。由于nginx配置文件通常不是可执行的,这可能会做错误的事情!不过,如果您确实想这样做,您可以在
ruby_block
资源中编写一点Ruby,例如字符串
一个稍微“正确”的版本是:
型
在这里,我们使用符号模式描述而不是严格的数字模式描述。这允许我们使用
X
规范而不仅仅是x
。chmod规范如下:u
服务器(即所有者),设置r
ead和w
rite位。如果文件是一个目录或当前设置了ex
ecute位,则设置执行位。g
组和o
组,只设置r
ead位。如果文件是一个目录或当前设置了ex 1 m18n1x ecute位,则设置执行位。这样,所有目录都将设置执行/搜索位,只有那些以前设置了执行位的文件将保留它(但没有新文件填充获得执行位)。
作为一些最后的说明:
/etc/nginx/conf.d
已经包含在/etc/nginx
中,因此可以从列表中省略它。/var/l0g/nginx/
(路径中带有“零”字符),而是/var/log/nginx/
(带有一个小o)。2o7dmzc52#
来自 @Holger Just 的答案已经涵盖了更改权限/所有权的含义。除此之外,Chef是一个 configuration as code 工具,在管理已定义资源的状态方面非常有效。因此,使用它来更改资源,例如文件/目录,而不是直接由它管理,不能保证幂等操作。
考虑到所有这些,一种选择是使用script或execute资源运行相关的Linux命令。
使用
execute
资源的示例:字符串