Jenkins Puppet 3文件的递归速度非常慢
我正在AmazonLinux2012.09上使用Puppet3,我的一个清单设置并重新配置了一些目录。其中一项任务就是将文件夹所有者和组recursivelt更改为另一个用户-然而,这需要60秒才能完成,目录中几乎没有任何内容-终端中的chown myuser:myuser/var/lib/jenkins不到一秒钟 我的问题是:在Puppet中有没有更好/更快的方法递归地更改目录所有权 谢谢Jenkins Puppet 3文件的递归速度非常慢,jenkins,puppet,Jenkins,Puppet,我正在AmazonLinux2012.09上使用Puppet3,我的一个清单设置并重新配置了一些目录。其中一项任务就是将文件夹所有者和组recursivelt更改为另一个用户-然而,这需要60秒才能完成,目录中几乎没有任何内容-终端中的chown myuser:myuser/var/lib/jenkins不到一秒钟 我的问题是:在Puppet中有没有更好/更快的方法递归地更改目录所有权 谢谢 file {'/var/lib/jenkins': ensure => 'directo
file {'/var/lib/jenkins':
ensure => 'directory',
owner => myuser,
group => myuser,
recurse => true,
require => Package['jenkins'],
}
我也看到了这种缓慢,这似乎是由于Puppet分别检查
/var/lib/jenkins
下的每个文件,以确保其拥有正确的所有者权限,这需要时间,因为$jenkins\u HOME
下有很多文件
我在Jenkins服务器上解决了这个问题,只要顶级目录不属于所需用户,我就运行一个简单的chown-R
命令(使用exec
):
define modify_owner(){
exec{“修改所有者${title}”:
command=>“/bin/chown-R${user}:${user}'${title}'”,
onlyif=>“/usr/bin/stat-c%U'${title}'| grep'^${default_user}$'”
}
}
修改所有者{['/var/lib/jenkins','/var/log/jenkins','/var/cache/jenkins']:}
$user
/$user
是我希望这些目录归其所有的所有者/组组合。这让我的木偶时代回到了正常水平
(注意:我使用了
stat-c%U
,但您可能需要根据您的操作系统调整确切的格式选项。此命令打印所有者的文本名称,并在Linux上对我有效。)@stuart-m的变通方法是正确的基本结构。如果需要深入,请使用find和xargs。我没有幸运地得到他的简化用例
请注意,Puppet的速度慢不仅仅是因为它需要检查的文件数量。这是因为木偶在某些任务上表现得很慢
我在wordpress目录树(Debian10)上对此进行了测试
所以那里有五万个文件——这大约花了七分之一秒来确定。现在,我们检查实际的文件所有权属性:
# time find /var/www/*/wordpress/wp-content/ -not -group www-data | wc -l
38603
real 0m0.236s
user 0m0.056s
sys 0m0.188s
更深入一点-这花了大约四分之一秒
让我们全部改变:
time find /var/www/*/wordpress/wp-content/ -type f -exec chmod 0640 {} \;
real 0m44.392s
user 0m29.520s
sys 0m14.729s
# time find /var/www/*/wordpress/wp-content/ -type d -exec chmod 2750 {} \;
real 0m4.935s
user 0m3.288s
sys 0m1.666s
好的,五十秒。其中有多少是shell调用
# time bash -c "find /var/www/*/wordpress/wp-content/ -type f -print0 | xargs -0 chmod 0640"
real 0m0.452s
user 0m0.148s
sys 0m0.513s
# time bash -c "find /var/www/*/wordpress/wp-content/ -type d -print0 |xargs -0 chmod 2750 "
real 0m0.149s
user 0m0.024s
sys 0m0.158s
很好,天哪,几乎所有的都是贝壳叉——实际上只花了大约一秒钟
我在这里结束是因为同一棵树上的目录:recurse=>true
大约需要800秒。这对于shell命令在一两秒钟内就能完成的事情来说实在太慢了
我不喜欢浪费I/O,但考虑到这方面的时间安排,如果您的文件系统是本地的(这只是一台7美元/mo的托管机器,带有旋转的锈迹驱动器),那么您可能可以在每次运行时执行find/xargs/ch[own/mod]
编辑:我编写了一个puppet函数来“完成它”,它在2秒内运行了18个单独的实例化,覆盖了50000个文件。大约比让木偶处理要快400倍。第一部分,定义类型:
define my_class::permissions_tree (
String $owner = 'root',
String $group = 'root',
String $fmode = '0644',
String $dmode = '0755',
) {
$path = $title
case $os_family {
'Debian' : {
$find = '/usr/bin/find'
$xargs = '/usr/bin/xargs'
$chmod = '/bin/chmod'
$chown = '/bin/chown'
}
}
$permissions_command_owner = "${find} $path \( -not -user ${owner} -or -not -group ${group} \) -print0 | $xargs -0 --replace=found $chown ${owner}:${group} found"
$permissions_command_dirs = "${find} $path \( -type d -and -not -perm ${dmode} \) -print0 | $xargs -0 --replace=found $chmod ${dmode} found"
$permissions_command_files = "${find} $path \( -type f -and -not -perm ${fmode} \) -print0 | $xargs -0 --replace=found $chmod ${fmode} found"
$permissions_command = join([$permissions_command_owner,$permissions_command_dirs,$permissions_command_files], ";")
exec { "permissions_tree_${path}" :
path => [ '/sbin', '/bin', '/usr/sbin', '/usr/bin' ],
command => $permissions_command,
provider => shell,
}
} # permissions_tree
第2部分,使用它,类似于:
my_class::permissions_tree { "$some_dir/subdir" :
owner => $my_owner,
group => $my_group,
dmode => '2750',
fmode => '0640',
require => File[$some_dir],
}
require只是一个元参数,在那里使用您需要的任何东西。如果不是Debian,请添加操作系统路径
编辑2:添加了print0布尔值所需的参数
my_class::permissions_tree { "$some_dir/subdir" :
owner => $my_owner,
group => $my_group,
dmode => '2750',
fmode => '0640',
require => File[$some_dir],
}