Linux 厨师:传递变量

Linux 厨师:传递变量,linux,bash,chef-infra,Linux,Bash,Chef Infra,每次我们创建一个新服务器时,我都会有一个bash脚本,它会向最终用户询问一组问题,以帮助chef配置自定义服务器,他/她对这些问题的回答需要注入chef,以便我可以在chef脚本中使用他们的回答(例如,设置服务器“hostname”=“server1.stack.com”)。运行chef client时有一个json属性,我已经读过,这可能会有所帮助,但我不确定在我们的环境中如何工作 注意:我们每15分钟通过cronjob在所有系统上运行一次chef客户端,以获取更新 伪代码: echo -n

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

注意:我们每15分钟通过cronjob在所有系统上运行一次chef客户端,以获取更新

伪代码:

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

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

两个问题,第一个是
-j
采用的文件名不是原始JSON,第二个是使用
-j
将完全覆盖来自服务器的节点数据,其中还包括运行列表和环境。如果这是在系统配置时完成的,您肯定可以执行类似的操作,请参见示例。如果这是在初始设置之后完成的,您最好将这些响应写入一个文件,然后从您的厨师配方代码中读取这些响应。

将原始json传递到厨师客户端是可能的,但需要一些创造性。您只需执行以下操作:

echo '{"hostname": "$hostname"}' | chef-client -j /dev/stdin
json中的值将与存储在chef服务器中的“普通”属性深度合并。您还可以在json中包含一个run_列表,它将替换(而不是合并)chef服务器上的run_列表

您可以在此处看到运行列表替换服务器运行列表:

您可以在此处看到属性的深度合并:


此外,您在json中声明的任何属性都将覆盖已经存储在chef服务器上的属性。

我认为您错了。我刚刚在服务器上验证了将参数传递给-j不会覆盖run_列表或环境。事实上,如果我正确读取源代码,它会在服务器的-j内容和普通属性之间进行深度合并。我从脚本中得到了逻辑,看起来你是在目标机器上运行client-bootstrap.sh吗?@coderanger你介意帮我看看吗?我很乐意承认你在这个领域比我有更多的经验,如果我看错了来源,我很高兴被纠正并删除我的答案。