Назад | Перейти на главную страницу

Как указать Puppet устанавливать только с помощью Pip, если файл не существует

Я использую 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,
}