Chef
Chef
Компиляция из разных источников. (см. ссылки)
По-моему довольно сложный в освоении продукт потому я решил вести заметки здесь.
Особого понимания пока нет, как и знаний руби (а судя по всему это ключевое), потому тут возможны неточности, догадки и т.п. Все описаное ниже пробую под разные системы, но в основном под убунту.
Вообще-то у Chef есть несколько путей, клиент-серверный и соло.
Соло - для случаев когда рецепт заливается руками, и просто исполняется локально.
Установка
В /etc/apt/sources.list (добавить свой репозиторий)
deb http://apt.opscode.com/ oneiric-0.10 main universe
sudo aptitude update sudo aptitude show chef
Если установка производится на сервер, то:
sudo aptitude install rubygems ohai chef chef-server chef-server-webui
В этом случае будут установлены все зависимости, созданы все необходимые файлы настроек и запуска при загрузке ОС. Запускается CouchDB и Stompserver (порт 61613). Стартует chef-server в настройках по умолчанию (порт 4000 и 4001), веб-интерфейс (4040), а также демоны chef-solr и клиент.
Установка на клиенте:
sudo aptitude install rubygems ohai chef
В документации особо подчеркнуто, что следует использовать именно aptitude который по умолчанию устанавливает мягкие зависимости. Но версия как видите, запаздывает и мы не получим возможности доступные в актуальном релизе. Поэтому для подготовленного администратора наиболее правильной будет самостоятельная сборка и bootstrap. Минимальное требование к установке Chef — Ruby и Rubygems. В Ubuntu их можно установить из репозитария:
sudo aptitude install ruby ruby1.8-dev libopenssl-ruby1.8 rdoc ri irb build-essential wget ssl-cert libxml-ruby libxml2-dev libxslt-dev
Отмечу что я не пробовал делать самостоятельную сборку пока что
первый запуск - соло
Как уже говорил выше, первым делом пробуем локального клиента. Тут тоже есть свои сложности ...
Конфигурационные файлы
нужно создать 2 файла конфигурации и скачать рецепты (из гита). Я брал крон для теста, что бы ничего не сломать локально.
Файлы конфигурации в моем случае такие: (имена могут быть любые)
solo.rb
cookbook_path "/etc/chef/recipes/cookbooks" log_level :all file_store_path "/etc/chef/recipes/" file_cache_path "/etc/chef/recipes/"
root = File.absolute_path(File.dirname(__FILE__)) file_cache_path root cookbook_path root + '/cookbooks'
solo.json Цитата: solo.json holds a pointer to the recipe(s) we want to run (that’s only one recipe for now). My cookbook is called “op” (for Opinionated Programmer) – you should name yours after your server or your site. У меня рецепт, естественно, другой, cron
{ "run_list": [ "recipe[cron::default]" ] }
Запуск
chef-solo -l debug -c /etc/chef/solo.rb -j /etc/chef/solo.json
Отмечу, что я хотел установить какой-то пакет потому немного изменил рецепт и добавил установку yum (он не был установлен т.к. убунта)
простейший рецепт выглядит вот так: (/etc/chef/recipes/cookbooks/cron/recipes/default.rb)
package "cron" do action :upgrade end package "yum" do action :upgrade end
Полный лог (довольно большой) я вынес на отдельную страницу: http://wiki.sirmax.noname.com.ua/index.php/Chef_Solo_Debug_Log
Без дебага:
chef-solo -c /etc/chef/solo.rb -j /etc/chef/solo.json [Wed, 31 Oct 2012 13:53:31 +0200] INFO: *** Chef 10.16.2 *** [Wed, 31 Oct 2012 13:53:32 +0200] INFO: Setting the run_list to ["recipe[cron::default]"] from JSON [Wed, 31 Oct 2012 13:53:32 +0200] INFO: Run List is [recipe[cron::default]] [Wed, 31 Oct 2012 13:53:32 +0200] INFO: Run List expands to [cron::default] [Wed, 31 Oct 2012 13:53:32 +0200] INFO: Starting Chef Run for mmaxur-pc [Wed, 31 Oct 2012 13:53:32 +0200] INFO: Running start handlers [Wed, 31 Oct 2012 13:53:32 +0200] INFO: Start handlers complete. [Wed, 31 Oct 2012 13:53:32 +0200] INFO: Processing package[cron] action upgrade (cron::default line 20) [Wed, 31 Oct 2012 13:53:32 +0200] INFO: Processing package[yum] action upgrade (cron::default line 24) [Wed, 31 Oct 2012 13:53:41 +0200] INFO: package[yum] upgraded from uninstalled to 3.2.25-1ubuntu2 [Wed, 31 Oct 2012 13:53:41 +0200] INFO: Chef Run complete in 9.234625 seconds [Wed, 31 Oct 2012 13:53:41 +0200] INFO: Running report handlers [Wed, 31 Oct 2012 13:53:41 +0200] INFO: Report handlers complete
После чего наблюдаю установленный yum
Устанавливаем chef-server
Потрясающяя идея поставить сервер используя работающий chef-solo. Я поражен! http://wiki.opscode.com/display/chef/Installing+Chef+Server+using+Chef+Solo
Конфиг
Более или менее полное описание параметров: http://wiki.opscode.com/display/chef/Chef+Configuration+Settings
Мой конфиг такой:
log_level :fatal log_location STDOUT chef_server_url "http://localhost:4000" file_cache_path "/var/cache/chef" sandbox_path "/var/cache/chef/sandboxes" checksum_path "/var/lib/chef/cookbook_index" node_path "/var/lib/chef/node" cookbook_tarball_path "/var/lib/chef/cookbook-tarballs" validation_client_name "chef-validator" web_ui_admin_user_name "admin" web_ui_admin_default_password "admin" supportdir = "/var/lib/chef" solr_jetty_path File.join(supportdir, "solr", "jetty") solr_data_path File.join(supportdir, "solr", "data") solr_home_path File.join(supportdir, "solr", "home") solr_heap_size "256M" solr_url "http://localhost:8983" umask 0022 signing_ca_cert "/etc/chef/certificates/cert.pem" signing_ca_key "/etc/chef/certificates/key.pem" signing_ca_user "chef" signing_ca_group "chef" amqp_host '0.0.0.0' amqp_port '5672' amqp_user 'chef' amqp_pass 'testing' amqp_vhost '/chef' amqp_consumer_id "default"
Обратить внимание на последнюю секцию: обязательно установить пароль на RabbitMQ, как то так: (http://tickets.opscode.com/browse/CHEF-3170)
rabbitmqctl add_vhost /chef rabbitmqctl add_user chef chef rabbitmqctl set_permissions -p /chef chef ".*" ".*" ".*" rabbitmqctl set_permissions -p /chef chef ".*" ".*" ".*" rabbitmqctl change_password chef testing
Мне еще пришлось поправить
DAEMON=/usr/local/bin/chef-*
в /etc/init.d/chef-*
Проблемы после установки (2)
Эта секция относится к установке из пакетов. После того как я установил chef с помошью chef-solo все изменилось. Проблемы есть но другие.
У меня после установки ничего не работало, начинаю исследовать.
Logs:/var/log/chef
solr.log [Wed, 31 Oct 2012 12:04:46 +0200] FATAL: Chef Solr is not installed or solr_home_path, solr_data_path, and solr_jetty_path are misconfigured. [Wed, 31 Oct 2012 12:04:46 +0200] FATAL: Your current configuration is: [Wed, 31 Oct 2012 12:04:46 +0200] FATAL: solr_home_path: /var/chef/solr [Wed, 31 Oct 2012 12:04:46 +0200] FATAL: solr_data_path: /var/chef/solr/data [Wed, 31 Oct 2012 12:04:46 +0200] FATAL: solr_jetty_path: /var/chef/solr-jetty [Wed, 31 Oct 2012 12:04:46 +0200] FATAL: You can install Chef Solr using the chef-solr-installer script.
вопрос - как это установить используя chef-solr-installer
# chef-solr-installer Creating Solr Home Directory mkdir -p /var/chef/solr entering /var/chef/solr tar zxvf /usr/lib/ruby/solr/solr-home.tar.gz /usr/lib/ruby/vendor_ruby/mixlib/shellout.rb:242:in `invalid!': Expected process to exit with [0], but received '2' (Mixlib::ShellOut::ShellCommandFailed) ---- Begin output of tar zxvf /usr/lib/ruby/solr/solr-home.tar.gz ---- STDOUT: STDERR: /usr/lib/ruby/vendor_ruby/mixlib/shellout/unix.rb:213: warning: Insecure world writable dir /var/chef in PATH, mode 040777 tar (child): /usr/lib/ruby/solr/solr-home.tar.gz: Cannot open: No such file or directory tar (child): Error is not recoverable: exiting now tar: Child returned status 2 tar: Error is not recoverable: exiting now ---- End output of tar zxvf /usr/lib/ruby/solr/solr-home.tar.gz ---- Ran tar zxvf /usr/lib/ruby/solr/solr-home.tar.gz returned 2 from /usr/lib/ruby/vendor_ruby/mixlib/shellout.rb:228:in `error!' from /usr/lib/ruby/vendor_ruby/chef/mixin/shell_out.rb:36:in `shell_out!' from /usr/lib/ruby/vendor_ruby/chef/solr/solr_installer.rb:351:in `sh' from /usr/lib/ruby/vendor_ruby/chef/solr/solr_installer.rb:311:in `create_solr_home' from /usr/lib/ruby/vendor_ruby/chef/solr/solr_installer.rb:343:in `chdir' from /usr/lib/ruby/vendor_ruby/chef/solr/solr_installer.rb:343:in `chdir' from /usr/lib/ruby/vendor_ruby/chef/solr/solr_installer.rb:310:in `create_solr_home' from /usr/lib/ruby/vendor_ruby/chef/solr/solr_installer.rb:371:in `indent' from /usr/lib/ruby/vendor_ruby/chef/solr/solr_installer.rb:377:in `group' from /usr/lib/ruby/vendor_ruby/chef/solr/solr_installer.rb:308:in `create_solr_home' from /usr/lib/ruby/vendor_ruby/chef/solr/solr_installer.rb:269:in `run' from /usr/bin/chef-solr-installer:25
1
Создадим локальные копии Git репозитариев Chef и Cookbooks, в последующем мы будем использовать некоторые файлы:
git clone http://github.com/opscode/chef.git git clone http://github.com/opscode/cookbooks.git
Рецепты
$ sudo apt-get install git-core $ git clone git://github.com/opscode/cookbooks.git
Для создании новой Cookboks используется команда “rake new_cookbook”, с указанием ее названия. $ rake new_cookbook COOKBOOK=nginx
Пример рецепта
В результате будет создана вся необходимая структура. Внутри каталога Cookbooks содержится несколько файлов и подкаталогов имеющих определенное назначение. Все тонкости Cookbooks разбирать не будем, именно этот вопрос в документации освещено более менее хорошо. Основной файл называется metadata.rb содержит описание, данные мантайнера, лицензию, список поддерживаемых ОС, зависимости, конфликты и атрибуты. Например:
# список поддерживаемых ОС %w{ ubuntu debian }.each do |os| supports os end # зависимости %w{ build-essential runit }.each do |cb| depends cb end
Даже если вы ни разу не писали в Ruby, смысл должен быть понятен. Параметр %w описывает строковый массив, а свойство .each перебирает элементы этого массива, do-end для каждого элемента выполняет выбранное действие. То есть в первом примере мы «получаем»:
support ubuntu support debian
Поддерживаются все возможные элементы языка Ruby (группы, массивы, сравнения и так далее), например, очень просто можно задать версию дистрибутива — ‘ubuntu’, «>= 8.04″. Далее обычно идут описания атрибутов, которые необходимо сконфигурировать:
attribute "nginx/dir", :display_name => "Nginx Directory", :description => "Location of nginx configuration files", :default => "/etc/nginx" attribute "nginx/worker_connections", :display_name => "Nginx Worker Connections", :description => "Number of connections per worker", :default => "1024"
Пример рецепта для клиента
Для того что бы клиент мог примоединится нужно его прописать (уточнить!) на сервере и дать ему validation.pem итого: Создать ноду:
EDITOR=mcedit knife node create lab1 -u chef-webui
Поредактировать:
EDITOR=mcedit knife node edit lab1 -u chef-webui
У меня - такой конфиг (поставить ntp):
{ "run_list": [ "recipe[ntp]" ], "normal": { "tags": [ ] }, "name": "lab1", "chef_environment": "_default" }
Ссылки
- http://www.tux.in.ua/articles/2678 (есть ошибки, неточности, немного устарело, зато не русском)
- http://www.opinionatedprogrammer.com/2011/06/chef-solo-tutorial-managing-a-single-server-with-chef/
- http://jonathanotto.com/blog/chef-tutorial-in-minutes.html
- http://generalthings.com/2012/05/08/simple-steps-install-chef-ubuntu-12-04-10-04/