基于已安装RPM版本设置Chef interval与splay time的方案咨询
Chef Recipe获取RPM版本并更新客户端参数实现方案
优先推荐:Recipe内直接实现(无需自定义Ohai插件)
如果仅需在当前Recipe执行时获取RPM版本完成参数更新,无需将版本信息持久化到节点属性供多场景复用,直接在Recipe内调用系统命令获取版本即可,逻辑轻量无额外维护成本:
- 获取指定RPM包版本
# 替换your-target-package为你要查询的应用包名 get_rpm_cmd = "rpm -q --queryformat '%{VERSION}' your-target-package" rpm_version = shell_out(get_rpm_cmd, raise_if_failure: false).stdout.strip # 包未安装时将版本置为nil rpm_version = nil if rpm_version.empty? || rpm_version.include?('is not installed')
- 根据版本更新Chef interval与splay参数
# 示例:当目标包版本大于等于1.5.0时,将执行间隔调整为30分钟,随机偏移调整为5分钟 if rpm_version && Gem::Version.new(rpm_version) >= Gem::Version.new('1.5.0') # 如果你使用官方chef-client cookbook管理配置,直接修改对应属性即可自动生效 node.default['chef_client']['config']['interval'] = 1800 node.default['chef_client']['config']['splay'] = 300 # 如果你自行管理client.rb配置,用template资源更新对应配置项即可 # template '/etc/chef/client.rb' do # source 'client.rb.erb' # variables(interval: 1800, splay: 300) # notifies :reload, 'service[chef-client]', :delayed # end end
该方案优势:
- 所有逻辑聚合在单一Recipe内,可读性和可维护性更高
- 无需额外开发、分发Ohai插件,避免引入额外复杂度
- 版本查询实时性高,不依赖Ohai运行周期
自定义Ohai插件适用场景
仅当你需要将该RPM版本信息上报到Chef Server,供多Cookbook复用、节点搜索、版本统计等场景使用时,再选择该方案:
- 自定义Ohai插件代码(存放在当前Cookbook的
files/default/plugins/rpm_version.rb)
Ohai.plugin(:CustomAppVersion) do provides 'custom_app_version' collect_data(:linux) do custom_app_version Mash.new rpm_output = shell_out("rpm -q --queryformat '%{VERSION}' your-target-package", raise_if_failure: false).stdout.strip custom_app_version['value'] = rpm_output.empty? || rpm_output.include?('is not installed') ? nil : rpm_output end end
- 开启Ohai插件分发,在Cookbook属性中添加:
node.default['ohai']['plugin_path'] = '/etc/chef/ohai/plugins' node.default['ohai']['plugins']['当前Cookbook名称'] = ['rpm_version.rb']
- Recipe中获取版本并更新参数的逻辑和上述方案一致,只需将版本获取方式替换为
node['custom_app_version']['value']即可。
选型结论
你当前的需求直接使用Recipe内直接实现的方案即可,完全满足使用要求,无需引入自定义Ohai插件。
内容的提问来源于stack exchange,提问作者Swetha HK
相关产品推荐
相关产品推荐

