Chef Recipe:如何正确检查内核版本是否达到或高于指定版本
正确检查Chef配方中的内核版本
原代码的问题
你之前用.to_f转换内核版本的方式存在严重缺陷:
- 内核版本是多段字符串(如
2.6.100),转成浮点数后会变成2.6,和2.6.33比较时会错误判定2.6.100更小 - 这种写法会触发cookstyle检查失败,不符合Chef开发的最佳实践
正确的版本比较方法
利用Ruby标准库的Gem::Version类(Chef环境已内置)处理版本字符串比较,它能正确识别多段版本号的层级关系。步骤如下:
- 提取内核版本核心部分:去掉
release字段中-后面的发行版后缀(如-el5) - 使用
Gem::Version实例化版本字符串后再做比较
修改后的代码示例
if platform_family?('rhel') && node['platform_version'].to_i == 5 && Gem::Version.new(node['kernel']['release'].split('-').first) >= Gem::Version.new('2.6.33') # 此处编写需要执行的代码逻辑 end
补充说明
node['kernel']['release'].split('-').first:将内核版本字符串按-拆分,取第一部分,例如把2.6.33-123.el5转换为2.6.33- 也可以使用Chef官方提供的
Chef::VersionString类,用法与Gem::Version完全一致,效果相同
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

