opscode厨师可以等到条件成真吗?

时间:2015-07-07 13:01:59

标签: ruby chef orchestration

我们有一个用例,我们希望chef orchestration等到特定目录在机器中被删除。有没有办法实现它?

我在互联网上搜索并找到以下cookbook

我觉得它可以使用,但我很难理解如何使用它,没有读过我使用它。

我怎样才能实现它?

编辑以删除保留: 说你有以下食谱

execute 'making dir' do
  command 'mkdir /tmp/test2'
  not_if do ::File.directory?('/tmp/test1') end

end

参考:https://docs.chef.io/resource_common.html#not-if-examples

在这里,我想要的not_if是“等到/ tmp / test1被删除”但是厨师如何执行此操作就像“它找到了目录exixting所以它没有执行资源并退出”

我需要一种方法来等待条件变为真。

2 个答案:

答案 0 :(得分:2)

它实际上是我在various烹饪书中不时看到的模式,通常用于等待块设备或装载某些东西,或wait for a cloud resource。对于你发现的等待食谱,我不得不挖掘the actual source repo on Github来弄清楚如何使用它。这是一个例子:

until 'pigs fly' do
  command '/bin/false'
  wait_interval 5
  message 'sleeping for 5 seconds and retrying'
  action :run
end

它似乎称为ruby的system(command)sleep(wait_interval)。希望这有帮助!

编辑:正如其他海报所述,如果您可以在厨师中完成所有工作,那么使用目录资源和删除操作的通知是更好的解决方案。但是你问过如何使用等待资源,所以我想特别回答。

答案 1 :(得分:2)

首先,请不要创建目录。如果你只使用Chef来执行shell命令,那么你只需要编写一个shell脚本就不会获得更多。依靠Chef directory资源为您做这件事要好得多。然后,您可以确信它每次都可以在每个系统上运行。此外,您将能够使用代表您的目录的Chef资源,以便您可以执行诸如通知之类的操作。

这是对两个目录操作的轻微重构:

# Ensure that your directory gets deleted, if it exists.
directory '/tmp/test1' do
  action :delete
  notifies :action, 'directory[other_dir]', :immediately
end

# Define a resource for your directory, but don't actually do anything to the underlying machine for now.
directory 'other_dir' do
  action :nothing
  path '/tmp/test2'
end