Jenkins Puppet 3文件的递归速度非常慢

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

我正在AmazonLinux2012.09上使用Puppet3,我的一个清单设置并重新配置了一些目录。其中一项任务就是将文件夹所有者和组recursivelt更改为另一个用户-然而,这需要60秒才能完成,目录中几乎没有任何内容-终端中的chown myuser:myuser/var/lib/jenkins不到一秒钟

我的问题是:在Puppet中有没有更好/更快的方法递归地更改目录所有权

谢谢

 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],
  }