Быстрый старт с Chefом

Еще несколько лет назад не каждый системный администратор даже слышал о системах управления конфигурациями серверов, а сейчас они уже у каждого на слуху. Cfengine, chef, puppet, bcfg2, Microsoft SCCM – почти каждый согласен что нужно что-то из подобных систем, а после согласия начинается длинный холивар типа linux vs windows на тему какая из них всё-таки лучше.

Сам я долгое время пользовался cfengine и радовался жизни, но пришло время и пришлось выучить и Chef.

Ниже можно прочитать маленький howto на тему как можно быстро начать работать с Chefом

Chef  это система управления конфигурациями от компании Opscode.

Как этот шеф повар работает?

На пальцах: есть сервер на котором хранятся cookbooks – это книги в которых описаны recipy – рецепты, по которым нужно готовить node – это сервера которые нужно настроить, то бишь клиенты. На Chef сервере есть несколько приложений для разных задач. На Chef клиентах крутиться один агент который спрашивает у сервера с определенной периодичностью не появилось ли на сервере новых рецептов для него, и  если появились – то загружает и выполняет их.
Также на Chef сервере есть веб интерфейс для просмотра состояния и управления клиентами.

Основные функциональные части системы управления Chef :

  1. Chef server
  2. Chef node (client)
  3. Chef management station

Все эти части могут быть установлены на один физический сервер, но лучше их разносить согласно предназначению. Например, на сервере можно поднять Chef server и  Chef client, на физическом сервере который нужно настраивать – только Chef client, на машине системного администратора – Chef management station

Chef server  и клиенты для него можно установить и использовать на многих дистрибутивах Linux и даже на Windows, но в моем случае вся система была однородной, т.к. все ставилось на Centos 6.

Chef сервер и клиенты могут быть поставлены разными способами, но для Centos linux самым природным способом будет поставить его из какого  нибудь репозитория, например с rbel .

Вот основные шаги для получения работоспособного сервера:

Инсталляция Chef сервера

Запускаем такие команды:

rpm -Uvh http://rbel.frameos.org/rbel6
yum install -y rubygem-chef-server
/usr/sbin/setup-chef-server.sh

Далее общаемся со скриптом конфигурации и устанавливаем нужные параметры.
После окончания работы скрипта проверяем все ли нужное добавилось в автозапуск и  запустилось:

chkconfig --list | egrep "(chef|rabbitmq)"

Должно быть что-то подобное вот этому:

chef-client 0:off 1:off 2:off 3:off 4:off 5:off 6:off
chef-expander 0:off 1:off 2:on 3:on 4:on 5:on 6:off
chef-server 0:off 1:off 2:on 3:on 4:on 5:on 6:off
chef-server-webui 0:off 1:off 2:on 3:on 4:on 5:on 6:off
chef-solr 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rabbitmq-server 0:off 1:off 2:on 3:on 4:on 5:on 6:off

Что запущено:

ps aux | egrep "(chef|rabbitmq)"
root 4575 0.0 0.3 109960 23528 ? SN May27 0:03 /usr/bin/ruby /usr/bin/chef-expander -d -c /etc/chef/expander.rb -L /var/log/chef/expander.log -P /var/run/chef/expander.pid -n 1 -i 1
 root 4577 2.4 0.4 125256 37812 ? SN May27 68:42 chef-expander worker #1 (vnodes 0-1023)
 chef 4593 0.0 0.7 185792 60540 ? SNl May27 2:06 merb : chef-server (api) : worker (port 4000)
 chef 4621 0.0 0.7 160008 57036 ? SNl May27 0:17 merb : chef-server-webui : worker (port 4040)
 root 4643 0.0 2.1 1553996 167160 ? SNl May27 0:30 java -Xmx256M -Xms256M -Dsolr.data.dir=/var/chef/solr/data -Dsolr.solr.home=/var/chef/solr -jar /var/chef/solr-jetty/start.jar
 root 9314 0.0 0.0 4064 624 pts/2 S+ 01:48 0:00 egrep (chef|rabbitmq)
 rabbitmq 31178 0.0 0.0 10684 420 ? S May25 0:00 /usr/lib64/erlang/erts-5.6.5/bin/epmd -daemon
 rabbitmq 31229 1.1 0.9 1059688 74856 ? Ssl May25 61:30 /usr/lib64/erlang/erts-5.6.5/bin/beam.smp -W w -K true -A30 -P 1048576 -- -root /usr/lib64/erlang -progname erl -- -home /var/lib/rabbitmq -noshell -noinput -sname rabbit@ip-10-72-26-6 -boot /var/lib/rabbitmq/mnesia/rabbit@ip-10-72-26-6-plugins-expand/rabbit -kernel inet_default_listen_options [{nodelay,true}] -kernel inet_default_connect_options [{nodelay,true}] -sasl errlog_type error -kernel error_logger {file,"/var/log/rabbitmq/rabbit@ip-10-72-26-6.log"} -sasl sasl_error_logger {file,"/var/log/rabbitmq/rabbit@ip-10-72-26-6-sasl.log"} -os_mon start_cpu_sup true -os_mon start_disksup false -os_mon start_memsup false -mnesia dir "/var/lib/rabbitmq/mnesia/rabbit@ip-10-72-26-6" -noshell -noinput
 rabbitmq 31293 0.0 0.0 3964 384 ? Ss May25 0:00 /usr/lib64/erlang/lib/os_mon-2.1.8/priv/bin/cpu_sup
 rabbitmq 31296 0.0 0.0 10684 492 ? Ss May25 0:00 inet_gethost 4
 rabbitmq 31297 0.0 0.0 17008 780 ? S May25 0:00 inet_gethost 4

Если всё поднялось то первое что сделаем поменяем пароль по умолчанию на веб интерфейсе сервера. Идем вот сюда браузером: http://chefServerName:4040 и ставим новый пароль (обычно по умолчанию такие логин/пароль: admin/chef321go)

Файерволл для Chef сервера

Нужно настроить фаерволл примерно так как описано ниже, если Вы используете стандартый файерволл:

# Chef
# -- web interface
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 4040 -j ACCEPT
# -- chef-server
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 4000 -j ACCEPT
# -- amqp server
-A RH-Firewall-1-INPUT -m state --state NEW -m multiport -p tcp --dport 5672,4369,50229 -j ACCEPT
# -- search indexes (solr)
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 8983 -j ACCEPT
# data store (couchdb)
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5984 -j ACCEPT

Чтобы проверить все ли нужные порты слушаются на сервере и открыты снаружи можно пользоваться такими командами:

netstat -ant | egrep "(4040|4000|5672|4369|50229|8983|5984)"
nmap YourChefServerFQDN | egrep "(4040|4000|5672|4369|50229|8983|5984)"

 

Инсталляция Chef клиента

Можно поставить Chef клиента несколькими способами:

  • Первый способ – с Chef management station с помощью самописного bootstrap.sh скрипта. Пример такого скрипта можно скачать ниже. Я написал его примерно за часик-полтора, но после этого он мне сильно секономил время. Вы можете легко адаптировать его под свои нужды.
    Считаю что данный скриптик лучше всего подходит для Centos 6, т.к. он ставит и конфигурирует Chef клиента через rpm пакеты что для Centos 6 является более природным путём.
    Если Вы будете пользоваться данным скриптом, то не забудьте положить возле него файлики client.rb and validation.pem.  В client.rb нужно поставить правильный адрес вашего  Chef сервера, а ключик validation.pem можно взять с вашего  Chef сервера в каталоге /etc/chef .
    В скрипте SERVER_NAME это FQDN или IP сервера на который нужно поставить  Chef клиент, а SERVER_NAME_IN_CHEF – то как Вы хотите обозвать новую ноду в системе. Вот как запускается скрипт:
bootstrap.sh -i KEY_NAME -s root@SERVER_NAME -c SERVER_NAME_IN_CHEF
  • Второй способ – с Chef management station через утилиту knife. Считаю что для RedHat подобных или серьезных серверов он не подходит, так как он ставит Chef клиент из исходинков, что может непонятно как сказаться на системе. Плюс это дольше чем через rpm пакеты.
knife bootstrap -i keys.pem -x root -N SERVER_NAME_IN_CHEF -r chefClientService newNodeFQDN
  • Ну и третий способ – ручками на сервере который будет Chef клиентом:
rpm -Uvh http://rbel.frameos.org/rbel6
yum -y install rubygem-chef

Потом копируем в /etc/chef  client.rb и validation.pem файлы  и редактируем  имя ноды в client.rb file.
Запускаем chef-client на ноде, добавляем нужные рецепты на Chef сервере для нового клиента,  и снова запускаем  chef-client на новой ноде.

 

Инсталляция Chef management station

Обычно ставится на машине человека который будет управлять Chef сервером. Для установки запускаем вот такие команды:

rpm -Uvh http://rbel.frameos.org/rbel6
yum -y install rubygem-chef
cd ~
knife configure
mkdir chef-repo

По хорошему: нужно сделать уникального пользователя для управления Chef сервером и сделать для него сертификат в веб интерфейсе Chef сервера , а потом записать этот сертификат в ./shef/userName.pem.
Также нужно validation.pem и webui.pem сертификаты с Chef сервера записать в /etc/chef на  Chef management station.
Еще иногда нужно скопировать  ~/.chef в ~/chef-repo

cp -r ~/.chef ~/chef-repo

Чтобы проверить правильность конфигурации можно выполнить комманду:

knife client list

Вы должны увидеть как минимум три клиента:

userName
chef-validator
chef-webui

Если Вы их не увидели – надо исправлять ошибки которые выскочили. Тут уже надо смотреть на вывод knife, обычно она дает достаточно информации об ошибках.

Вот мой  ~/.chef/knife.rb файл:

 log_level :info
 log_location STDOUT
 node_name 'admin'
 client_key '/root/.chef/admin.pem'
 validation_client_name 'chef-validator'
 validation_key '/etc/chef/validation.pem'
 chef_server_url 'http://CHEF-SERVER-FQDN:4000'
 cache_type 'BasicFile'
 cache_options( :path => '/root/.chef/checksums' )
 cookbook_path "/root/chef-repo/cookbooks"
 role_path "/root/chef-repo/roles"
 cookbook_copyright "oshablovskyy"
 cookbook_email "myEmail@microsoft.com"
 cookbook_license "apachev2"

Конфигурирование с помощью Chef : частые сценарии использования knife

Все действия которые Chef сервер делает на нодах описываются в рецептах кукбуков
Чаще всего мы должны пройти вот такой путь: создаем кукбук, пишем в него рецепт, загружаем этот кукбук на Chef сервер, применяем рецепт из загруженного на сервер кукбука к ноде  (клиенту)

  • Создаем  cookbook с именем chefClientService:
knife cookbook create chefClientService
  • Пишем в него рецепт:
vi  ~/chef-repo/cookbooks/chefClientService/recipes/default.rb

Добавляем в него несколько строчек (этот рецепт описывает сервис chef-client):

service "chef-client" do
 supports :status => true, :restart => true, :reload => true
 action [ :enable, :start ]
end

и сохраняем файл

  • загружаем сделанный кукбук на Chef сервер:
knife cookbook upload chefClientService
  • применяем рецепт к ноде (клиенту):
knife node run_list add NodeName chefClientService
  • убираем рецепт с ноды (клиента):
knife node run_list remove NodeName chefClientService
  • показываем ноды:
knife node list

Заметки

  • Упомянутые в данной статье файлы и скрипты можно скачать тут
  • Основной ресурс о системе управления Chef это Opscode wiki 

 

This entry was posted in Centos, chef, configuration management, Linux and tagged , , , , . Bookmark the permalink.

One Response to Быстрый старт с Chefом

  1. Stas says:

    Очень классная статейка.
    Все легко и просто.
    cookbook_email “myEmail@microsoft.com” – :))

Leave a Reply

Your email address will not be published. Required fields are marked *