在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函数源于网络上的某个人,他声称它检查主文件上存在的文件,但事实并非如此(至少不是我能看到的)。
答案 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 我希望它有所帮助