在这个厨师食谱的部分,有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的directory和link资源,而不是放弃:
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资源。