这似乎位于stackoverflow和serverfault的域之间,但它似乎最终是一个开发问题,所以我在这里发布。
为了让我的Puppet树更干一些(同时避免巨大的if-else梯子和hacky" / dev / null"我的清单中的后备),我希望能够只召唤一个函数与模板/文件的混合列表按顺序查找,并使用(并在必要时展开)找到的第一个。我基于一些古老的代码大量编写了下面的代码(请参阅注释行以获取该代码的链接)。我不明白为什么它还没有发挥作用,如果有人能找到我错过(或误解)的东西,我将不胜感激。
我确保:
我已经尝试失败了:
wrapper.file = filepath
代替wrapper.file = filename
以及许多其他事情,我不会列出,因为它们似乎是红色的鲱鱼。我发现一个电子邮件线程暗示这样的代码只能在客户端上运行,而它当然需要在主服务器上运行,但我可以看到来自pastie链接的原始代码已成功地为其他人工作,我的更改不应该& #39; t对客户/主人方面有任何不同。
我在客户端上运行puppet v3.7,在master上运行v2.7(长话短说 - 我现在不能避免这种情况,(参见下面的EDIT3) )但我认为重要的是它们都是> = 2.6,关于environment.to_s
更改。
我用以下函数调用该函数:
$sshd_config_content = multi_source_mixed("template|ssh/sshd_config.${::fqdn}.erb", "file|ssh/sshd_config.${::fqdn}", "template|ssh/sshd_config.${::domain}.erb", "file|ssh/sshd_config.${::domain}", "template|ssh/sshd_config.${::hostname}.erb", "file|ssh/sshd_config.${::hostname}", 'template|ssh/sshd_config.erb', 'file|ssh/sshd_config')
并始终收到错误:
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: multi_source_mixed: No match found for files/templates: template|ssh/sshd_config.XXX.erb, file|ssh/sshd_config.XXX, template|ssh/sshd_config.XX.erb, file|ssh/sshd_config.XX, template|ssh/sshd_config.X.erb, file|ssh/sshd_config.X, template|ssh/sshd_config.erb, file|ssh/sshd_config at /etc/puppet/environments/YYYY/modules/ZZZZ/manifests/init.pp:337 on node XXX
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run
我的代码(到目前为止)是:
# adapted from template-only version at http://pastie.org/666728
# this doesn't yet work (for me)
module Puppet::Parser::Functions
require 'erb'
newfunction(:multi_source_mixed, :type => :rvalue) do |args|
this_module = 'THIS_MODULE_NAME'
contents = nil
environment = compiler.environment.to_s
sources = args
sources.each do |file|
if file.index('|')
filetype, filename = file.split('|', 2)
else
filetype = 'file'
filename = file
end
Puppet.debug("Looking for #{filetype} #{filename} in #{environment}")
if filetype == 'template'
if filepath = Puppet::Parser::Files.find_template(filename, environment)
wrapper = Puppet::Parser::TemplateWrapper.new(self)
wrapper.file = filename
begin
contents = wrapper.result
rescue => detail
raise Puppet::ParseError, "Failed to parse template %s: %s" % [filename, detail]
end
break
end
else
filepath = Puppet::Module.find(this_module, environment).to_s + '/files/' + filename
if File.file?(filepath)
begin
contents = File.open(filepath, "rb").read
rescue => detail
raise Puppet::ParseError, "Failed to get contents from file %s: %s" % [filename, detail]
end
end
break
end
end
if contents == nil
raise Puppet::ParseError, "multi_source_mixed: No match found for files/templates: #{sources.join(', ')}"
end
contents
end
end
编辑:顺便说一句 - 我知道所提供的文件已经存在于正确的位置,因为我正在使用此代码替换已经工作的现有代码,但是硬编码为搜索仅限文件,使用以下内容:
source => ["puppet:///modules/ZZZZ/ssh/sshd_config.${::fqdn}", "puppet:///modules/ZZZZ/ssh/sshd_config.${::domain}", "puppet:///modules/ZZZZ/ssh/sshd_config.${::hostname}", 'puppet:///modules/ZZZZ/ssh/sshd_config']
编辑2 :我继续尝试使用client = 3.7和master = 2.7来测试它,因为它是我现在可以使用的唯一设置,但我已经找到了几个线程声称,即使尝试让较旧的puppetmaster版本与更新的puppetclient版本合作也是痛苦的,而且通常是不可能的,而且我知道至少我现在忽略的一个错误就是做接着就,随即。我怀疑甚至一些特定的问题也可能是这种情况的结果,但遗憾的是没有简单的方法来测试事情,直到主人的升级发生(可能至少一周或两周不会发生)< / del>(见下文)
编辑3 :我现在正在使用客户端和主人在v2.7进行测试,问题仍然存在......