只需启动 puppet。众所周知,开始某件事总是最困难的。好吧,为了练习,我想做以下事情:我假设我要把它放在 init.pp 中。
if 'openssl' version == '1.0.2b' or '1.0.2d'
upgrade to 1.1.1e
else
do nothing
目前我的代码如下所示
package { 'openssl':
if 'openssl' version == '1.0.2b' or '1.0.2d' {
ensure => '1.1.1e'
}
else {
}
我有几个问题:
1) 我认为我写的 openssl 版本的语法不正确。当我进行简单的谷歌搜索时,我看到人们确保 openssl 的版本是这样的“1.0.1e-15.el6”,有时是“1.0.1e-16.el6_5.7”,我无法确定“-”后面是什么
2)我不认为输入“openssl”会让 puppet 知道它是 openssl
3) 如何检查 openssl 的版本?我认为我的语法if 'openssl' version == 'xxx'
不正确。
答案1
有几件事你可以做来解决这个问题,从长远来看这将使你的代码变得更好。
- 使用标准库改进了字符串比较操作,例如
versioncmp()
。它将正确处理包含小数和字母的版本字符串。
if versioncmp($::puppetversion, '3.0.0') < 0 {
fail("foobar requires puppet 3.0.0 or greater, found: \'${::puppetversion}\'")
}
- 不要在资源内部执行条件语句。至少将它们拆分出来,以便它们位于清单的顶部。(未经测试的代码)
if versioncmp( '$openssl', '1.1.3e') < 0 {
$openssl_version = '42'
}
package {'openssl':
ensure => "$openssl_version",
}
不过,你必须问问自己,这真的是你想做的吗?Puppet 的最佳实践是,你的业务需求不应该成为基础模块的一部分。它们应该抽象为角色/配置文件模块或 hiera。以下选项可能会对你更有帮助。
答:确保所有服务器都是最新的
package {'openssl':
ensure => latest,
}
B.如果你有一些节点,那就必须使用较旧/不安全的版本。然后创建一个参数化类,并openssl_version
使用 hiera 或 role/profile 覆盖该参数。
附加信息
https://puppetlabs.com/blog/patching-heartbleed-openssl-vulnerability-puppet-enterprise http://garylarizza.com/blog/2014/02/17/puppet-workflow-part-2/