调用chef-solo的惯用方式是什么?大多数网站都这样做:
chef-solo -c ~/solo.rb -j ~/node.json -r http://www.example.com/chef-solo.tar.gz
但这很长。我可以想到一些更短的方法:
- 瑞克任务(
rake chef-solo
)。 - 一个小的shell脚本(
run-chef-solo
)。 - 别名(可以覆盖名称,例如
chef-solo
)。
惯用的方法是什么?其他厨师用户如何调用厨师?
调用chef-solo的惯用方式是什么?大多数网站都这样做:
chef-solo -c ~/solo.rb -j ~/node.json -r http://www.example.com/chef-solo.tar.gz
但这很长。我可以想到一些更短的方法:
rake chef-solo
)。run-chef-solo
)。chef-solo
)。惯用的方法是什么?其他厨师用户如何调用厨师?
Answers:
默认情况下,chef-solo
从中读取其配置/etc/chef/solo.rb
。命令行参数与可以在此文件中设置的配置值相对应。这是使用mixlib-config库完成的。
option :config_file,
:short => "-c CONFIG",
:long => "--config CONFIG",
:default => "/etc/chef/solo.rb",
:description => "The configuration file to use"
option :json_attribs,
:short => "-j JSON_ATTRIBS",
:long => "--json-attributes JSON_ATTRIBS",
:description => "Load attributes from a JSON file or URL",
:proc => nil
option :recipe_url,
:short => "-r RECIPE_URL",
:long => "--recipe-url RECIPE_URL",
:description => "Pull down a remote gzipped tarball of recipes and untar it to the cookbook ca
che.",
:proc => nil
“选项”是配置文件的值。
实际的配置文件/etc/chef/solo.rb
如下所示:
file_cache_path "/tmp/chef-solo"
cookbook_path "/tmp/chef-solo/cookbooks"
role_path "/tmp/chef-solo/roles"
json_attribs "/tmp/chef-solo/node.json"
recipe_url "http://www.example.com/chef-solo.tar.gz"
还请注意,JSON文件也可以是远程URL。
json_attribs "http://www.example.com/node.json"
您也可以将Ohai用作配置文件中的库,以检测平台或其他属性以指定要使用的JSON文件。
require 'rubygems'
require 'ohai'
o = Ohai::System.new
o.all_plugins
file_cache_path "/tmp/chef-solo"
cookbook_path "/tmp/chef-solo/cookbooks"
role_path "/tmp/chef-solo/roles"
json_attribs "/tmp/chef-solo/#{o[:platform]}.json"
recipe_url "http://www.example.com/chef-solo.tar.gz"
然后,例如,您将具有“平台”特定的JSON文件。或者,您可以使用o[:hostname]
,o[:domain]
或者o[:fqdn]
使用基于主机名,域或fqdn的JSON文件。但是,一旦开始使用支持这种动态配置的服务器支架,您可能会考虑运行Chef Server :-)。
@jtimberman已经写了一个很好的答案。这是我个人调用厨师独奏的方式。这使基础工作正常,您可能需要向其添加更多属性/etc/chef/node.json
并探索其他答案中描述的一些选项。
# cat > /etc/chef/solo.rb << EOF
cookbook_path "/var/chef-solo/cookbooks"
json_attribs "/etc/chef/node.json"
EOF
# cat > /etc/chef/node.json << EOF
{
"run_list": ["recipe[foo]", "recipe[bar]"]
}
EOF
将您的食谱复制到/var/chef-solo/cookbooks
Web服务器上,或将其复制到tar.gz上,然后使用recipe_url
参数。chef-solo
只需在节点上运行即可调用它。
如果可能的话,我会尽量保留所有内容,solo.rb
因为我非常喜欢能够运行Chef-solo,而不必记住任何其他参数。
请注意,现在不建议使用chef-solo,而推荐使用chef-client -z local-mode:
https://github.com/chef/chef-rfc/blob/master/rfc031-replace-solo-with-local-mode.md