Как преобразовать файл ERB файл config только в шеф-повара?


Я не хочу запускать chef-client на удаленном экземпляре,но я хочу преобразовать свою конфигурацию.файл шаблона erb в конфигурационный файл путем интерполяции атрибутов из Chef.

Я нашел эту команду, но обычно люди используют эту команду для добавления атрибутов в Chef.

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

Итак, как запустить команду knife локально, но просто преобразовать файл шаблона erb?

2 3

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