Я использую Puppet для установки некоторых пакетов Python с помощью pip. Я использую Puppet 2.7, поэтому объявления моих пакетов выглядят примерно так:
package { "carbon":
require => Class["graphite::prereqs::install"],
ensure => latest,
provider => pip,
}
Проблема в том, что этот пакет и graphite-web
package, похоже, содержат ошибку, которая позволяет устанавливать одну и ту же версию несколько раз с помощью pip. Итак, если я наберу sudo pip install carbon
несколько раз, pip будет устанавливать его каждый раз. Я считаю, что это ошибка пакетов.
Эта ошибка, кажется, тоже сбивает с толку Puppet, потому что каждый раз, когда я инициализирую свою систему, carbon
и graphite-web
переустановлены.
Поэтому мне интересно, есть ли способ обойти эту очевидную ошибку упаковки. Я пробовал следующее:
package { "carbon":
require => Class["graphite::prereqs::install"],
ensure => latest,
provider => pip,
creates => "/opt/graphite/bin/carbon-cache.py",
}
... но я не могу использовать create. Есть ли другой способ указать объявлению пакета искать файл перед установкой пакета?
Возможно, захочется использовать exec's creates
параметр:
exec { "carbon":
command => "pip install carbon",
require => Class["graphite::prereqs::install"],
creates => "/opt/graphite/bin/carbon-cache.py",
path => ["/usr/bin", "/usr/sbin"],
timeout => 100,
}
Я бы попробовал использовать "sure => installed" вместо "sure => latest".
В каком состоянии должен находиться пакет. В упаковочных системах, которые могут извлекать новые пакеты самостоятельно, вы можете выбрать, какой пакет извлекать, указав номер версии или последнюю версию в качестве значения обеспечения. В системах упаковки, которые управляют файлами конфигурации отдельно от «обычных» системных файлов, вы можете удалить файлы конфигурации, указав purged в качестве значения обеспечения. Действительные значения присутствуют (также называются установленными), отсутствуют, очищены, удерживаются, последние. Значения могут совпадать с /./.
Я не знаю, как написан провайдер pip, но держу пари, что если вы используете installed
вместо того latest
, puppet обнаружит, что пакет уже установлен, и не попытается установить его снова.
Я не тестировал, но попробуйте следующее:
file { "/opt/graphite/bin/carbon-cache.py":
ensure => 'absent',
}
package { "carbon":
require => [ Class["graphite::prereqs::install"],
File["/opt/graphite/bin/carbon-cache.py"]
]
ensure => latest,
provider => pip,
}