Ruby Chef如何将运行时生成的文件包含为模板源
使用Chef recipe,我首先根据CSV文件的输入动态生成一个.erb文件,然后我想使用该.erb文件作为模板源。但不幸的是,在该配方聚合资源时,没有考虑在.erb文件中所做的更改。我还尝试使用惰性评估,但无法找出如何将其用于模板源 引用模板文档: 源Ruby类型:字符串、数组 模板文件的位置。默认情况下,chef客户端查找 烹饪书的/templates目录中的模板文件。当 local属性设置为true,用于指定模板的路径 在本地节点上。此属性也可用于分发 特定平台的特定文件。有关详细信息,请参阅下面的“文件专用性” 更多信息。默认值:资源块的名称。看见 有关更多信息,请参见上面的“语法”部分 及 Ruby类型:TrueClass、FalseClass 从本地路径加载模板。默认情况下,chef客户端加载 来自cookbook的/templates目录的模板。当这个属性 如果设置为true,请使用source属性指定 本地节点上的模板。默认值:false 因此,您可以做的是: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,用于指定模板的路径 在本地节点上。此属性也可用于分发 特定平台的特定文件。有关详细信息,
# 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)