我有一份厨师食谱,其中包含passenger_apache2 cookbook中的passenger_apache2::mod_rails
食谱。在服务器的第一次Chef运行中,这创建了两个(有效的)配置文件:
# /etc/apache2/mods-available/passenger.load
LoadModule passenger_module /var/lib/gems/1.9.1/gems/passenger-3.0.11/ext/apache2/mod_passenger.so
# /etc/apache2/mods-available/passenger.conf
PassengerRoot /var/lib/gems/1.9.1/gems/passenger-3.0.11
PassengerRuby /usr/bin/ruby1.9.1
PassengerMaxPoolSize 6
这些是使用node[:languages][:ruby][:ruby_bin]
和node[:languages][:ruby][:gems_dir]
分别使用食谱模板passenger.load.erb和passenger.conf.erb创建的。这些属性为automatically populated by Ohai。
在第二轮chef-client
上,这些文件搞砸了。以下是他们现在的样子:
# /etc/apache2/mods-available/passenger.load
LoadModule passenger_module /gems/passenger-3.0.11/ext/apache2/mod_passenger.so
# /etc/apache2/mods-available/passenger.conf
PassengerRoot /gems/passenger-3.0.11
PassengerRuby
PassengerMaxPoolSize 6
因此看起来在Chef运行期间没有填充node[:languages][:ruby]
。但是如果我直接从服务器上的IRB会话中调用Ohai,它就会正确显示。
$ sudo -Hu root /usr/bin/irb1.9.1
irb(main):001:0> require 'yaml'
irb(main):002:0> require 'chef'
irb(main):003:0> node = YAML::load(`/usr/local/bin/ohai`)
irb(main):004:0> node['languages']['ruby']['ruby_bin']
=> "/usr/bin/ruby1.9.1"
irb(main):005:0> mash = Chef::Mash.new(node)
irb(main):006:0> mash[:languages][:ruby][:ruby_bin]
=> "/usr/bin/ruby1.9.1"
我可以修复该文件,但它不会阻止问题在下一次Chef运行时重复出现。我对如何进一步解决这个问题感到有点难过。
还有其他人遇到过这个问题吗?我还没有尝试在我的食谱或角色中手动设置这些属性,但我不相信我应该;自动属性不应该被覆盖。
答案 0 :(得分:1)
我想我只是重新启动了厨师 - 客户端解决了这个问题,但我仍然对根本原因感到难过。
我相信(当时我遇到了这个问题)chef-client守护程序的运行实例是我用knife bootstrap
引导服务器时启动的原始实例。我们的bootstrap模板安装了ruby1.9.1软件包,但是chef-client守护程序可能无法正确加载它。 (我对此很模糊。)
我首先尝试将ohai "reload"
添加到我的食谱中,在下一次计划的Chef运行中,配置文件仍然被破坏。
接下来我运行了service chef-client restart
,然后Chef正确填充了有问题的配置文件。在下一次运行中,他们仍然是正确的。
所以我希望这会消失,但我仍然迷惑为什么我正在运行的chef-client实例无法正确地从Ohai重新加载自动属性。如果对厨师具有更深入操作知识的人遇到这种情况,我仍然欢迎任何评论或战争故事。