2015-04-09 1 views
2

Пытается скопировать файл локально, который не существует во время компиляции. Например:копирование локального файла после компиляции с файловым ресурсом в CHEF

remote_file "/httpfile" do 
    source "http://wiki.opscode.com/display/chef/Home" 
    mode "0666" 
end 
file "/httpfile.bak" do 
    content IO.read("/httpfile") 
    only_if {File.exists?("/httpfile")} 
end 

этот код даст ERROR: No such file or directory - eventough что only_if используется. Это связано с тем, что IO.read происходит во время компиляции до того, как файл перейдет в систему. (4-летняя электронная почта - http://lists.opscode.com/sympa/arc/chef/2011-08/msg00182.html)

Есть ли способ заставить контент IO.read("/httpfile") выполнять во время выполнения? или лучший способ сделать это сейчас?

Благодаря

ответ

4

Вы должны быть в состоянии использовать ленивые вычисления, чтобы заботиться об этом. Я считаю, что синтаксис таков:

remote_file "/httpfile" do 
    source "https://docs.chef.io/" 
    mode "0666" 
end 
file "/httpfile.bak" do 
    lazy { content IO.read("/httpfile") } 
    only_if {File.exists?("/httpfile")} 
end 
+0

Ответ хороший, я предпочел бы, используя уведомление от 'remote_file' вместо' only_if' настороже, чтобы избежать переписывания файла при каждом запуске. Я не вижу пример использования с этим примером (кажется, что резервный шеф-повар делает при замене файла) – Tensibai

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