为什么这个回复源代码片段的Puppet模板/文件的混合列表不起作用?

时间:2015-06-24 11:20:50

标签: puppet

这似乎位于stackoverflow和serverfault的域之间,但它似乎最终是一个开发问题,所以我在这里发布。

为了让我的Puppet树更干一些(同时避免巨大的if-else梯子和hacky" / dev / null"我的清单中的后备),我希望能够只召唤一个函数与模板/文件的混合列表按顺序查找,并使用(并在必要时展开)找到的第一个。我基于一些古老的代码大量编写了下面的代码(请参阅注释行以获取该代码的链接)。我不明白为什么它还没有发挥作用,如果有人能找到我错过(或误解)的东西,我将不胜感激。

我确保:

  • Apache(和Passenger子流程)在主服务器上重新启动(以获取新功能),然后在客户端上运行puppet
  • 客户端使用--pluginsync
  • 运行

我已经尝试失败了:

  • 使用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进行测试,问题仍然存在......

0 个答案:

没有答案