如何告诉 Puppet 仅在文件不存在时使用 Pip 安装

如何告诉 Puppet 仅在文件不存在时使用 Pip 安装

我正在使用 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 将检测到该包已安装并且不会尝试再次安装它。

相关内容