(大量)非托管文件的 Puppet 计算哈希

Puppet computing hash of (massive) unmanaged files

我正在使用 managehome 设置为 true 的 puppet 管理用户。然后这个主目录填充了一些文件(在我的例子中是 2 个点文件)。

user { 'guillaume':
  ensure     => present,
  managehome => true,
}

file {'/home/guillaume':
  ensure  => present,
  purge   => false,
  recurse => true,
  source  => "puppet:///modules/${module_name}/home/${title}",
}

一切都很好,但我最终在我的主目录中放置了一个 25GB 的文件,puppet 正在计算它的哈希值(至少这是我的理解。我可以从 strace 中看到该文件确实是完全由木偶阅读)。一个完整的木偶运行用了大约20分钟,理论上应该在不到一分钟的时间内完成。删除文件使 puppet 运行 再次变快,证实了我的猜测。

为什么 puppet 会计算非托管文件的哈希值,我如何才能通过将这样的(合法)文件放在托管目录中来防止破坏 puppet?

Puppet 计算主目录中文件的校验和的原因是因为您递归地管理整个目录的内容,而该文件是目录内容的一部分。有几种方法可以改进您的 Puppet 资源以避免计算此校验和。

第一种是直接管理两个隐藏文件:

user { 'guillaume':
  ensure     => present,
  managehome => true,
}

file {'/home/guillaume/.file_one':
  ensure  => file,
  source  => "puppet:///modules/${module_name}/home/.file_one",
  require => User['guillaume'],
}
file {'/home/guillaume/.file_two':
  ensure  => file,
  source  => "puppet:///modules/${module_name}/home/.file_two",
  require => User['guillaume'],
}

请注意,上面我还修复了 file 资源上未指定的 ensure 值以及 user 资源上 file 资源缺少的依赖元参数。

第二种解决方案是不递归管理目录内容,因此忽略目录内容中未使用 source 属性管理的文件。您可以通过将 recurse 属性设置为 remote:

来实现此目的
user { 'guillaume':
  ensure     => present,
  managehome => true,
}

file {'/home/guillaume':
  ensure  => directory,
  recurse => remote,
  source  => "puppet:///modules/${module_name}/home/guillaume",
  require => User['guillaume'],
}

请注意,这会进行与上述解决方案相同的修复。

一些有用的文档:
https://puppet.com/docs/puppet/5.3/types/file.html
https://puppet.com/docs/puppet/5.3/metaparameter.html#require