调用 chef-solo 的惯用方法是什么?

调用 chef-solo 的惯用方法是什么?

调用 chef-solo 的惯用方法是什么?大多数网站都这样做:

chef-solo -c ~/solo.rb -j ~/node.json -r http://www.example.com/chef-solo.tar.gz

但那太长了。我能想到一些更短的方法:

  1. rake 任务(rake chef-solo)。
  2. 一个小的 shell 脚本 ( run-chef-solo)。
  3. 别名(可以覆盖名称,如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

相关内容