为什么即使已经安装了包,Puppet 还要继续安装?

mic*_*hal 5 linux rpm installation puppet

我使用 packageinstall属性来确保X安装了给定的包。

但是,即使安装了软件包,也会puppet尝试重新安装它,当然会以异常退出(“X 已安装”)。当包名称与服务名称匹配时不会发生这种情况。我使用本地 RPM 和 RPM 提供程序。

我如何避免这种异常?


我还实施了一个解决方法:如果我成功安装 RPM,我会创建一个名为/X_DONE. 然后我根据该文件安装依赖项,而不是包。

处理这种情况的正确方法是什么?

编辑:失败的清单:

 file {"$tmp_dir/$php_pdo":
   ensure => present,
   source => "puppet:///files/services/$php_pdo"
 }

 package {"php_pdo":
   require => File["$tmp_dir/$php_pdo"],
   ensure => installed,
   provider => rpm,
   source => "$tmp_dir/$php_pdo"
 }
Run Code Online (Sandbox Code Playgroud)

和例外:

err: /Stage[main]/Apache-php/Package[php_pdo]/ensure: change from absent to present failed: Execution of '/bin/rpm -i --oldpackage /tmp/puppet/php-pdo-5.1.6-27.el5_5.3.x86_64.rpm' returned 1:     package php-pdo-5.1.6-27.el5_5.3.x86_64 is already installed
Run Code Online (Sandbox Code Playgroud)

Sla*_*ast 9

您通过名称“php_pdo”引用包,但 Puppet 将包视为“php-pdo”(破折号,而不是下划线)。每次它检查是否安装了 php_pdo 时,都会发现它没有安装。不幸的是,安装 php-pdo 的次数并不重要,它永远不会是 php_pdo。

要解决此问题,请更改以下行:

package {"php_pdo":
Run Code Online (Sandbox Code Playgroud)

成为:

package {"php-pdo":
Run Code Online (Sandbox Code Playgroud)