В последние недели мы видели, как VirtualBox может создавать пустые виртуальные машины , предоставляемые на аппаратном уровне. Мы также сконфигурировали виртуальный сервер Linux с Vagrant , который может быстро собрать виртуальную машину из шаблона (называемого box).
На этот раз я хочу расширить использование Puppet для обеспечения компьютера (часто виртуального) программным обеспечением: эта задача охватывает установку, настройку и управление службами в течение всего срока службы; но также добавляя учетные записи пользователей или задания cron. В языке Puppet это все о предоставлении ресурсов .
Puppet предлагает декларативный язык для ресурсов: описывая, что должно быть установлено или представлено в файловой системе или запущено, вы получаете Puppet для определения всех необходимых ресурсов, установки пакетов и так далее.
В этом учебнике мы будем использовать Puppet в режиме без сервера, на одной машине. Цель состоит в том, чтобы установить сервер LAMP , обеспечивающий среду, связывающую Apache, PHP 5 и сервер MySQL. Посмотрим, что может сделать Puppet!
Отправная точка
Learning Puppet VM (для загрузки которой требуется одношаговая регистрация ) — это виртуальный экземпляр CentOS Linux, который уже содержит Puppet. Я предлагаю вам использовать эту машину для экспериментов, так как вы всегда можете выбросить ее в случае сбоев (хотя это не так просто сделать с вашей собственной системой). Я работал с версией VirtualBox, но есть и VMware.
Один из шагов перед запуском машины — это настройка сети . Я выбрал мостовой адаптер в настройках VirtualBox, так как это самый простой выбор. Машина получит IP-адрес в той же подсети, что и хост (и вы сможете получить доступ к машине через SSH для копирования и вставки фрагментов манифеста после установки openssh-сервера).
После запуска вам также потребуется настроить правильную клавиатуру, если вы не используете американскую клавиатуру : поместите «it» или ваш национальный код в / etc / sysconfigl / keyboard.
Вы можете войти с помощью пользователя root и пароль марионетки .
Кукольная команда
Утилита командной строки puppet уже установлена. Типы ресурсов, которые нам понадобятся, — файловые, пакетные и служебные, но есть и другие. В файле puppet description -s будет напечатана страница справки для каждого из них.
puppet apply manifest.pp
установит манифест, файл, содержащий описание системы. Вместо непосредственного использования puppet для изменения состояния системы путем записи множества вызовов в файл .sh, мы инвертируем поток и пишем манифест, который мы передаем в puppet каждый раз, когда нам нужно. Применение конфигурации идемпотентно: повторное применение столько раз, сколько вы хотите ( это декларативно .)
Написание манифеста
В манифесте первым шагом является указание набора пакетов wiich yum или dpkg, или текущая утилита установит для вас:
package {'name': ensure => present, }
Эти конфигурации содержат имя пакета в качестве ключа для обращения к ним после определения. Конечные запятые являются необязательными, как в PHP и JavaScript.
Вы также должны определить, какие службы вы хотите запустить сейчас, и при запуске:
service {'httpd': ensure => running, enable => true, }
Ключевой вопрос — это порядок шагов установки. Например, если мы хотим установить или просто перезапустить демон Apache, мы должны сделать это после установки PHP (в противном случае файлы .php не будут интерпретироваться):
require => File['/tmp/test1']
указывает, что файловый ресурс должен быть создан до запуска службы.
before => Service['...']
это обратные отношения. Однако в случае ресурсов службы параметры уведомления и подписки являются более полезными, поскольку они указывают, что служба должна быть перезапущена после присоединенного события (будь то создание файла или другое).
Фактический манифест для стека LAMP
В этом случае мы хотим установить PHP, Apache и сервер MySQL. Я проверил успешность применения этой конфигурации с помощью скрипта phpinfo и запустив ps -A . Этот манифест сильно зависит от имен пакетов CentOS, поэтому вам может потребоваться изменить их имена, если вы хотите использовать другую виртуальную машину.
package {'php': ensure => present, before => File['/etc/php.ini'], } file {'/etc/php.ini': ensure => file, } package {'httpd': ensure => present, } service {'httpd': ensure => running, enable => true, require => Package['httpd'], subscribe => File['/etc/php.ini'], } package {'mysql-server': ensure => 'present', } service {'mysqld': ensure => running, enable => true, require => Package['mysql-server'], }
Выводы
Puppet кажется хорошим инструментом для управления сложной конфигурацией пакетов, сервисов и файлов конфигурации на нескольких машинах, которые необходимо синхронизировать. На самом деле я только поцарапал поверхность того, что он может сделать.
Мне особенно нравится идемпотентность манифестов , которые можно применять несколько раз. Их подход декларативности является мощным и не означает, что их возможности ограничены: вы всегда можете включить exec ресурсы для их расширения.
Одна проблема, которую я отмечаю, заключается в том, что Puppet дает ложное ощущение переносимости нашей конфигурации: хотя вы пишете манифест на более высоком уровне абстракции, чем сценарии bash, манифест не запускается без изменений даже между двумя дистрибутивами Linux (такими как CentOS и Ubuntu). Имена пакетов и сервисов заимствованы из базовой ОС: в этом нет ничего волшебного (вероятно, это хорошо).