特定版本检查 + if and else 循环

特定版本检查 + if and else 循环

只需启动 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

有几件事你可以做来解决这个问题,从长远来看这将使你的代码变得更好。

  1. 使用标准库改进了字符串比较操作,例如versioncmp()。它将正确处理包含小数和字母的版本字符串。

 if versioncmp($::puppetversion, '3.0.0') < 0 {
    fail("foobar requires puppet 3.0.0 or greater, found: \'${::puppetversion}\'")
  }

  1. 不要在资源内部执行条件语句。至少将它们拆分出来,以便它们位于清单的顶部。(未经测试的代码)

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/

相关内容