Chef12升级至Chef13时chef-solo的PATH路径问题求助
解决Chef 13 chef-solo无法找到嵌入式openssl等工具的问题
Chef 13默认开启了enforce_path_sanity机制——哪怕你没用到Kitchen,它也会重置系统PATH到默认值,不再自动把/opt/chef/embedded/bin加进去,这就是你执行openssl命令时报错的根源。这里给你几个实用的解决办法,按需选择:
1. 直接指定工具的完整路径
最简单粗暴的方式,就是在execute资源里写死嵌入式openssl的绝对路径,完全不依赖PATH:
execute "generate ca.pem" do command "/opt/chef/embedded/bin/openssl x509 -req -in hostname.csr -CA /path/to/ca.pem -CAkey /path/to/ca.key -CAcreateserial -out hostname.cer -days 512 -sha256" end
适合只需要修改少量execute资源的场景,快速见效。
2. 修改solo配置关闭路径强制清理
如果你想回到Chef 12的行为,可以在你的chef-solo配置文件(比如/etc/chef/solo.rb)里添加一行配置,禁用enforce_path_sanity:
enforce_path_sanity false
这样Chef会保留系统原本的PATH,并且自动把嵌入式bin目录追加进去。不过要注意,这种方式会让PATH包含所有系统环境里的路径,可能带来路径优先级的潜在问题,需要根据你的环境评估风险。
3. 在食谱里手动添加嵌入式路径到PATH
如果不想全局禁用路径清理,可以针对单个食谱或者单个execute资源手动设置PATH:
- 全局在食谱开头设置:
ENV['PATH'] = "/opt/chef/embedded/bin:#{ENV['PATH']}"
- 仅针对当前execute资源设置:
execute "generate ca.pem" do command "openssl x509 -req -in hostname.csr -CA /path/to/ca.pem -CAkey /path/to/ca.key -CAcreateserial -out hostname.cer -days 512 -sha256" environment 'PATH' => "/opt/chef/embedded/bin:#{ENV['PATH']}" end
这种方式更灵活,只会影响指定范围,不会改变Chef的全局行为。
4. 使用Chef内置的路径Helper获取工具路径
Chef提供了内置的Helper方法来获取嵌入式工具的路径,不用硬编码路径,适配性更好:
openssl_path = Chef::Util::PathHelper.embedded_bin_path('openssl') execute "generate ca.pem" do command "#{openssl_path} x509 -req -in hostname.csr -CA /path/to/ca.pem -CAkey /path/to/ca.key -CAcreateserial -out hostname.cer -days 512 -sha256" end
如果你的Chef是自定义安装路径的,这种方式也能正确找到工具,比硬编码更可靠。
内容的提问来源于stack exchange,提问作者Raamish Malik
相关产品推荐
相关产品推荐

