Как работать с кукольными зависимостями при установке 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",