2014-10-07 56 views
0

每次我们创建一个新的服务器我有一个bash脚本向最终用户询问一组帮助厨师配置自定义服务器的问题,他/她对这些问题的回答需要注入厨师我可以在我的厨师脚本中使用他们的响应(例如,设置服务器“hostname”=“server1.stack.com”)。在运行chef-client时有一个json属性我已经阅读过这些可能有用的信息,但我不确定在我们的环境中该如何工作。厨师:传递变量

注意:我们通过cronjob每15分钟在我们的所有系统上运行chef-client以获取更新。

伪代码:

echo -n "What is the server name?" 
read hostname 

chef-client -j {'hostname' => ENV['$hostname']} 

回答

1

两个问题,第一个是-j一个文件名不生JSON和第二个是使用-j将完全覆盖节点的数据从其中还包括运行列表和环境中的服务器来。如果这是在系统配置时完成的,那么您绝对可以做这样的事情,例如参见my AMI bootstrap script。如果这是在初始配置之后完成的,那么您最好将这些响应写入文件,然后从您的厨师配方代码中读取。

+0

我相信你错了。我刚刚在我的服务器上验证了传入-j的参数不会覆盖run_list或环境。 事实上,如果我正确地阅读源代码,它会在服务器的-j内容和常规属性之间进行深度合并。 https://github.com/opscode/chef/blob/cbb9ae97e2d3d90b28764fbb23cb8eab4dda4ec8/lib/chef/node.rb#L293 – 2014-10-08 01:28:11

+0

我得到了脚本中的逻辑,它看起来像你在运行这个client-bootstrap.sh目标机器本身? – user3617841 2014-10-08 15:53:53

1

将原始json传递给厨师客户端是可能的,但需要一点创意。你只需做这样的事情:

echo '{"hostname": "$hostname"}' | chef-client -j /dev/stdin 

在你的JSON的值将与存储在厨师服务器“正常”的属性来深的合并。你也可以在你的json中包含一个run_list,它将取代(而不是合并)厨师服务器上的run_list。

你可以看到run_list这里更换服务器运行列表: https://github.com/opscode/chef/blob/cbb9ae97e2d3d90b28764fbb23cb8eab4dda4ec8/lib/chef/node.rb#L327-L338

你可以看到属性的深合并在这里: https://github.com/opscode/chef/blob/cbb9ae97e2d3d90b28764fbb23cb8eab4dda4ec8/lib/chef/node.rb#L305-L311

而且,你在你的JSON声明任何属性将覆盖已经存储在厨师服务器上的属性。

+0

@coderanger你介意看看这个吗?我很乐意承认你在这方面的经验比我多,如果我正在读错源,我很高兴能够纠正并删除我的答案。 – 2014-10-08 17:47:42