如何仅在Chef中从erb文件转换为我的配置文件?

时间:2015-04-17 18:17:13

标签: templates chef config erb

我不想在远程实例上运行chef-client但是我想通过插入Chef的属性将我的config.erb模板文件转换为配置文件。

我找到了这个命令,但通常人们使用此命令向Chef添加属性。

knife exec -E 'environments.transform("name:my_project") {|n| ..}'

那么如何在本地运行knife命令但只是转换模板erb文件?

2 个答案:

答案 0 :(得分:0)

用刀子做起来听起来很奇怪。

我最好的想法是让厨师带着假冒的' client_name在本地呈现文件然后移动它们。这已经在名称" manage node"。

中进行了讨论

您可能有一个managed.rb配置文件,其中包含client_name的环境变量。

/etc/chef/managed.rb中的示例文件:

log_level                :info
log_location             STDOUT
node_name                ENV['node_name']
client_key               "/path/to/your/targets/keystore/#{ENV['node_name']}.pem"
chef_server_url          'https://chef-server-url.local'

然后,您可以将此环境变量node_name设置为目标节点,如果您有验证密钥,它将创建客户端和节点对象并在本地工作。

在食谱中你可以做以下的事情:

target_dir="/opt/configs/#{node['chef_client']['config']['node_name']}"

directory target_dir do
  action :create
  recursive true
end

execute "copy to #{node['chef_client']['config']['node_name']}" do
  cmd "scp #{target_dir}/* #{node['chef_client']['config']['node_name']}:/etc"
  action :nothing # don't copy at each run if no config file has changed
end

template "#{target_dir}/my_conf" do
  source "my_conf.erb"
  action :create
  notifies :run, "execute[copy to #{node['chef_client']['config']['node_name']}]"
end

然后你可以在crontab中调用这样的厨师:

59 0 * * * root node_name="my-rp-XX" chef-client -c /etc/chef/managed.rb

答案 1 :(得分:0)

这就是我最终的结果。我创建了一个脚本来使用ERB lib来使用插值转换模板:

<强> tran.rb:

require "erb"

input_file = "/var/lib/j.../config.ini.erb"
output_file = "/var/lib/.../config.ini"

content = File.open(input_file, 'rb').read

template = ERB.new(content)

class ERBContext
    def initialize(env)
        env.transform("name:#{myenv}") do |n|
            attrs = n.default_attributes["nap"]
            attrs.each do |key, value|
                instance_variable_set('@' + key.to_s, value)
            end
        end
    end

    def get_binding
        binding
    end
end

erb_context = ERBContext.new(environments)

config_file = template.result(erb_context.get_binding)
File.open(output_file, 'w+') do |f|
    f.write(config_file)
end

由于 knife exec 只需要脚本文件,要设置 myenv 变量,我需要调用这样的命令

(echo 'myevn = "xxxxxxxx"' ;  cat ./tran.rb) | sudo knife exec