Ruby Chef如何将运行时生成的文件包含为模板源

Ruby Chef如何将运行时生成的文件包含为模板源,ruby,chef-infra,lazy-evaluation,chef-recipe,chef-template,Ruby,Chef Infra,Lazy Evaluation,Chef Recipe,Chef Template,使用Chef recipe,我首先根据CSV文件的输入动态生成一个.erb文件,然后我想使用该.erb文件作为模板源。但不幸的是,在该配方聚合资源时,没有考虑在.erb文件中所做的更改。我还尝试使用惰性评估,但无法找出如何将其用于模板源 引用模板文档: 源Ruby类型:字符串、数组 模板文件的位置。默认情况下,chef客户端查找 烹饪书的/templates目录中的模板文件。当 local属性设置为true,用于指定模板的路径 在本地节点上。此属性也可用于分发 特定平台的特定文件。有关详细信息,

使用Chef recipe,我首先根据CSV文件的输入动态生成一个.erb文件,然后我想使用该.erb文件作为模板源。但不幸的是,在该配方聚合资源时,没有考虑在.erb文件中所做的更改。我还尝试使用惰性评估,但无法找出如何将其用于模板源

引用模板文档:

源Ruby类型:字符串、数组

模板文件的位置。默认情况下,chef客户端查找 烹饪书的/templates目录中的模板文件。当 local属性设置为true,用于指定模板的路径 在本地节点上。此属性也可用于分发 特定平台的特定文件。有关详细信息,请参阅下面的“文件专用性” 更多信息。默认值:资源块的名称。看见 有关更多信息,请参见上面的“语法”部分

Ruby类型:TrueClass、FalseClass

从本地路径加载模板。默认情况下,chef客户端加载 来自cookbook的/templates目录的模板。当这个属性 如果设置为true,请使用source属性指定 本地节点上的模板。默认值:false

因此,您可以做的是:

# generate the local .erb file let's say source.erb

template "/path/to/file" do
  source "/path/to/source.erb"
  local true
end

您的问题听起来像是XY问题,读取csv文件以制作模板听起来适得其反,可能是通过属性和利用模板资源的变量属性来完成的。

假设您知道如何将csv文件中的值捕获为配方中的局部变量

Examples:
 csv_hostname
 csv_fqdn
下面是创建具有延迟加载属性的模板的步骤。下面的示例创建一个配置文件

example.erb文件

# Dynamically generated by awesome Chef so don't alter by hand.
HOSTNAME=<% @host_name %>
FQDN=<% @fqdn %>
如果需要在编译时运行,请将操作添加到块中

template 'xxx' do
  # blah blah
end.run_action(:create)
template 'path\to\example.config' do
  source 'example.erb'
  variables(
    lazy {
      :host_name => csv_hostname,
      :fqdn => csv_fqdn
  })
end
template 'xxx' do
  # blah blah
end.run_action(:create)