Назад | Перейти на главную страницу

Более простой способ применить одно условие к набору ресурсов Chef

В этой части рецепта от шеф-повара 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 ресурс.