如果该源文件存在,如何编写Chef配方来复制文件? only_if后卫不工作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果该源文件存在,如何编写Chef配方来复制文件? only_if后卫不工作相关的知识,希望对你有一定的参考价值。

我目前正在开发一个简单的脚本来处理Chef部署期间的属性文件。我正在用chef-apply script.rb执行以下代码

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

但它运行错误

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

正如您所看到的,即使File.exist?调用返回false,也会执行File.open而不管后卫。

答案

资源块中的任何代码都默认在编译时运行。守卫在收敛时间运行。你可以通过使content lazy { File.open("#{class_path}/corp.properties").read }强制文件读取在收敛时间来解决这个问题。有关更多信息,请参阅https://coderanger.net/two-pass/

以上是关于如果该源文件存在,如何编写Chef配方来复制文件? only_if后卫不工作的主要内容,如果未能解决你的问题,请参考以下文章

RHEL 上的 Chef Apache2 配方:默认配方中未定义服务器名称

安装 Postgresql 时 AWS Opsworks Chef 配方失败

将文件从 Chef 客户端节点复制到工作站

Apache 继续存在于 chef 实例中

如何使用 Chef 在本地移动/复制文件

在 Chef 食谱中使用变量