【问题标题】:How does Chef include files generated on runtime as a template sourceChef 如何将运行时生成的文件包含为模板源
【发布时间】:2015-12-28 04:45:22
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    假设您知道如何从 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)
    

    【讨论】:

      【解决方案2】:

      引用模板文档:

      sourceRuby 类型:字符串、数组

      模板文件的位置。默认情况下,厨师客户端寻找 食谱的 /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 文件以制作模板听起来适得其反,并且可能通过属性和利用 template 资源的 variable 属性来完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-26
        • 1970-01-01
        • 2022-10-13
        • 2011-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多