我是一个 Ruby 新手,但我正在尝试使用脚本和大量合成数据(我将放入 Yaml 文件或其他内容)来呈现 Puppet .erb 模板。我们的 puppet 模板大多是这样的:
# Some config file
<%= @some_ordinary_variable %>
<%= some_other_variable %>
<%= @something_undefined %>
<%= scope.function_hiera("some_hiera_variable") %>
我已经模拟了 hiera 查找,并发现使用带有 ERB 的 OpenStruct作为替代“some_other_variable”的方法存在问题(我有点坚持让“@some_ordinary_variable”工作,但我想我可以弄清楚那个。
我要问的是如何使用绑定,让我在每个变量查找时运行一些代码?我想我想运行类似的东西:
def variable_lookup(key)
if @variables.has_key?(key)
return @variables[key]
else
warn "The variable " + key + " is required by the template but not set"
end
end
然后我可以将它与我的 Hiera 模型合并以查找 Hiera 数据。我到目前为止的代码是:
require 'rubygems'
require 'yaml'
require 'erb'
require 'ostruct'
class ErbBinding < OpenStruct
include Enumerable
attr_accessor :yamlfile, :hiera_config, :erbfile, :yaml
def scope
self
end
def function_hiera(key)
val = @yaml['values'][key]
if val.is_a?(YAML::Syck::Scalar)
return val.value
else
warn "erby: " + key + " required in template but not set in yaml"
return nil
end
end
def get_binding
return binding()
end
end
variables = {'some_other_variable' => 'hello world'}
hs = ErbBinding.new(variables)
template = File.read('./template.erb')
hs.yaml = YAML.parse( File.read('./data.yaml') )
erb = ERB.new(template)
vars_binding = hs.send(:get_binding)
puts erb.result(vars_binding)
我不知道如何设置运行代码的绑定,而不仅仅是使用“变量”哈希。有任何想法吗?