在Chef Recipe中设置ENV触发Hashie::Mash警告的技术问询
关于Chef设置服务环境变量的问题解答
这是不是设置服务环境变量的最佳方式?
其实直接修改Ruby进程的ENV对象并不是Chef推荐的最佳实践哦。原因很简单:你在Chef脚本里设置的ENV是Chef Ruby进程自己的环境变量,而服务(比如someservice)重启时,通常是由系统的服务管理工具(systemd、upstart、SysVinit等)启动的,它并不会继承Chef进程的环境变量。也就是说,你这么设置后,服务大概率读不到foo=bar这个变量,等于白忙活了。
正确的做法应该是针对服务的启动方式,在对应的配置文件里设置环境变量:
- systemd:在
/etc/systemd/system/someservice.service中添加Environment=foo=bar,或者在/etc/systemd/system/someservice.d/目录下新建一个.conf文件写入该配置,然后执行systemctl daemon-reload再重启服务 - upstart:在
/etc/init/someservice.conf里添加env foo=bar - SysVinit:修改
/etc/default/someservice或者服务的启动脚本,直接添加export foo=bar
这个警告是否可接受?
不建议忽略这个警告。虽然它可能暂时不影响你的脚本运行,但它提示你当前设置的某个键和Hashie::Mash(Chef内部用来处理配置数据的哈希结构)的内置方法重名了(比如警告里提到的default方法)。后续如果你的脚本逻辑涉及到访问这个变量,可能会出现预期外的行为,比如调用到内置方法而不是获取变量值,所以最好还是解决掉。
如何让脚本无警告运行?
首先排查一下是不是你设置的环境变量名和Hashie::Mash的内置方法重名了(比如default、key?这类),如果是,换个变量名就能解决问题。
如果变量名不能改,或者你确实是在用ENV["foo"]这种写法却触发了警告,那大概率是Chef 12.04这个旧版本的兼容性问题——Chef 12系列已经比较老旧了,建议升级到更稳定的新版本,很多这类小问题都已经被修复了。
当然,最根本的解决方式还是改用前面说的服务专属配置文件来设置环境变量,既符合最佳实践,也能彻底避免这类警告。
内容的提问来源于stack exchange,提问作者Brett
相关产品推荐
相关产品推荐

