2014-10-27 3 views
0

Я хочу прервать рецепт во время выполнения на основе определенного состояния, но использовать raise или Chef :: Application.fatal! как описано в этом сообщении How do you abort/end a Chef run? мой рецепт выходит только во время компиляции.Отменить рецепт шеф-повара во время выполнения не во время компиляции

Вот что я пытаюсь (часть моего сценария):

execute "Execute somehthing" do 
    cwd node['abc']['dir'] 
    command "something >> #{results}" 
    node.default['success'] = "false" 
    notifies :run, "ruby_block[jobFailure]", :delayed 
    not_if "cd #{node['abc']['dir']} && somecommand >> #{results}" 
end 

ruby_block "jobFailure" do 
    raise "Exiting the script as the job has failed" if (node.default['success'] == "false") 
    action :nothing 
end 

Но при выполнении этого скрипта я получаю сообщение об ошибке, как шеф-повар покидает во время компиляции, только дает ошибку ниже:

Running handlers: 
[2014-10-27T17:17:03+00:00] ERROR: Running exception handlers 
Running handlers complete 
[2014-10-27T17:17:03+00:00] ERROR: Exception handlers complete 
[2014-10-27T17:17:03+00:00] FATAL: Stacktrace dumped to c:/Users/manish.a.joshi/ 
.chef/local-mode-cache/cache/chef-stacktrace.out 
Chef Client failed. 0 resources updated in 12.400772 seconds 
[2014-10-27T17:17:03+00:00] FATAL: RuntimeError: Exiting the script as the job has failed 

Может ли кто-нибудь сообщить мне, есть ли способ выполнить команду raise только на основе условия?

+0

Это не ясно, что ваше состояние. Не могли бы вы изменить свой вопрос, чтобы уточнить, что такое условие, которое вы проверяете? –

ответ

2

Так первый от шеф-повара не работает, как это и этот код не будет работать, как вы ожидаете, независимо от этого, но вы должны поставить код на самом блоке для ruby_block:

ruby_block "jobFailure" do 
    block do 
    raise "Exiting the script as the job has failed" if (node.default['success'] == "false") 
    end 
    action :nothing 
end 

node.default['success'] = "false" что у вас в ресурсе выполнения произойдет независимо от статуса команды и произойдет во время компиляции. Таким образом, ресурсы шеф-повара не имеют возвращаемых значений.

+0

Вы можете добавить only_if в job_failure 'ruby_block' и проверить свое состояние успеха там. –

+0

Это ничего не изменит, успех или неудача ресурса выполнения - это не то, что вы можете легко передать другому ресурсу. Если ресурс выполнения завершится с ошибкой, шеф-повар прервется. Чтобы сделать это, вам нужно написать LWRP в целом и использовать shell_out напрямую. – coderanger

+0

Я хорошо знаю, но я не думаю, что OP планировал это сделать. Мое впечатление заключалось в том, что условие выхода и результат выполнения - две разные вещи. Выполнение может завершиться успешно, пока «условие» все еще не выполнено. Если это так, то условие может быть проверено как условие на блоке ruby. –

1

Похоже, вы хотите выполнить свой блок execute, если ваше состояние не выполнено. Если это так, вы можете использовать один ресурс для выполнения обеих задач.

execute "Execute somehthing" do 
    cwd node['abc']['dir'] 
    command "something >> #{results} && exit 1" 
    node.default['success'] = "false" 
    notifies :run, "ruby_block[jobFailure]", :delayed 
    not_if "cd #{node['abc']['dir']} && somecommand >> #{results}" 
end 

Добавление && exit 1 приведет execute ресурс на провал, и, таким образом, прекратить запуск шашлычник.

Конечно, это работает только если вы хотите немедленно прекратить действие. В вашем текущем коде используется уведомление :delayed, что означает, что ваш запуск шеф-повара будет продолжаться до тех пор, пока не будут выполнены все ресурсы, а затем сбой во время отложенных уведомлений. Возможно, это не так, как вы планировали.

Если вы действительно хотите завершить во время уведомлений, а затем попробовать (обратите внимание, что установка атрибута узла не полезно)

execute "Execute somehthing" do 
    cwd node['abc']['dir'] 
    command "something >> #{results}" 
    notifies :run, "ruby_block[jobFailure]", :delayed 
    not_if "cd #{node['abc']['dir']} && somecommand >> #{results}" 
end 

ruby_block "jobFailure" do 
    block 
    raise "Exiting the script as the job has failed" 
    action :nothing 
end 
+0

Спасибо, я действительно хотел завершить сеанс после того, как все ресурсы chef были запущены, и поэтому я использовал ': delayed', но мне нравится ваша идея использовать' && exit 1; ', потому что в одном из моих других рецептов я пытался использовать ': немедленно' для вызова секции ruby ​​немедленно, если условие терпит неудачу, но оно не работает. Кажется, другой вопрос, но есть ли у вас идея, почему« немедленно »не вызывал блок ruby немедленно, но только в конце, как «задержка»? –

+0

Мне нужна дополнительная информация. Нет причин, по которым: немедленное уведомление не будет незамедлительным. –

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