如何告诉木偶只有安装使用皮普如果文件不存在

我正在使用Puppet来使用pip来安装一些Python包。 我使用Puppet 2.7,所以我的包声明看起来像这样:

package { "carbon": require => Class["graphite::prereqs::install"], ensure => latest, provider => pip, } 

问题是这个软件包和graphite-web软件包似乎都有一个bug,可以使用pip多次安装相同的版本。 所以如果我多次inputsudo pip install carbon ,每次都会安装pip。 我相信这是一个包的错误。

这个错误似乎也混淆了木偶,因为每次我提供我的系统, carbongraphite-web重新安装。

因此,我想知道是否有办法解决这个明显的包装错误。 我已经尝试了以下内容:

 package { "carbon": require => Class["graphite::prereqs::install"], ensure => latest, provider => pip, creates => "/opt/graphite/bin/carbon-cache.py", } 

…但我不能使用创build。 有没有另外一种方法可以告诉包声明在安装包之前查找文件?

可能要使用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, } 

我还没有testing,但试试这个:

 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, } 

我会尝试使用“确保=>安装”,而不是“确保=>最新”。

从木偶types参考 :

软件包的状态应该在什么状态。在可以自行检索新软件包的打包系统上,可以通过指定版本号或最新值作为确保值来select要检索哪个软件包。 在与“普通”系统文件分开pipe理configuration文件的打包系统上,可以通过指定purged作为确保值来卸载configuration文件。 有效值存在(也称为安装),缺失,清除,保持,最新。 值可以匹配/./。

我不知道如何编写点子提供者,但我敢打赌,如果你使用installed而不是latest ,puppet会检测到包已经安装,而不是尝试再次安装。