我在升级我的代码(为 3.x 编写)以便在我们新的 5.x puppet 环境中顺利运行时遇到了一个问题。我的问题具体与“问号条件”有关(不确定如何描述它们)..
在下面的代码片段中,我已经验证了 facter 变量 $operatingsystemmajrelease 确实解析为 6 ...在 puppet 3.x 及以下版本中...我在末尾添加的“notify”将返回“six”(如预期的那样)..但在 puppet 4.x 及以上版本中...它会下降到默认的“不知道”(因此比较运算符不匹配)..我相信这与 facter 将值作为字符串返回有关,我知道 puppet 4.x 对字符串的要求要严格得多..我试过引用条件“5”、“6”等...但没有成功..有人知道我如何解决这个问题才能让这个条件正常工作吗
$version = $operatingsystemmajrelease ? {
5 => 'five',
6 => 'six',
7 => 'seven',
default => 'dont know'
}
notify {"version is $version":}
答案1
这一事实是一个字符串,你可以用以下方法证明:
notice("${type($operatingsystemmajrelease)}")
它将返回:
Notice: Scope(Class[main]): String
因此,即使它看起来是数字,它也应该是:
$version = $operatingsystemmajrelease ? {
'5' => 'five',
'6' => 'six',
'7' => 'seven',
default => "don't know",
}
如果您希望它成为一个实整数以便使用<
/>
运算符,您可以这样做:
$version = Integer($operatingsystemmajrelease)
notice("${version} is of type ${type($version)}")
这给你:
Notice: Scope(Class[main]): 7 is of type Integer[7, 7]
等等。但是还有versioncmp()
专门用于比较版本号的函数。还有较新的结构化事实,因此您可能想要使用$facts['os']['release']['major']
,(它也恰好是字符串)。