0

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

4

2 回答 2

0

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

Examples:
 csv_hostname
 csv_fqdn

这是创建具有延迟加载属性的模板的方法。以下示例创建一个配置文件。

例子.erb 文件

# Dynamically generated by awesome Chef so don't alter by hand.
HOSTNAME=<% @host_name %>
FQDN=<% @fqdn %>

配方.rb 文件

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)
于 2015-10-05T12:39:33.637 回答
0

引用模板文档:

source Ruby 类型:字符串、数组

模板文件的位置。默认情况下,厨师客户端在食谱的 /templates 目录中查找模板文件。当 local 属性设置为 true 时,用于指定本地节点上模板的路径。此属性还可用于将特定文件分发到特定平台。有关详细信息,请参阅下面的“文件特异性”。默认值:资源块的名称。有关详细信息,请参阅上面的“语法”部分。)

local 

Ruby 类型:TrueClass、FalseClass

从本地路径加载模板。默认情况下,厨师客户端从说明书的 /templates 目录加载模板。当此属性设置为 true 时,使用 source 属性指定本地节点上模板的路径。默认值:假。

所以你可以做的是:

# 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 文件以制作模板听起来适得其反,并且可能使用属性并利用资源的variable属性来完成template

于 2015-09-30T13:36:14.377 回答