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

Итак, я написал этот скрипт Puppet:

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 просто проверяется.

У меня есть элементарное представление о модели уведомления/подписки, но я не был уверен, как заставить директиву nginx отправлять сигнал «уведомления» только при фактической установке nginx.


person richardkmiller    schedule 26.08.2011    source источник


Ответы (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 есть какой-то способ проверить, был ли он уже запущен, гораздо предпочтительнее.

person freiheit    schedule 27.08.2011
comment
Спасибо, это было действительно полезное объяснение. Оба ваших примера сработали, и в итоге я выбрал № 1 по причинам, которые вы упомянули. - person richardkmiller; 31.08.2011

Вы можете обеспечить независимость от версии, используя переменную 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",
person Chris Robinson    schedule 20.09.2013