根据安装的软件包版本在Puppet中做出决定

时间:2013-02-11 21:48:00

标签: package version erb puppet

我想在Puppet .erb文件中执行类似的操作:

<% if (version_of_apache_package_installed =~ /1.5.82/) then -%>
do one thing
<% else -%>
do a different thing 
<% end -%>

如何将某个已安装软件包的版本字符串放入变量version_of_apache_package_installed中,以便我可以完成上述工作?

2 个答案:

答案 0 :(得分:3)

你是在管理那个apache package resource in puppet吗?如果是这样,您可以指定要安装的版本,因此您只需从包资源和此if / else块中读取相同的版本变量。

在您的一个初始文件中......

$package_version = '1.0'
节点中的

......

package { 'your_package':
  ensure => $package_version,
}

这是在木偶中思考的正确方法,“让这台机器成为我所期待的”而不是“我需要处理这台机器的任何东西”。

您可以使用exec来处理条件而无需管理资源,但这根本不理想。

答案 1 :(得分:0)

Puppet方法是声明一些包及其所需的状态,并在包状态改变时执行一些代码,例如:

package { "apache2":
  ensure => 2.2.5,
  notify => Exec['update-apache']
}

exec { 'update-apache'
  command => "/usr/bin/execute_some_script",
  refreshonly => true,
}

这背后的动机主要是表现。检查包版本相对较快,而自定义脚本的执行将延长puppet agent运行时间。

如有必要,您可以使用以下内容:

exec { "custom exec":
  command => "/usr/bin/do something",
  onlyif => "/bin/sh -c '/usr/bin/find /etc/apt/* -cnewer /var/cache/apt/pkgcache.bin | /bin/grep . > /dev/null'",
}

确保自定义脚本的执行不会超过Puppet代理程序运行之间的间隔。