1. Введение в Puppet
Системные администраторы часто застревают в ряде повторяющихся задач: обновление пакетов, управление конфигурационными файлами, системными сервисами, задачи cron, добавление новых конфигураций, исправление ошибок и т.д. Эти задачи часто повторяются и неэффективны, и первая реакция на их решение — автоматизировать их, чтобы появлялись пользовательские скрипты. Из-за сложности среды кастомные скрипты и приложения разрабатываются снова и сложно подстраиваются на несколько платформ, а гибкость и функциональность сложно гарантировать, поэтому появились автоматизированные инструменты управления конфигурацией, такие как Puppet.
В мире с открытым исходным кодом существует множество инструментов конфигурации, и некоторые из ключевых продуктов в этой области:
Puppet (http://puppet.reductivelabs.com/): инструмент управления конфигурацией, написанный на Ruby, который использует архитектуру C/S для настройки клиента на декларативном языке. Cfengine (http://www.cfengine.org): Один из первых инструментов конфигурации с открытым исходным кодом, выпущенный в 1993 году, также является C/S архитектурой, обычно используемой в образовательных учреждениях. LCFG(http://www.lcfg.org/): инструмент управления конфигурацией для C/S архитектур, использующий XML для определения конфигураций. Bcfg2: инструмент управления конфигурацией для архитектуры C/S, написанный на Python, который использует спецификации и ответы клиентов для настройки целевого хоста.
Этот документ посвящён описанию того, как использовать Puppet для управления вашим хостом, приложениями, фоновыми программами и различными сервисами.
О Puppet:
1. Для чего используется Puppet?
Puppet — это открытый инструмент управления конфигурацией системы на базе Ruby, который использует архитектуру развертывания C/S. Основным разработчиком является Люк Канис, который следует лицензии GPLv2 по авторским правам. С 1997 года Канис занимается администрированием систем UNIX, и разработка Puppet возникла благодаря этому опыту. Не удовлетворившись доступными инструментами конфигурации, Канис начал разрабатывать их в редуктивной лаборатории с 2001 по 2005 год. Вскоре Reductive Labs выпустила свой флагманский продукт — Puppet.
2. Особенности Pupput
Многие инструменты управления конфигурацией системы работают очень похоже, например, cfengine. Что делает Puppet уникальной?
Синтаксис Puppet позволяет создать отдельный скрипт для создания пользователя на всех целевых хостах. Все целевые узлы по очереди интерпретируют и выполняют модуль, используя синтаксис, применимый к локальной системе. Например, если эта конфигурация выполняется на сервере Red Hat, создайте пользователя с помощью команды useradd; Если эта конфигурация выполняется на хосте FreeBSD, используется команда adduser.
Ещё одна замечательная особенность Puppet — её гибкость. Из-за специфики открытого программного обеспечения вы можете свободно получать исходный код Puppet, а если столкнётесь с проблемами и есть такая возможность, вы можете модифицировать или улучшать код Puppet под свою среду. Кроме того, разработчики сообщества и доноры продолжают расширять возможности Puppet. Большое сообщество разработчиков и пользователей также стремится предоставлять документацию и техническую поддержку для Puppet.
Puppet также легко масштабироваться. Поддержка пользовательских пакетов и специальные конфигурации системной среды можно быстро и легко добавить в установщик Puppet.
3. Рабочий режим куклы
Puppet — это инструмент управления конфигурацией архитектуры C/S, который устанавливает пакет puppet-server (известный как Puppet master) на центральный сервер. Установите клиентское программное обеспечение Puppet (называемое Puppet Client) на целевом хосте, которым нужно управлять. Когда клиент подключается к Puppet Master, конфигурационный файл, определённый на Puppet Master, компилируется и запускается на клиенте. По умолчанию каждый клиент общается с сервером каждые полчаса для подтверждения обновления конфигурационной информации. Если появляется новая конфигурационная информация или изменена, конфигурация будет перекомпилирована и опубликована каждому клиенту для выполнения. Вы также можете активно запускать обновление конфигурационной информации на сервере, чтобы заставить каждого клиента настраивать её. Если информация о конфигурации клиента изменяется, он может получить исходную конфигурацию с сервера для исправления.
Управление конфигурацией: установка и использование марионеток (1)
4. Будущее Puppet
Наконец, Puppet — это молодой инструмент, который всё ещё находится в стадии разработки и развития. Сообщество Puppet быстро растёт, и постоянно внедряются новые идеи, что стимулирует ежедневное представление разработки, обновлений и новых модулей.
2. Конфигурация и установка (установка Puppet 2.6.4 CentOS 5.4):
Настройте репозиторий на сервере марионеток и клиенте: обороты в минуту — UVH http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm [root@puppetmaster ~]# vi /etc/yum.repos.d/epel.repo Добавить к: [эпель-марионетка] имя=Кукла Эпел baseurl=http://tmz.fedorapeople.org/repo/puppet/epel/5/$basearch/ включено=0 gpgcheck=0
Добавьте репозиторий puppet.repo: [root@puppetmaster ~]# vi /etc/yum.repos.d/puppet.repo [кукольные лаборатории] name=Пакеты Puppet Labs baseurl=http://yum.puppetlabs.com/base/ включено=0 gpgcheck=0
Установка кукольника: [root@puppetmaster ~]# yum --enablerepo=epel,epel-puppet install puppet-server
Измените хосты и добавьте следующие две записи: [root@puppetmaster ~]# vi /etc/hosts 192.168.0.10 puppetmaster.leju.com кукла 192.168.0.100 puppetclient.leju.com
Настройка марионетки: [root@puppetmaster ~]# cd /etc/puppet/ [root@puppetmaster марионетка]# vi puppet.conf
[главная] # Каталог журнала кукол. # Значение по умолчанию — '$vardir/log'. logdir = /var/log/puppet
# Где хранятся файлы Puppet PID. # По умолчанию значение — '$vardir/run'. Rundir = /var/run/puppet
# Где хранятся сертификаты SSL. # Значение по умолчанию — '$confdir/ssl'. SSLDIR = $vardir/SSL
[агент] # Файл, в котором марионетка хранит список классов # связанное с полученной конфигурацией. Можно загрузить # отдельный исполняемый файл '''puppet'' с использованием ''--loadclasses'' # вариант. # По умолчанию значение — '$confdir/classes.txt'. classfile = $vardir/classes.txt
# Где puppetd кэширует локальную конфигурацию. An # расширение, указывающее формат кэша, добавляется автоматически. # Значение по умолчанию — '$confdir/localconfig'. localconfig = $vardir/localconfig Server = puppetmaster.leju.com доклад = правда слушать = правда
[мастер] ssl_client_header = SSL_CLIENT_S_DN ssl_client_verify_header = SSL_CLIENT_VERIFY autosign = true Reports = Store
[root@puppetmaster puppet]# vi fileserver.conf [файлы] path /etc/puppet/files разрешить *
[модули] разрешить *
[плагины] разрешить *
[root@puppetmaster марионетка]# mkdir /etc/puppet/files
[root@puppetmaster Puppet]# CD Manifest/ Создайте site.pp, который является конфигурационным файлом записи марионеток: [root@puppetmaster manifests]# vi site.pp Импортировать "modules.pp" импортировать "roles.pp" Импортировать "nodes.pp"
# Общие настройки для стандартных типов Exec { path => "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin" }
filebucket { main: server => "puppetmaster.leju.com" } File { backup => main }
Создайте modules.pp для импорта модулей: [root@puppetmaster manifests]# vi modules.pp Импортный «тест»
Создайте roles.pp для определения ролей сервера: [root@puppetmaster проявляется]# vi roles.pp класс baseclass { Включить тест
}
Создайте nodes.pp для настройки серверных узлов: [root@puppetmaster manifests]# vi nodes.pp узел 'basenode' { включать базовый класс
}
узел 'puppetclient.leju.com' наследует basenode { tag("тест")
}
узел 'puppetmaster.leju.com' наследует базовый узел { tag("тест")
}
[root@puppetmaster манифеста]# CD .. [root@puppetmaster puppet]# mkdir modules Создайте тестовый модуль: [root@puppetmaster модули]# mkdir -p test/manifests/ [root@puppetmaster модули]# mkdir test/files/ [root@puppetmaster модули]# CD-тест/файлы/ [root@puppetmaster файлы]# vi test.txt Тестовая линия! [root@puppetmaster файлы]# CD .. /проявляется/ Создайте тестовый класс для доставки файла клиенту: [root@puppetmaster проявляется]# vi init.pp Классовый тест { File { "/tmp/test.txt": обеспечить => присутствовать, группа => «корень», владелец => «корень», режим => "0644", источник => «puppet:///test/test.txt» }
}
Запуск Кукловода: [root@puppetmaster проявляется]# /etc/init.d/puppetmaster start Убедитесь, что порт 8140 включён.
Установка клиента Puppet: [root@puppetclient ~]# yum --enablerepo="epel,epel-puppet" установить марионетку
Измените хосты и добавьте следующие две записи: [root@puppetclient ~]# vi /etc/hosts 192.168.0.10 puppetmaster.leju.com кукла 192.168.0.100 puppetclient.leju.com
Настройка куклы: [root@puppetclient ~]# cd /etc/puppet/ [root@puppetclient кукла]# vi puppet.conf [главная] # Каталог журнала кукол. # Значение по умолчанию — '$vardir/log'. logdir = /var/log/puppet
# Где хранятся файлы Puppet PID. # По умолчанию значение — '$vardir/run'. Rundir = /var/run/puppet
# Где хранятся сертификаты SSL. # Значение по умолчанию — '$confdir/ssl'. SSLDIR = $vardir/SSL
[агент] # Файл, в котором марионетка хранит список классов # связанное с полученной конфигурацией. Можно загрузить # отдельный исполняемый файл '''puppet'' с использованием ''--loadclasses'' # вариант. # По умолчанию значение — '$confdir/classes.txt'. classfile = $vardir/classes.txt
# Где puppetd кэширует локальную конфигурацию. An # расширение, указывающее формат кэша, добавляется автоматически. # Значение по умолчанию — '$confdir/localconfig'. localconfig = $vardir/localconfig
Server = puppetmaster.leju.com доклад = правда слушать = правда
[root@puppetclient марионетка]# vi namespaceauth.conf [кукольный бегун] Разрешить puppetmaster.leju.com разрешить *.leju.com
[root@puppetclient марионетка]# vi auth.conf Добавить allow * к последней строке ...... Путь / Автор любой разрешить *
[root@puppetclient кукла]# CD Казни марионетку: [root@puppetclient ~]# марионетка --noop --тест --trace --debug Если Puppet Master не устанавливает: autosign=true, это необходимо выполнить в Puppet Master: [root@puppetmaster ~]# Сертификат марионеток -L puppetclient.leju.com [root@puppetmaster ~]# Сертификат куклы -S puppetclient.leju.com Подписывайте puppetclient.leju.com вот так. Затем вернитесь к клиенту для выполнения здесь: [root@puppetclient ~]# марионетка --noop --тест --trace --debug Соедините --noop, конфигурация практически не будет применяться к клиенту, в основном для тестирования, чтобы проверить наличие ошибок в распечатке, и выполнить без ошибок: [root@puppetclient ~]# марионетка --тест --trace --debug
Просмотр документа: [root@puppetclient ~]# ll /tmp/ всего 8 -rw-r--r-- 1 корень 11 фев 25 22:35 test.txt Документ был выпущен.
Также можно протолкнуть на Кукловоде: [root@puppetmaster ~]# Puppet Kick -D --ведущий puppetclient.leju.com Триггер puppetclient.leju.com Получение статуса Статус — это успех puppetclient.leju.com закончил с кодом выхода 0 Завершено Возврат 0 означает, что марионетка на клиенте была успешно активирована.
Установите для марионетки автозапуск: chkconfig --puppet level 2345 on
Модифицировать кукловода, чтобы использовать Passenger Passenger — это расширение Apache 2.x для использования рельсов или реек в Apache. puppetmaster использует WEBrick для предоставления файловых сервисов по умолчанию, если у вас много puppet-клиентов, производительность файловых сервисов Puppetmaster будет низкой, чтобы сделать Puppetmaster более надёжным, поэтому используйте Apache для предоставления файловых сервисов.
Установка: [root@puppetmaster ~]# yum install httpd httpd-devel ruby-devel rubygems Пассажирская версия 2.2.2 RHEL5 работает нормально. Add foreman.repo repository: [root@puppetmaster ~]# vi /etc/yum.repos.d/foreman.repo [Бригадир] name=Репозиторий Foreman stable baseurl=http://yum.theforeman.org/stable gpgcheck=0 включено=1 [root@puppetmaster ~]# yum install rubygem-passenger-2.2.2-1 [root@puppetmaster ~]# rubygem-rack-1.0.1-1 [root@puppetmaster ~]# Passenger-install-apache2-module
Установка SSL-модуля Apache: [root@puppetmaster ~]# yum install mod_ssl
Для настройки приложения Puppet Rack: mkdir -p /etc/puppet/rack/puppetmaster/ mkdir /etc/puppet/rack/puppetmasterd/public /etc/puppet/rack/puppetmasterd/tmp cp /usr/share/puppet/ext/rack/files/apache2.conf /etc/httpd/conf.d/puppetmasterd.conf cp /usr/share/puppet/ext/rack/files/config.ru /etc/puppet/rack/puppetmasterd/ chown puppet /etc/puppet/rack/puppetmasterd/config.ru
[root@puppetmaster ~]# vi /etc/httpd/conf.d/passenger.conf LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.2.2/ext/apache2/mod_passenger.so PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.2.2 ПассажирРубин /usr/bin/ruby Пассажир MaxPoolSize 30 Пассажирский бассейн IdleTime 1500 Пассажир МаксЗапрашивает 1000 ПассажирStatThrottleRate 120 RackAutoDetect выключен RailsAutoDetect Off
[root@puppetmaster ~]# vi /etc/httpd/conf.d/puppetmasterd.conf # Наверное, вам стоит настроить эти настройки ПассажирВысокая производительность включена ПассажирМаксРазмер бассейна 12 Пассажирский бассейн IdleTime 1500 # Пассажир МаксЗапрашивает 1000 ПассажирStatThrottleRate 120 RackAutoDetect выключен RailsAutoDetect Off
Слушай, 8140
<VirtualHost *:8140> SSLEngine on SSLProtocol -ALL +SSLv3 +TLSv1 SSLCipherSuite ВСЕ:! ADH:RC4+RSA:+HIGH:+MEDIUM:-LOW:-SSLv2:-EXP
SSLCertificateFile /var/lib/puppet/ssl/certs/puppetmaster.leju.com.pem SSLCertificateKeyFile /var/lib/puppet/ssl/private_keys/puppetmaster.leju.com.pem SSLCertificateChainFile /var/lib/puppet/ssl/ca/ca_crt.pem SSLCACertificateFile /var/lib/puppet/ssl/ca/ca_crt.pem # Если Apache жалуется на недействительные подписи на CRL, можно попробовать отключить # Проверка CRL, комментируя следующую строку, но это не рекомендуется. SSLCARevocationFile /var/lib/puppet/ssl/ca/ca_crl.pem SSLVerifyClient опционально SSLVerifyDepth 1 SSLOptions +StdEnvVars
# Следующие заголовки клиента позволяют работать с Pound той же конфигурацией. RequestHeader set X-SSL-Subject %{SSL_CLIENT_S_DN}e RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e
DocumentRoot /etc/puppet/rack/puppetmasterd/public/ RackBaseURI / <Каталог /и т.д./куколь/стойка/кукольный мастер/> Опции отсутствуют РазрешитьПереопределить Нет Приказ разрешить, запретить разрешить от всех </Directory> </VirtualHost>
Измените конфигурационный файл puppetmaster, чтобы добавить следующие две строки: [root@puppetmaster ~]# vi /etc/puppet/puppet.conf [мастер] ssl_client_header = SSL_CLIENT_S_DN ssl_client_verify_header = SSL_CLIENT_VERIFY
Модифицировать /etc/sysconfig/puppetmaster: [root@puppetmaster ~]# vi /etc/sysconfig/puppetmaster # Добавьте следующую строку в конце: PUPPETMASTER_EXTRA_OPTS="--хранилище отчетов" Если нужно подчиняться и бригадиру, и кукольному дашборду, добавьте следующую строку: PUPPETMASTER_EXTRA_OPTS="--докладывает магазин, прораб, puppet_dashboard"
Остановите службу кукловода и начните службу апачей: [root@puppetmaster ~]# /etc/init.d/puppetmaster stop [root@puppetmaster ~]# /etc/init.d/httpd start
Загрузка не запускает сервис puppetmaster, загрузка запускает httpd-сервис: [root@puppetmaster ~]# chkconfig --puppetmaster уровня 2345 выключен [root@puppetmaster ~]# chkconfig --level 2345 httpd on
Убедитесь, что порт 8140 включён: [root@puppetmaster ~]# netstat -tunlp |grep 8140 tcp 0 0 :::8140 :::* СЛУШАЙТЕ 9834/httpd
Проверьте на стороне клиента, напечатан ли журнал ошибок: [root@puppetclient ~]# марионетка --тест --trace --debug |