Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates 如何仅在Chef中从erb文件转换为我的配置文件?_Templates_Chef Infra_Config_Erb - Fatal编程技术网

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

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,在本地呈现文件,然后移动它们。这已在“管

我不想在远程实例上运行chef客户端,但我想通过插入chef的属性将config.erb模板文件转换为配置文件

我发现了这个命令,但通常人们使用这个命令来向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
,但这需要先加载目标节点/角色和环境。非常感谢!我要试一试。