Назад | Перейти на главную страницу

Идиоматический способ вызвать chef-solo?

Каков идиоматический способ вызвать chef-solo? Большинство сайтов делают это:

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

Но это долго. Я могу придумать несколько более коротких способов сделать это:

  1. Задание грабли (rake chef-solo).
  2. Небольшой сценарий оболочки (run-chef-solo).
  3. Псевдоним (может переопределить имя, например chef-solo).

Какой идиоматический способ сделать это? Как другие пользователи повара вызывают шеф-повара?

По умолчанию, 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] использовать файлы JSON на основе имени хоста, домена или fqdn. Но как только вы начнете создавать строительные леса для поддержки такого рода динамической конфигурации, вы можете подумать о запуске 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 или tar.gz их на веб-сервере и используйте recipe_url параметр. Бег chef-solo на узле - это все, что требуется для его вызова.

Если возможно, я стараюсь держать все в solo.rb так как мне очень нравится иметь возможность работать с шеф-поваром, не запоминая лишних аргументов.

Обратите внимание, что chef-solo теперь устарел и заменен chef-client -z local-mode:

https://github.com/chef/chef-rfc/blob/master/rfc031-replace-solo-with-local-mode.md