2015-09-20 3 views
1

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

Пример ошибки я получаю

Chef::Exceptions::EnclosingDirectoryDoesNotExist 

для/SRV/второго процесса. Однако этот каталог является первым, который я создаю в уведомляющем блоке внутри провайдера - не может ли быть, что сеансы шеф-повара не изолированы? Я также видел данные из первого элемента элемента массива в другой, т.е. первый процесс, пытающийся уведомить r_unit [второй-идентификатор процесса]

В широком смысле (если только один процесс это работает)

node["app"]["processes"].each do |key,value| 

    #step 3 
    execute 'configure' do 

     command 'cp -r /srv/folder /srv/#{some_key} && sv restart #{some_key}' 
     action :nothing 

    end 
    #step 2 
    runit_service current_process_id do 

     notifies :run, 'execute[configure]', :delayed 

    end 
    #step 1 
    my_custom_hwrp current_process_id do 

     notifying_block do 

     new_resource.dirs_to_create.each do |dir_name| 

     end 

     install_path current_install_path 
     notifies :enable,"runit_service[#{current_process_id}]" 
     end 
    end 

end 

my_custom_hwrp поставщик

class Provider < Chef::Provider 
    def action_enable 
     deploy_revision current_process_id do 

      new_resource.updated_by_last_action(true) 
     end 
    end 
end 

Есть Я могу изолировать работу шеф-повара для каждого процесса?

+0

Попробуйте «выполнить» configure # {some_key} «сделать», чтобы получить уникальную команду execute для каждого каталога и использовать тот же синтаксис в уведомлении. Без этого каждый ресурс перезаписывает предыдущий (краткое объяснение, это немного сложнее). Я использовал 'remote_directory' и уведомление для перезапуска службы вместо' execute'. – Tensibai

+0

вы должны реализовать [определение] (http://docs.chef.io/definitions.html) или [lwrp] (https://docs.chef.io/lwrp.html), которые вы сможете повторное использование даже по кулинарным книгам. вы всегда можете ссылаться на любой из них итеративно. – MrRoth

ответ

0

Способ, которым работает шеф-повар, состоит из одного ресурса execute[configure], который будет основываться на последних keyvalue.

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

Например

execute "configure-#{key}-#{value}" 

В противном случае результаты будут непредсказуемыми.