什么是厨师适当的方式来确保执行块创建"时的幂等性?价值还不完全清楚?

时间:2017-09-20 04:06:27

标签: chef

在以下代码的creates指令中,指定的值包含一个(实际上是多个)通配符。

execute "Install Vagrant plugin: #{plugin}" do
   environment ({ 'HOME' => ::Dir.home(user), 'USER' => user })
   command "vagrant plugin install #{plugin}"
   creates "/home/#{user}/.vagrant.d/gems/*/gems/vagrant-berkshelf-*"
end

我希望没有一种厨师想要的方法来处理事先只知道目录 pattern 而不是实际完整路径的情况。执行的Chef文档没有明确说明creates是否会模式匹配,但经过测试,我相信它不会,也不是模式匹配。

在这种情况下,以上是否适合Chef :: Mixin :: ShellOut使用?或者是否会有另一种更有厨师意图的方法?

如果是前者,我期待使用stackoverflow(12)中的示例来确定目录是否存在与类似creates指令的值的模式匹配上面并使用该返回值来设置是否运行有问题的执行块。

非常感谢任何提示,提示或建议!

  • Informatician

1 个答案:

答案 0 :(得分:1)

您将使用not_ifonly_if保护条款。 creates属性只是not_if { ::File.exist?(the_path) }的帮手。在这种情况下,您可能想要的是not_if "vagrant plugin list | grep #{plugin}"或略微更清洁(IMO)not_if { shell_out!('vagrant plugin list').stdout.include?(plugin) }