如何测试Puppet Master上是否存在文件

时间:2013-09-13 10:41:11

标签: ruby linux puppet

在Puppet上的自定义模块中我有

g_iptables
├── files
│   └── fqdn-of-server
├── lib
│   └── puppet
│       └── parser
│           └── functions
│               └── file_exists.rb
└── manifests
    └── init.pp

我想让模块做一些事情,无论Puppet Master上是否存在“fqdn-of-server”文件。谷歌搜索确实给我一个file_exists.rb函数:

#!/usr/bin/ruby

require 'puppet'

module Puppet::Parser::Functions
  newfunction(:file_exists, :type => :rvalue) do |args|
    if File.exists?(args[0])
      return 1
    else
      return 0
    end
  end
end

,这在以下内容中起作用:

$does_fqdn_file_exists = file_exists("/tmp/$fqdn")

if $does_fqdn_file_exists == 1 {
 ...
}

在我的清单init.pp中(当然$ fqdn是一个因素)。问题是它只能在客户端上运行(因此如果客户端$ fqdn上存在/ tmp / $ fqdn,则$ does_fqdn_file_exists为1,它对puppet master无效。

另外,我想在这个构造中使用puppet:/// uri结构,但是因此,我的函数不理解这个uri。

有人能帮助我吗? ruby函数源于网络上的某个人,他声称它检查主文件上存在的文件,但事实并非如此(至少不是我能看到的)。

4 个答案:

答案 0 :(得分:4)

Alex G为我提供了一些修正解决方案,也许对其他人有用:

if file('/does/it/exist', '/dev/null') != '' {
    # /does/it/exist must exist, do things here
}

答案 1 :(得分:2)

在木偶大师中你可以这样测试:

# create a temporary file that may look like this :

]$ cat /tmp/checkfile.pp
$does_fqdn_file_exists = file_exists("/tmp/$fqdn")
notify{ "Check File = $does_fqdn_file_exists" : }

# Then run it :

]$ puppet apply /tmp/checkfile.pp

答案 2 :(得分:1)

这是使用标准函数库的方法。使用“未找到”内容在已知位置创建文件,并使用此检查:

if file('/does/it/exist', '/file/containing/not_found') != 'not found' {
    # /does/it/exist must exist, do things here
}

这是因为puppet中的file()函数将读取实际存在的第一个文件的内容。通过这种方式使用它的一种方法,但它可以工作,不需要修改默认的功能集。

答案 3 :(得分:0)

您可以使用exist()函数 https://gist.github.com/j4m3s/3307835 我希望它有所帮助