Статьи

Настройка LAMP Box с Puppet

В последние недели мы видели, как 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). Имена пакетов и сервисов заимствованы из базовой ОС: в этом нет ничего волшебного (вероятно, это хорошо).