Chef:从 "erb" 模板附加到现有文件

Chef: append to an exsting file from an "erb" template

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

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

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

附加主厨

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

  1. Template partials.
  2. 一个Ruby block.
  3. 正在执行外部 shell 命令,例如 echo "$somestring" >> outfile
  4. 行编辑食谱,例如 line
  5. An Augeas lens, using a library like chef-augeas.

使用格式化字符串

此外,虽然您不能附加到作为 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