如何仅在 Chef 中从 erb 文件转换为我的配置文件?
How to transform from erb file to my config file only in Chef?
我不想 运行 远程实例上的 chef-client,但我想通过插入来自 Chef 的属性将我的 config.erb 模板文件转换为配置文件。
我找到了这个命令,但通常人们使用这个命令为 Chef 添加属性。
knife exec -E 'environments.transform("name:my_project") {|n| ..}'
那么如何在本地运行 knife命令而只转换模板erb文件呢?
用刀来做听起来很奇怪。
我最好的想法是 运行 厨师用 'fake' 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 中像这样调用 chef:
59 0 * * * root node_name="my-rp-XX" chef-client -c /etc/chef/managed.rb
这就是我的结局。我创建了一个脚本来使用 ERB 库来翻译带插值的模板:
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
我不想 运行 远程实例上的 chef-client,但我想通过插入来自 Chef 的属性将我的 config.erb 模板文件转换为配置文件。
我找到了这个命令,但通常人们使用这个命令为 Chef 添加属性。
knife exec -E 'environments.transform("name:my_project") {|n| ..}'
那么如何在本地运行 knife命令而只转换模板erb文件呢?
用刀来做听起来很奇怪。
我最好的想法是 运行 厨师用 'fake' 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 中像这样调用 chef:
59 0 * * * root node_name="my-rp-XX" chef-client -c /etc/chef/managed.rb
这就是我的结局。我创建了一个脚本来使用 ERB 库来翻译带插值的模板:
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