我正在使用Chef在Windows 12上创建一个UDL文件。该文件必须编码为UTF-8,但我无法让Chef生成除ANSI以外的任何内容。
在工作站上,模板文件是UTF-8编码的,但是当它落在厨师缓存中时,目标节点上结束的模板文件是ANSI - 因此在文件传输期间编码似乎丢失了到目标节点。在Chef-client运行期间,目标节点的ruby默认为UTF-8,虽然我希望因为源ERB模板是ANSI,所以目标也被创建为ANSI。
配方很简单:
log "Encoding is #{Encoding.default_external}"
template 'C:/file.udl' do
rights :full_control, 'Everyone'
action :create
source 'file.udl.erb'
end
模板(UTF-8在源处编码但未在传输到目标节点后):
[oledb]
; Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.1;Password=MyPassword;Persist Security Info=True;User ID=MyUsername;Initial Catalog=MyCat;Data Source=MyServer
无法通过OLE读取生成的ANSI文件...无论如何要说服Chef / ruby以UTF-8编写文件?
答案 0 :(得分:0)
这是我的方法,入侵Chef :: Mixin :: Template :: TemplateContext
在libraries/template_hacking.rb
require 'chef/mixin/template'
# Hacking Chef loads template with specific encoding
# Usage in your recipe:
#
# template 'my_utf8_file' do
# source 'my_utf8_file'
# variables(
# __encoding__: 'utf-8',
# name: '你好'
# )
# end
#
unless Chef::Mixin::Template::TemplateContext.public_methods.include?(:_origin_render_template)
class Chef::Mixin::Template::TemplateContext
alias_method :_origin_render_template, :_render_template
def _render_template(template, context)
encoding = context[:__encoding__] && context[:__encoding__].upcase
if template && encoding && template.encoding.name != encoding
Chef::Log.info("Encoding template to #{encoding}")
template.force_encoding encoding
end
_origin_render_template(template, context)
end
end
end
在配方recipes/my_recipe.rb
template 'my_utf8_file' do
source 'my_utf8_file'
variables(
__encoding__: 'utf-8',
name: '你好'
)
end