В этой части рецепта от шеф-повара 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 команд. Есть лучший способ сделать это?
Для вашего конкретного примера я бы предложил использовать Chef's 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
ресурсов, это более четко передает намерение - в нем говорится, что каталог должен существовать (с правильным пользователем и группой), и что следует создать пару символических ссылок, если что-то еще не существует.
Наконец, если у вас было несколько связанных команд оболочки, которые вам нужно было выполнить вместе, рассмотрите возможность использования script
ресурс.