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 模板的现有文件,但您肯定可以使用以下一种或多种技术获得所需的行为:
- Template partials.
- 一个Ruby block.
- 正在执行外部 shell 命令,例如
echo "$somestring" >> outfile
。
- 行编辑食谱,例如 line。
- 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
有没有办法将 erb 代码附加到配置文件:
<% @zookeeper.each_with_index do |ip, id| %>
<%= "server.#{id}=#{ip}:2888:3888" %>
<% end %>
不,这不是 Chef 直接支持的功能。 template
资源期望控制整个文件内容。这样保证了幂等性和收敛性。
附加主厨
您不能以幂等方式附加到带有 ERB 模板的现有文件,但您肯定可以使用以下一种或多种技术获得所需的行为:
- Template partials.
- 一个Ruby block.
- 正在执行外部 shell 命令,例如
echo "$somestring" >> outfile
。 - 行编辑食谱,例如 line。
- 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