将一个条件应用到一组厨师资源更简单的方法

在这个厨师食谱的部分,有4个execute资源。 他们应该只在文件不存在时运行。 这是作为条件添加到第一个资源,然后触发整个链运行。

 # Set up default SSL cert execute "defaultcert1" do not_if {File.exist?("/vol/webserver/cert")} command "mkdir /vol/webserver/cert" notifies :run, "execute[defaultcert2]", :immediately end execute "defaultcert2" do action :nothing command "ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem /vol/webserver/cert/server.crt" notifies :run, "execute[defaultcert3]", :immediately end execute "defaultcert3" do action :nothing command "ln -s /etc/ssl/private/ssl-cert-snakeoil.key /vol/webserver/cert/server.key" notifies :run, "execute[defaultcert4]", :immediately end execute "defaultcert4" do action :nothing command "chown -R ubuntu:ubuntu /vol/webserver/cert" end 

正如你所看到的,守卫4个命令是一个相当大的代码。 有一个更好的方法吗?

举个具体的例子,我build议使用Chef的directorylink资源,而不是放弃:

 directory "/vol/webserver/cert" do user "ubuntu" group "ubuntu" end link "/vol/webserver/cert/server.crt" do to "/etc/ssl/certs/ssl-cert-snakeoil.pem" end link "/vol/webserver/cert/server.key" do to "/etc/ssl/certs/ssl-cert-snakeoil.key" end 

你不需要用not_if来防止这些,并且通知 – 如果目录和链接已经存在了正确的属性,Chef就不会做任何事情。

另一方面,如果没有开始,就要使用snakeoil证书和密钥,但如果文件已经存在,则什么也不做。 在这种情况下,我会在链接资源上使用not_if

 directory "/vol/webserver/cert" do user "ubuntu" group "ubuntu" end link "/vol/webserver/cert/server.crt" do to "/etc/ssl/certs/ssl-cert-snakeoil.pem" not_if "test -e /vol/webserver/cert/server.crt" end link "/vol/webserver/cert/server.key" do to "/etc/ssl/certs/ssl-cert-snakeoil.key" not_if "test -e /vol/webserver/cert/server.key" end 

与一串execute资源相比,这更清楚地传达了意图 – 它说目录需要存在(具有正确的用户和组),除非已经存在,否则应创build一对符号链接。

最后,如果您确实需要一起执行几个相关的shell命令,请考虑使用script资源。