【问题标题】:Chef: passing variables厨师:传递变量
【发布时间】:2014-10-08 09:37:27
【问题描述】:

每次我们创建一个新服务器时,我都有一个 bash 脚本,它会询问最终用户一组问题以帮助厨师配置自定义服务器,他/她对这些问题的回答需要注入厨师,以便我可以使用他们在我的主厨脚本中的响应(例如,设置服务器“主机名”=“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']}

【问题讨论】:

    标签: linux bash chef-infra


    【解决方案1】:

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

    【讨论】:

    • 我相信你错了。我刚刚在我的服务器上验证了将参数传递给 -j 不会覆盖 run_list 或环境。事实上,如果我正确读取源代码,它会在 -j 内容和服务器的正常属性之间进行深度合并。 github.com/opscode/chef/blob/…
    • 我得到了脚本中的逻辑,看起来你是在目标机器上运行这个 client-bootstrap.sh 吗?
    【解决方案2】:

    将原始 json 传递给 chef-client 是可能的,但需要一点创造力。您只需执行以下操作:

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

    您的 json 中的值将与存储在 chef-server 中的“正常”属性深度合并。您还可以在 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 中声明的任何属性都将覆盖已存储在 chef-server 上的属性。

    【讨论】:

    • @coderanger 你介意帮我看看这个吗?我欣然承认,您在这个领域的经验比我多得多,如果我读错了源代码,我很高兴得到纠正并删除我的答案。
    猜你喜欢
    • 2016-08-02
    • 2015-03-08
    • 2013-07-15
    • 2021-04-18
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    相关资源
    最近更新 更多