厨师:附加一个" erb"的一个exsting文件模板

时间:2016-03-13 15:10:06

标签: chef

有没有办法将erb代码附加到配置文件中:

    <% @zookeeper.each_with_index do |ip, id| %>
    <%= "server.#{id}=#{ip}:2888:3888" %>
    <% end %>

2 个答案:

答案 0 :(得分:1)

与Chef

追加

您无法以幂等方式附加到具有ERB模板的现有文件,但您可以使用以下一种或多种技术获得所需的行为:

  1. Template partials
  2. A Ruby block
  3. 执行外部shell命令,如echo "$somestring" >> outfile
  4. 行编辑食谱,例如line
  5. An Augeas lens,使用chef-augeas等库。
  6. 使用格式化字符串

    此外,虽然您无法附加到作为ERB模板管理的现有文件,但您可以选择在ERB中创建或使用多行字符串。请考虑以下示例。

    迭代值

    • /tmp/foo.erb

      <% # Set up a fixture. This should really be a Chef attribute. %>
      <% @zookeeper = %w[192.168.1.1 192.168.2.2] %>
      
      <% @zookeeper.each_with_index do |ip, id| %>
        <%= "server.#{id}=#{ip}:2888:3888" %>
      <% end %>
      
    • 示例输出

      $ erb -T 2 /tmp/foo.erb 
        server.0=192.168.1.1:2888:3888
        server.1=192.168.2.2:2888:3888
      

    在属性中嵌入换行符

    或者,您可能具有嵌入换行符的属性,然后可以将其转换为输出中的多行。例如:

    • /tmp/bar.erb

      <%
        @zookeeper = %w( 
          server.0=192.168.1.1:2888:3888
          server.1=192.168.2.2:2888:3888
        )
      %><%= @zookeeper.join "\n" %>
      
    • 示例输出

      $ erb /tmp/bar.erb
      server.0=192.168.1.1:2888:3888
      server.1=192.168.2.2:2888:3888
      

答案 1 :(得分:0)

不,这不是Chef直接支持的功能。 template资源期望控制整个文件内容。这确保了幂等性和收敛性。