厨师:传递变量

时间:2014-10-07 17:54:08

标签: linux bash chef

每当我们创建一个新服务器时,我都有一个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']}

2 个答案:

答案 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上的属性。