Amazon web services 通过AWS userdata执行chef zero失败

Amazon web services 通过AWS userdata执行chef zero失败,amazon-web-services,chef-infra,Amazon Web Services,Chef Infra,当通过AWS userdata运行chef zero时,运行总是失败。但是,如果我使用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

当通过AWS userdata运行chef zero时,运行总是失败。但是,如果我使用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实例时设置的userdata包括以下内容:

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
curl-Lhttps://www.opscode.com/chef/install.sh |猛击
mkdir/opt/chef zero
cd/opt/chef zero
wgethttp://myserver/chef-repo.tar.gz
tar zxf主厨酒店
实例_ID=`curlhttp://169.254.169.254/latest/meta-data/instance-id`
cat 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引导chef 11.6.0)。userdata(
curl…| bash
)的综合安装程序正在将chef升级到11.12.8。最初的刀子运行包括运行中的
chef-client::service
,主机最初配置为与chef-client+chef-server一起使用(即/etc/chef中有一个“validation.pem”和“client.rb”-不确定这是否有区别)

我能够登录到机器上,并在机器启动(等待检索文件和用户数据chef客户端失败后)并且chef运行正常时执行
chef client-z-c solo.rb-o'role[someRole]'-E BUILD


我不知道为什么userdata chef客户端使用未定义的方法运行失败,知道是什么原因吗?

这可能与chef zero无关,但表明配方代码中存在问题(chef-repo.tar.gz中的任何内容,或由角色[someRole]驱动)。它表示试图访问散列的子元素,如

node['foo']['bar']
但是当
节点['foo']
nil
时(未定义)


检查由chef客户端运行生成的stacktrace以缩小范围。

经过进一步调查,多亏了与freenode上的“chef家伙”聊天,问题缩小到了环境

使用userdata执行脚本时,未设置“HOME”变量。chef gem中的shell.rb中充斥着对
ENV[“HOME”]
的引用

宋承宪:

如果您需要通过用户数据执行chef client,那么在尝试执行chef之前,应该手动导出HOME

该漏洞已在以下位置报告:

编辑


提交了一个pull请求,该请求已合并到master中

我更新了userdata脚本,将repo解包到/var/chef,并使用chef solo执行。Chef solo工作正常。当它从userdata运行时,会失败并出现错误。我使用ssh连接到主机上并执行相同的命令,它可以正常工作,对repo没有任何更改。我甚至更新了userdata来编写一个脚本来运行它(例如
cat)
# 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, ...