首页 > 解决方案 > 检查文件是否存在的 Puppet 模块

问题描述

由于 Puppet 中没有简单的方法来检查代理上是否存在文件,因此我正在尝试编写一个执行此检查的模块。但是,它没有按预期工作。我做了以下事情:

  1. 在模块文件夹中,执行

puppet module generate root-mymodule

  1. mymodule/manifests/file_check.pp
    ..
    ..
      如果定义(文件[“/tmp/test_file”]){
    ..
    ..

但是,这并没有达到我想要的效果。显然它只检查文件是否在目录中定义。如何让它实际检查文件是否存在?

标签: puppet

解决方案


由于 Puppet 中没有简单的方法来检查代理上是否存在文件,因此我正在尝试编写一个执行此检查的模块。

在使用主/代理安排时,无法在目录构建期间测试客户端是否存在任意文件。目录构建发生在主服务器上;在此过程中,无法从代理处获得其他信息。相反,如果您正在使用,puppet apply那么您可以使用该generate功能,但这是一个等待咬人的陷阱,该人后来试图将您的代码移动到主机。

      if defined(File["/tmp/test_file"]) {

[...] 没有达到我想要的效果。显然它只检查文件是否在目录中定义。

是的,就是defined()这样。实际上,它比这更糟糕:defined()只能测试该特定File资源的声明是否已经被评估。它无法告诉您稍后可能在同一目录构建运行中评估的该资源的声明。由于清单评估顺序难以预测,defined因此比无用更糟糕:它很危险。不要使用它。

如何让它实际检查文件是否存在?

我想您想及时执行这样的检查以使用结果来影响目录构建。这就是事实的目的。Puppet 提供了多种方法来定义和分发您自己的事实。对于像测试特定文件是否存在这样简单的事情,我建议使用“外部事实”方法而不是“自定义事实”方法。

但是您还应该重新考虑您的前提,这显然是一种通用机制,用于编译时测试代理上是否存在任意文件将是有用的。事实上,这样的测试很少有用。Puppet 有更好的方法来处理大多数任务,否则你可能会使用这样的东西,而剩下的大多数任务通常最好根本不做。如果你想要这个特定的东西,那么我邀请你就那个特定的东西提出一个新问题。


推荐阅读