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

时间:2015-09-30 11:52:42

标签: ruby chef lazy-evaluation chef-recipe chef-template

使用Chef配方,我首先根据CSV文件的输入动态生成.erb文件,然后我想将该.erb文件用作模板源。但不幸的是,当配方汇聚资源时,不会考虑所做的更改(在.erb文件中)。我也尝试使用延迟评估,但无法弄清楚如何将它用于模板源。

2 个答案:

答案 0 :(得分:0)

引用模板文档:

  

source Ruby类型:字符串,数组

     

模板文件的位置。默认情况下,chef-client会查找   cookbook的/ templates目录中的模板文件。当。。。的时候   local属性设置为true,用于指定模板的路径   在本地节点上。此属性也可用于分发   特定文件到特定平台。请参阅下面的“文件特定性”   更多信息。默认值:资源块的名称。看到   上面的“语法”部分了解更多信息。)

local 
     

Ruby类型:TrueClass,FalseClass

     

从本地路径加载模板。默认情况下,chef-client加载   cookbook / templates目录中的模板。当这个属性   设置为true,使用source属性指定a的路径   本地节点上的模板。默认值: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文件以使模板听起来适得其反,可能可以使用属性并利用variable资源的template属性。< / p>

答案 1 :(得分:0)

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

Examples:
 csv_hostname
 csv_fqdn

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

example.erb文件

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

recipe.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)