厨师零通过AWS userdata失败

时间:2014-06-11 12:58:45

标签: amazon-web-services chef

通过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,任何想法导致它?

2 个答案:

答案 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(未定义)时

检查由厨师客户端运行生成的堆栈跟踪以缩小范围。