【问题标题】:recipe of not giving expected results不给出预期结果的秘诀
【发布时间】:2021-08-18 19:42:59
【问题描述】:

我只想在给定目录“/local/update/”不存在时执行命令

我的食谱代码如下

execute 'test' do
   command "some command here"
   not_if { ::File.directory?("/local/update/") }
end

也试过

not_if { ::File.exist?("/local/update/") }

即使目录存在,它仍然会运行命令。 我已经签入了client.log,这一步没有跳过

【问题讨论】:

  • 不应该这样。您正在运行哪个版本的 Chef?另外,not_if 'ls /local/update/' 有效吗?
  • @seshadri_c 我之前没有尝试过 not_if 'ls /local/update/',但现在尝试了。它的工作原理。谢谢!!!

标签: chef-infra


【解决方案1】:

添加答案,因为有更好的(内置)方法可以使 execute 资源具有幂等性。我们可以使用creates 属性,而不是使用not_if 跳过它。来自documentation

creates

Ruby 类型:字符串

当文件已经存在时阻止命令创建文件。

例子:

execute 'test' do
   command "some command here"
   creates '/local/update/'
end

使用此实现,如果/local/update/ 路径不存在,command 将运行。否则它将报告为“最新”:

* execute[test] action run (up to date)

【讨论】:

  • 这是一个有点不直观的解决方案——你本质上是在“说”你会创建一些东西,但实际上你不是,如果路径已经退出,你只是在使用构造来绕过执行跨度>
  • 是的,这就是问题的要求。第一次运行命令时,它创建了一些路径。下次命令需要/不应该运行,所以我们说这个命令“创建”“xyz”路径,所以如果它存在,不要运行。将命令视为mkdir /local/update
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多