Вот два подхода к исправлению:
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 никогда не узнает об этом, и если пакет будет установлен не так, как через это правило марионеток (например, в качестве зависимости в другом месте), он никогда не будет запустите exec (и установка пакета nginx будет продолжаться с ошибкой).
Другими словами, первый подход к тому, чтобы exec имел какой-то способ проверки, запущен ли он уже или нет, является чрезвычайно предпочтительным.