由于Puppet中没有简单的方法来检查代理上是否存在文件,因此我正试图编写一个执行此检查的模块。然而,它并没有如预期的那样发挥作用。我做了以下工作:
- 在模块文件夹中,执行
puppet module generate root-mymodule
- 在
mymodule/manifests/file_check.pp
中
。。。。如果已定义(文件["/tmp/test_File"]({。。..
然而,这并不能达到我想要的目的。显然,它只检查文件是否在目录中定义。如何让它真正检查文件是否存在?
由于Puppet中没有简单的方法来检查文件是否存在代理,我正试图编写一个执行此检查的模块。
在使用主/代理排列的目录构建过程中,无法测试客户端是否存在任意文件。目录构建发生在master上;在该过程中没有办法从代理获得附加信息。如果您使用的是puppet apply
,那么您可以使用generate
函数,但这是一个陷阱,等待着有人稍后试图将您的代码移动到主代码。
if defined(File["/tmp/test_file"]) {
[…]没有达到我想要的目的。显然这只是检查目录中是否定义了文件。
是的,defined()
就是这么做的。事实上,更糟糕的是:defined()
只能测试特定File
资源的声明是否已经被评估过。它不能告诉您该资源的声明,这些声明稍后可能会在同一个目录构建运行中进行评估。由于显式评估顺序难以预测,defined
比无用更糟糕:它是危险的。请勿使用。
如何将其实际检查文件是否存在?
我想您希望及时执行这样的检查,以使用结果来影响目录构建。这就是事实的意义所在。Puppet提供了多种方法来定义和分发您自己的事实。对于测试特定文件是否存在这样简单的事情,我建议使用"外部事实"方法,而不是"自定义事实"方法。
但您也应该重新考虑您的前提,这显然是一个通用的机制,用于在编译时测试代理上是否存在任意文件,这将是一件有用的事情。事实上,这样的测试很少有用。Puppet有更好的方法来处理大多数任务,否则你可能会使用这样的东西,而剩下的大多数任务通常最好根本不完成。如果你想用这个来表达一些特定的东西,那么我邀请你就这个特定的东西提出一个新的问题。