比较软件包的版本
软件包的版本号是个奇怪的东西。它们看起来像十进制的数字,但它们不是。 例如,一个版本号通常的形式为 2.6.4。如果你需要比较两个版本号, 不能做简单的字符串比较,因为 2.6.4 会比 2.6.12 大;也不能进行数字比较, 因为它们不是有效地数字。
Puppet 的 versioncmp 函数会帮我们解决这个问题。 若你给它传递两个版本号,它会比较它们,并返回一个值,指出谁是更大的:
versioncmp( A, B )
将返回如下值:
若 A 和 B 相同,则返回 0
若 A 大于 B ,则返回大于 1 的值
若 A 小于 B ,则返回小于 0 的值
操作步骤
添加如下代码到你的配置清单:
$app_version = "1.2.2" $min_version = "1.2.10" if versioncmp( $app_version, $min_version ) >= 0 { notify { "Version OK": } } else { notify { "Upgrade needed": } }
运行 Puppet:
notice: Upgrade needed
现在更变 $app_version 的值:
$app_version = "1.2.14"
在次运行 Puppet:
notice: Version OK
工作原理
我们指定了可接受的最小版本($min_version)是 1.2.10。 所以在上面的例子中,我们用 $app_version 为 1.2.2 的版本号与之比较。
简单的对两个字符串进行比较(例如,Ruby 中的字符串比较)将会给出错误的结果, 然而 versioncmp 却可以正确地检测出 1.2.2 小于 1.2.10 并提示我们 Upgrade needed。
当改变 $app_version 的值为 1.2.14 后,由于 versioncmp 正确地检测出 $app_version 大于 $min_version,所以提示我们 Version OK。