2012-11-01 51 views
7

我有一个厨师食谱的资源,我希望是可选的。也就是说,当配方运行时,如果资源失败,我希望一切都继续下去。当然,我仍然想知道这个资源出现了故障,只是它不是一个关键的资源,也没有什么依赖它,所以我宁愿继续运行其余的部分。你如何使厨师资源可选?

我习惯于使用Puppet来显式声明你的依赖关系,只有当依赖关系失败而不是一个失败导致整个文件不能运行时,资源才会被跳过。

不知道为什么这是封闭的不是一个真正的问题(即使阅读常见问题后),但我会添加一些示例代码来说明我在问什么,希望别人可以投票重新打开或可以回答。

我使用厨师来设置开发环境,其中的一部分只是克隆了一些git仓库。没有什么依赖于他们,偶尔有一些开发者无法访问的私人回购。如果它无法克隆,我希望其他资源继续运行。

所以以下资源:

["foo", "bar", "baz"].each do |repo| 
    git repo do 
    repository "[email protected]/example/#{repo}" 
    reference "master" 
    action  :sync 
    depth  1 
    user  'dev' 
    group  'dev' 
    destination "#{node[:src_dir]}/#{repo}" 
    end 
end 

如果运行这个无权克隆foo的用户,我想foo​​的失败,但酒吧和巴兹仍然克隆。这怎么可能?

+1

快速和肮脏的选择:ignore_failure真,only_if “卷曲http://github.com/repo” – agross

+1

ignore_failure就是我一直在寻找。 curl不会真正起作用,因为它是一个私人回购,我正在努力解决,所以我依靠ssh密钥来访问它。另外,only_if只是绕过资源而不让我知道任何错误,而ignore_failure在日志中给了我一个好消息:'STDERR:ERROR:Repository not found。 ignore_failure已设置,继续 – mmrobins

回答

6

您可以设置ignore_failure true

0

一种可能性是制作自己的提供者类,它的子类为Chef::Provider::Git,并更改您在子类中不喜欢的行为。您可以在资源中使用provider属性方法来设置该资源的提供者类(在本例中为您的提供者类)。您可能会将您的提供者类放在一个库文件中。