Как преобразовать файл ERB файл config только в шеф-повара?
Я не хочу запускать chef-client на удаленном экземпляре,но я хочу преобразовать свою конфигурацию.файл шаблона erb в конфигурационный файл путем интерполяции атрибутов из Chef.
Я нашел эту команду, но обычно люди используют эту команду для добавления атрибутов в Chef.
knife exec -E 'environments.transform("name:my_project") {|n| ..}'
Итак, как запустить команду knife локально, но просто преобразовать файл шаблона erb?
2 ответа:
Странно делать это ножом.
Моей лучшей идеей было бы запустить chef с "поддельным" именем клиента, чтобы отобразить файлы локально, а затем переместить их. Это обсуждалось под названием "Управление узлом".
У вас может быть конфигурационный файл
managed.rb
с переменной окружения для client_name.Пример файла в файле /etc / chef / managed.РБ:
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
Затем вы можете вызвать chef следующим образом в crontab:
59 0 * * * root node_name="my-rp-XX" chef-client -c /etc/chef/managed.rb
Вот как я заканчиваю. Я создал скрипт для использования ERB lib для перевода шаблона с интерполяцией:
Тран.РБ:
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