2017-12-20 6 views
0

Ich arbeite gerade an einem einfachen Skript, um Eigenschaftendateien während einer Chef-Bereitstellung zu bearbeiten. Ich Ausführung den folgenden Code mit chef-apply script.rbWie schreibe ich ein Koch-Rezept, um eine Datei zu kopieren, wenn diese Quelldatei existiert? only_if guard funktioniert nicht

class_path = '/var/lib/tomcat/webapps/ROOT/WEB-INF/classes' 
file '/home/corp/working/corp.properties' do 
    owner 'root' 
    group 'root' 
    mode 0644 
    p File.exist?("#{class_path}") 
    content File.open("#{class_path}/corp.properties").read 
    action :create_if_missing 
    only_if { File.exist?("#{class_path}/corp.properties") } 
end 

Aber es läuft mit dem Fehler

false 
[2017-12-20T11:37:40-05:00] FATAL: Stacktrace dumped to /home/corp/.chef/cache/chef-stacktrace.out 
[2017-12-20T11:37:40-05:00] FATAL: Stacktrace dumped to /home/corp/.chef/cache/chef-stacktrace.out 
[2017-12-20T11:37:40-05:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report 
[2017-12-20T11:37:40-05:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report 
[2017-12-20T11:37:40-05:00] FATAL: Errno::ENOENT: No such file or directory @ rb_sysopen - /var/lib/tomcat/webapps/ROOT/WEB-INF/classes/corp.properties 
[2017-12-20T11:37:40-05:00] FATAL: Errno::ENOENT: No such file or directory @ rb_sysopen - /var/lib/tomcat/webapps/ROOT/WEB-INF/classes/corp.properties 

Wie Sie sehen können, auch wenn der File.exist? Anruf falsch zurückgibt, die File.open wird ausgeführt unabhängig von der Wache.

Antwort

2

Jeder Code im Ressourcenblock wird standardmäßig zur Kompilierungszeit ausgeführt. Die Wachen laufen zur Konvergenzzeit. Sie können dies beheben, indem Sie content lazy { File.open("#{class_path}/corp.properties").read } setzen, um das Lesen der Datei stattdessen zur Konvergenz zu erzwingen. Weitere Informationen finden Sie unter https://coderanger.net/two-pass/.

Verwandte Themen