调用 chef-solo 的惯用方法是什么?大多数网站都这样做:
chef-solo -c ~/solo.rb -j ~/node.json -r http://www.example.com/chef-solo.tar.gz
但那太长了。我能想到一些更短的方法:
- rake 任务(
rake chef-solo
)。 - 一个小的 shell 脚本 (
run-chef-solo
)。 - 别名(可以覆盖名称,如
chef-solo
)。
这样做的惯用方法是什么?其他 chef 用户如何调用 chef?
答案1
默认情况下,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]
使用基于主机名、域或 fqdn 的 JSON 文件。但是,一旦您开始拥有支持这种动态配置的服务器框架,您可能会考虑运行 Chef 服务器 :-)。o[:domain]
o[:fqdn]
答案2
@jtimberman 已经写了一个很棒的答案。这是我个人调用 chef-solo 的方式。这可以让基本功能正常工作,您可能需要添加更多属性/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
或将其压缩到网络服务器并使用recipe_url
参数。chef-solo
只需在节点上运行即可调用它。
如果可能的话,我会尝试保留所有内容,solo.rb
因为我非常喜欢能够运行 chef-solo 而不必记住任何额外的参数。
答案3
请注意,chef-solo 现已弃用,取而代之的是 chef-client -z local-mode:
https://github.com/chef/chef-rfc/blob/master/rfc031-replace-solo-with-local-mode.md