2014-02-28 2 views
0

Я пытаюсь создать рецепт шеф-повара, который будет динамически создавать ресурсы на основе содержимого файла yaml, загруженного из репозитория git с исходным кодом приложения. У меня это до сих пор:Динамическое создание ресурсов у шеф-повара

git "/home/a_user/#{ node[:my_node][:application] }" do 
    repository node[:my_node][:git_repository] 
    revision node[:my_node][:git_branch] 
    action :sync 
    user "a_user" 
    group "a_user" 
end 

require 'yaml' 

ruby_block "load the process into the node" do 
    block do 
    yml = YAML::load(File.open("/home/a_user/#{node[:my_node][:application]}/processes.yml")) 
    node.set[:my_node][:worker][:processes] = yml[:processes] 
    end 
    subscribes :create, "git[/home/a_user/#{ node[:my_node][:application] }]" :immediately 
end 



node[:my_node][:worker][:processes].each do | name, cmd | 
    supervisor_service name do 
    command "bash -c \"source /home/a_user/.profile && #{ cmd }\"" 
    action :enable 
    end 
end 

service "supervisor" do 
    action :restart 
end 

Формат YAML файла:

processes: 
    process_a: python myscript.py --a 
    process_b: python myscript.py --b 

Однако, когда я исполню ее значение node[:my_node][:worker][:processes] пуст на этапе компиляции, так что супервайзер ресурсы не выполняются на этапе выполнения.

Может ли кто-нибудь дать мне указатель на то, как это сделать? Я пропускаю что-то очевидное или я просто делаю это неправильно?

+0

Вы можете захотеть, чтобы проверить мой [диалектов филиал] (https://github.com/coderanger/chef/tree/dialects) и [предложение за ним] (https://gist.github.com/coderanger/a6e0c627d349f0712dcc). Это позволит создавать рецепты в Yaml, если вы создадите плагин. – coderanger

ответ

0

занесения атрибут во время фазы компиляции:

git "/home/a_user/#{ node[:my_node][:application] }" do 
    repository node[:my_node][:git_repository] 
    revision node[:my_node][:git_branch] 
    action :nothing 
    user "a_user" 
    group "a_user" 
end.run_action(:sync) 

ruby_block "load the process into the node" do 
    block do 
    yml = YAML::load(File.open("/home/a_user/#{node[:my_node][:application]}/processes.yml")) 
    node.set[:my_node][:worker][:processes] = yml[:processes] 
    end 
    subscribes :create, "git[/home/a_user/#{ node[:my_node][:application] }]" :immediately 
    action :nothing 
end.run_action(:create) 
+0

К сожалению, для этого требуется много других ресурсов, которые должны быть запущены на этапе компиляции, и это начинает становиться довольно беспорядочным и не особенно ощущается «шеф-поваром». –

+0

Вы пытались использовать 'lazy' на' ruby_block'? Что-то вроде 'block lazy {{yml = YAML :: ...}}'. Подробнее здесь: http://docs.opscode.com/resource_common.html#lazy-attribute-оценка – cassianoleal

 Смежные вопросы

  • Нет связанных вопросов^_^