Templates 如何仅在Chef中从erb文件转换为我的配置文件?
我不想在远程实例上运行chef客户端,但我想通过插入chef的属性将config.erb模板文件转换为配置文件 我发现了这个命令,但通常人们使用这个命令来向Chef添加属性Templates 如何仅在Chef中从erb文件转换为我的配置文件?,templates,chef-infra,config,erb,Templates,Chef Infra,Config,Erb,我不想在远程实例上运行chef客户端,但我想通过插入chef的属性将config.erb模板文件转换为配置文件 我发现了这个命令,但通常人们使用这个命令来向Chef添加属性 knife exec -E 'environments.transform("name:my_project") {|n| ..}' 那么,如何在本地运行knife命令,而只是转换模板erb文件呢?使用knife执行此操作听起来很奇怪 我最好的办法是使用“假”客户端名称运行chef,在本地呈现文件,然后移动它们。这已在“管
knife exec -E 'environments.transform("name:my_project") {|n| ..}'
那么,如何在本地运行knife命令,而只是转换模板erb文件呢?使用knife执行此操作听起来很奇怪 我最好的办法是使用“假”客户端名称运行chef,在本地呈现文件,然后移动它们。这已在“管理节点”的名称下进行了讨论 您可能有一个
managed.rb
config文件,其中有一个环境变量作为客户端名称
/etc/chef/managed.rb中的示例文件:
日志级别:信息
日志位置标准输出
节点名称环境['node\u name']
client_key“/path/to/your/targets/keystore/#{ENV['node_name']}.pem”
厨师长\u服务器\u url'https://chef-server-url.local'
然后,您可以将此环境变量node\u name
设置为目标节点,如果您具有验证密钥,它将创建客户端和节点对象并在本地工作
在烹饪书中,你可以做如下事情:
target_dir=“/opt/configs/#{node['chef_client']['config']['node_name']}”
目录目标_dir do
行动:创建
递归真
结束
执行“复制到#{node['chef_client']['config']['node_name']}”do
cmd“scp{target_dir}/*#{node['chef_client']['config']['node_name']}:/etc”
操作:nothing#如果没有更改配置文件,则不要在每次运行时复制
结束
模板“#{target_dir}/my_conf”do
来源“my_conf.erb”
行动:创建
通知:运行“执行[复制到#{node['chef_client']['config']['node_name']}”
结束
然后,您可以在crontab中这样调用chef:
59 0***根节点_name=“my rp XX”厨师客户端-c/etc/chef/managed.rb
我就是这样结束的。我创建了一个脚本,使用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
.erb模板是使用节点属性还是仅使用传递给
模板
资源的变量?您可以在您的knife.exec中使用Chef::Template
,但这需要先加载目标节点/角色和环境。非常感谢!我要试一试。