我正在使用 Puppet 通过 pip 安装一些 Python 包。我使用的是 Puppet 2.7,所以我的包声明如下所示:
package { "carbon":
require => Class["graphite::prereqs::install"],
ensure => latest,
provider => pip,
}
问题是这个包和这个graphite-web
包似乎都有一个错误,使得可以使用 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",
}
...但我不能使用创建。还有其他方法可以告诉包声明在安装包之前查找文件吗?
答案1
可能需要使用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,
}
答案2
我还没有测试过,但可以尝试这个:
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,
}
答案3
我会尝试使用“ensure => mounted”而不是“ensure => latest”。
来自木偶类型参考:
软件包应处于什么状态。在可以自行检索新软件包的打包系统上,您可以通过指定版本号或最新作为确保值来选择要检索的软件包。在将配置文件与“正常”系统文件分开管理的打包系统上,您可以通过指定清除作为确保值来卸载配置文件。有效值为存在(也称为已安装)、不存在、清除、持有、最新。值可以匹配 /./。
我不知道 pip 提供程序是如何编写的,但我敢打赌,如果您使用installed
而不是latest
,puppet 将检测到该包已安装并且不会尝试再次安装它。