通过AWS userdata运行厨师零时,运行总是失败。但是,如果我ssh到机器上并手动执行相同的命令,它将按预期工作。这是我得到的输出:
Chef: 11.12.8
[2014-06-11T12:40:34+00:00] INFO: Auto-discovered chef repository at /opt/chef-zero
[2014-06-11T12:40:34+00:00] INFO: Starting chef-zero on port 8889 with repository at repository at /opt/chef-zero
One version per cookbook
[2014-06-11T12:40:34+00:00] INFO: Forking chef instance to converge...
[2014-06-11T12:40:35+00:00] DEBUG: Fork successful. Waiting for new chef pid: 1530
[2014-06-11T12:40:35+00:00] DEBUG: Forked instance now converging
[2014-06-11T12:40:35+00:00] ERROR: undefined method `[]' for nil:NilClass
[2014-06-11T12:40:35+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
我在AWS中启动EC2实例时设置的用户数据包括以下内容:
curl -L https://www.opscode.com/chef/install.sh | bash
mkdir /opt/chef-zero
cd /opt/chef-zero
wget http://myserver/chef-repo.tar.gz
tar zxf chef-repo
INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id`
cat <<EOF > /opt/chef-zero/solo.rb
ssl_verify_mode :verify_peer
node_name "$INSTANCE_ID"
EOF
/opt/chef/bin/chef-client -v >chef-zero.log 2>&1
/opt/chef/bin/chef-client -z -l debug -c solo.rb -o 'role[someRole]' -E BUILD >> chef-zero.log 2>&1
我使用的AMI是一个自定义的AMI,最初使用knife
+ knife-ec2
(从ubuntu 13.04公共ami引导厨师11.6.0)进行配置。来自userdata(curl ... | bash
)的omnibus安装程序正在将chef升级到11.12.8。原始刀具运行包含chef-client::service
,主机最初配置为与chef-client + chef-server一起使用(即&#39; sa&#34; validation.pem&#34 ;和&#34; client.rb&#34;在/ etc / chef中 - 不确定这是否有所不同。)
我可以在机器启动后立即登录机器并执行chef-client -z -c solo.rb -o 'role[someRole]' -E BUILD
(在等待检索文件并且用户数据厨师 - 客户端失败之后)并且厨师运行正常
我不知道为什么userdata chef-client运行失败了undefined method
,任何想法导致它?
答案 0 :(得分:1)
经过一些进一步的调查,并且由于与freenode上的#chef人聊天,问题被缩小到环境。
使用userdata执行脚本时,&#34; HOME&#34;变量未设置。来自chef gem的shell.rb中充斥着对ENV["HOME"]
的引用。
SSH:
# unset HOME
# chef-client -z -o 'role[test]'
ERROR: undefined method `[]' for nil:NilClass
# export HOME=/root
# chef-client -z -o 'role[test]'
Starting Chef Client, version ....
...
Chef Client finished, ...
如果您需要通过用户数据执行chef-client,您应该在尝试执行chef之前手动导出HOME。
已在https://tickets.opscode.com/browse/CHEF-5365
报告错误修改强>
提交了一个已经合并为master的pull请求。 https://github.com/opscode/chef/pull/1494
答案 1 :(得分:0)
这可能与厨师零无关,但表示你的食谱代码存在问题(无论是在chef-repo.tar.gz里面,还是由角色[someRole]驱动)。它表示尝试访问哈希的子元素,如
node['foo']['bar']
但node['foo']
为nil
(未定义)时
检查由厨师客户端运行生成的堆栈跟踪以缩小范围。