每当我们创建一个新服务器时,我都有一个bash脚本,它会向最终用户询问一组问题,以帮助厨师配置自定义服务器,他/她对这些问题的回答需要注入厨师,以便我可以使用他们在我的厨师脚本中的回答(例如,设置服务器“hostname”=“server1.stack.com”)。运行chef-client时有一个json属性我读过这可能会有所帮助,但我不确定它在我们的环境中是如何工作的。
注意:我们每15分钟通过cronjob在所有系统上运行chef-client来获取更新。
伪码:
echo -n "What is the server name?"
read hostname
chef-client -j {'hostname' => ENV['$hostname']}
答案 0 :(得分:1)
两个问题,首先是-j
采用文件名而非原始JSON,其次是使用-j
将完全覆盖来自服务器的节点数据,该服务器还包括运行列表和环境。如果在系统配置时完成此操作,您肯定可以执行此类操作,请参阅my AMI bootstrap script以获取示例。如果在初始配置后完成此操作,您最好将这些响应写入文件,然后从您的Chef配方代码中读取。
答案 1 :(得分:1)
将原始json传递给厨师 - 客户是可能的,但需要一点创造力。你只需要这样做:
echo '{"hostname": "$hostname"}' | chef-client -j /dev/stdin
json中的值将与" normal"深度合并。存储在chef-server中的属性。您还可以在json中包含run_list,它将替换(不合并)chef服务器上的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中声明的任何属性都将覆盖已存储在chef-server上的属性。