2016-10-10 2 views
0

Рассмотрим этот код:рецепт шеф-повара - как добавить тайм-аут к :: File.exists? в ruby_block

ruby_block 'wait for tomcat' do 
    block do 
    true until ::File.exists?('/usr/share/tomcat/webapps/system/WEB-INF') 
    end 
end 

Как я могу добавить timeout, так что в случае, когда развертывание пошло не так (и файл никогда не будет существовать), мой рецепт может продолжать (и не) после (скажем) 30 секунд?

ответ

2

Только с помощью рубин (непроверенный, я, возможно, забыл что-то там):

ruby_block 'wait for tomcat' do 
    block do 
    iter=0 
    until ::File.exists?('/usr/share/tomcat/webapps/system/WEB-INF') || iter > 5 do 
     sleep 6 
     iter++ 
    end 
    raise "Timeout waiting for tomcat startup" unless iter <= 5 
    end 
end 

Но этот вид конструкции, как правило, означает, что вы падаете в сходятся против проблемы компиляции. и, следовательно, вы, вероятно, пытаетесь решить проблему XY. Так как кошка не может начинаться до конца прогона в любом случае.

TL; DR: вы пытаетесь закодировать изменение состояния вместо описания результирующего состояния, это противоречит философии управления конфигурацией.

+0

Спасибо! И да, это действительно проблема XY. Я думаю, у меня есть другой вопрос об этом, так как у меня есть метод определения, который мне нужно вызвать на основе 'if :: File.exists? (...)' ... но поскольку он не является ресурсом, он не имеет поддержки 'not_if'. (какое-либо руководство здесь высоко ценится = – vikingsteve

+0

. А как насчет того, чтобы разоблачить вашу реальную общую проблему? – Tensibai

+1

Для вашей задачи определения превратите ее в custom_resource или LWRP, и вы получите унаследованный синтаксис – Tensibai