Как работать с зависимостями Puppet при установке Nginx 1.0.5 в Ubuntu 11.04 - PullRequest
9 голосов
/ 26 августа 2011

Я новичок в 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.

Ответы [ 2 ]

14 голосов
/ 27 августа 2011

Вот два подхода к исправлению:

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

1 голос
/ 20 сентября 2013

Вы можете гарантировать независимость от версии, используя переменную 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",
...