Как работать с кукольными зависимостями при установке Nginx 1.0.5 на Ubuntu 11.04
Я новичок в Puppet и имею вопрос о работе с зависимостями.
Я использую Puppet для установки nginx 1.0.5 на Ubuntu 11.04. Это требует добавления нового репозитория apt, так как natty обычно поставляется с Nginx 0.8. В командной строке установка идет следующим образом:
# apt-get install python-software-properties
# add-apt-repository ppa:nginx/stable
# apt-get update
# apt-get install nginx
поэтому я написал этот сценарий кукольного:
class nginx::install {
package { "nginx":
ensure => present,
require => Exec["nginx_repository"],
}
exec { "add-apt-repository ppa:nginx/stable && apt-get update":
alias => "nginx_repository",
require => Package["python-software-properties"],
}
package { "python-software-properties":
ensure => installed,
}
}
скрипт работает, но директива exec{} выполняется каждый раз, а не только при фактической установке nginx. В идеале, Я бы хотел, чтобы команды "apt" запускались только перед фактической установкой nginx, а не когда установка nginx просто проверяется.
у меня есть рудиментарное понимание модели notify/subscribe, но я не был уверен, как заставить директиву nginx отправлять сигнал "notify" только при фактической установке nginx.
2 ответов
вот два подхода для исправления этого:
1)
exec { "add-apt-repository ppa:nginx/stable && apt-get update":
alias => "nginx_repository",
require => Package["python-software-properties"],
creates => "/etc/apt/sources.list.d/nginx-stable-natty.list",
}
это скажет exec только для запуска, если этот файл не существует. Если есть другой способ проверить, что exec успешно запущен, у вас может быть onlyif =>
или unless =>
чтобы указать команду для проверки.
2)
exec { "add-apt-repository ppa:nginx/stable && apt-get update":
alias => "nginx_repository",
require => Package["python-software-properties"],
refreshonly => true,
subscribe => Package["python-software-properties"],
}
это подскажет exec запускать только если он уведомлен, и скажет этому пакету уведомить exec, что он должен работать. (Вместо этого можно указать notify => Exec["nginx_repository"]
в строфе пакета python-software-properties; эффект уведомления на одном конце отношения такой же, как подписка на другом конце отношения.)
недостатком второго подхода является то, что если что-то пойдет не так, puppet никогда не поймет это, и если пакет установлен каким-то другим способом, чем через это правило puppet (например, вытащил как зависимость в другом месте), он никогда не будет запускать exec (и установка пакета nginx будет держать недостаток.)
другими словами, первый подход к тому, чтобы у exec был какой-то способ проверить, запущен ли он уже, намного предпочтительнее.
вы можете обеспечить независимость версии, используя переменную Facter lsbdistcodename
а в следующей модификации creates
атрибут в коде freiheit:
exec { "add-apt-repository ppa:nginx/stable && apt-get update":
alias => "nginx_repository",
require => Package["python-software-properties"],
creates => "/etc/apt/sources.list.d/nginx-stable-${lsbdistcodename}.list",
}
для Ubuntu 12.04 Lucid это расширяется до:
creates => "/etc/apt/sources.list.d/nginx-stable-lucid.list",