Начав с устройства
Joyent , мигрировав на Linode и, наконец, на Amazon со
стеком Bitnami , мы заметили общую боль ручной настройки каждой из этих сред. Bitnami вызвал у нас еще большую головную боль, так как его было очень трудно обновить (apt-get не обновляет стек AMP, упакованный в bitnami). Мы решили получить полный контроль над нашей коробкой, настроив стандартный стек Debian LAMP на AWS, используя Puppet и git для управления нашими сайтами. Вот небольшое введение в то, как мы это сделали.
AWS и развернуть
Настройте экземпляр t1.micro с aws.amazon.com для своего блога. Помните, что если у вас еще нет учетной записи AWS, этот микроэкземпляр бесплатный в течение 12 месяцев! Мы получаем ~ 20KPI в месяц, поэтому микроэкземпляра достаточно, чтобы покрыть это (со значительной настройкой).
Зарегистрируйтесь на unfuddle.com и получите 200 МБ бесплатных частных репозиториев git.
Установить и настроить Puppet автономно
$ apt-get install puppetmaster puppet
$ vi /etc/hosts 127.0.0.1 master.successfulengineering.com ...
$ vi /etc/puppet/puppet.conf ... [agent] server = master.successfulengineering.com
Настройте свое Git-репо
у unfuddle есть хороший справочный документ для этого, но суть состоит в том, чтобы добавить базовый каталог установки puppet на вашем экземпляре в git repo unfuddle:
$ cd /etc/puppet $ git remote add unfuddle [email protected]:successfulengineering/puppetmaster.git $ git config remote.unfuddle.push refs/heads/master:refs/heads/master $ git add * $ git commit -am "initial commit" $ git push unfuddle master
Теперь вы можете клонировать это в вашу локальную среду разработки и начать создавать манифесты! После того, как вы поместите свои локальные изменения в git, выполните git pull на удаленном экземпляре. Чтобы применить обновления манифеста при создании сайта, используйте параметр —test (в противном случае puppet запустится в режиме демона).
$ puppet agent --test
Поздравляем! Теперь у вас есть работающая марионеточная автономная среда с git-репозиторием. Время для настоящей работы.
Базовая среда (L)
Вот как выглядит наш файл node.pp:
node default { include setenv include ntp include users include mysql include apache include php include blogs }
Модуль setenv устанавливает мои пакеты по умолчанию (htop, unzip, wget, git-core, vim, fail2ban), устанавливает vi в качестве редактора по умолчанию и устанавливает языковой стандарт по умолчанию в / etc / default / locale следующим образом:
LANG="en_US.UTF-8" LC_ALL="en_US.UTF8"
NTP должен быть очевиден, а пользовательский модуль гарантирует, что Матиас и мои пользователи существуют с соответствующими ключами SSH и ролями группы администраторов.
Базовые приложения (AMP)
Теперь, когда наша базовая среда Linux настроена, давайте перейдем к разделу «AMP».
Мы настраиваем наш базовый сервер MySQL со следующим манифестом:
class mysql { package { "mysql-server": ensure => present, } service { "mysql": ensure => running, enable => true, hasstatus => true, require => Package["mysql-server"], } file { "/etc/mysql/my.cnf": ensure => present, content => template("mysql/my.cnf.erb"), notify => Service["mysql"], require => Package["mysql-server"], } exec { "set mysql root password": path => "/usr/bin", unless => "mysql -uroot -p${root_mysql_password}", command => "mysqladmin -u root password ${root_mysql_password}", require => Service['mysql'], } }
Переменная $ root_mysql_password объявлена в нашем файле site.pp.
Apache немного сложнее:
class apache { include apache::install include apache::conf include apache::sites include apache::mods }
Для сайтов и модов я определяю собственный метод, который позволяет нам легко включать / отключать новые сайты и необходимые модули. Вот фрагмент из класса apache :: mods:
define mods_stats ( $ensure = 'present') { case $ensure { 'present' : { exec { "/usr/sbin/a2enmod $name": unless => "/bin/sh -c '[ -L /etc/apache2/mods-enabled/$name.load ] \\ && [ /etc/apache2/mods-enabled/${name}.load -ef /etc/apache2/mods-available/${name}.load ]'", notify => Exec["force-reload-apache"], require => Package["apache"], } } 'absent': { exec { "/usr/sbin/a2dismod $name": onlyif => "/bin/sh -c '[ -L /etc/apache2/mods-enabled/${name}.load ] \\ && [ /etc/apache2/mods-enabled/${name}.load -ef /etc/apache2/mods-available/${name}.load ]'", notify => Exec["force-reload-apache"], require => Package["apache"], } } default: { err ( "Unknown ensure value: '$ensure'" ) } } } apache::mods::mods_stats { "rewrite" : ensure => present, notify => Service["apache"], } apache::mods::mods_stats { "deflate" : ensure => present, notify => Service["apache"], }
Хотя определение mods_stats может показаться немного длинным, оно окупается довольно быстро, когда вы можете легко включать / отключать любые моды во всех ваших манифестах.
Модуль PHP — это то же самое, использующий шаблоны марионеток для управления распределением памяти для apc.ini и php.ini. Напишите мне для получения более подробной информации.
WordPress сайты
Таким образом, у нас есть стандартная настройка стека LAMP и инициализация с нашими паролями, модулями и ограничениями памяти Давайте приступим к делу, а именно к модулю блогов.
class blogs { include blogs::agileweboperations include blogs::successfulengineering }
Давайте посмотрим на манифест этого блога:
class blogs::agileweboperations { # Apache website file { "/etc/apache2/sites-available/agileweboperations.com": ensure => present, owner => root, group => root, mode => 644, source => "puppet:///modules/blogs/etc/apache2/sites-available/agileweboperations.com.conf", require => Package["apache"], notify => Service["apache"], } apache::sites::site { "agileweboperations.com" : ensure => present } exec { "setup awo db": path => "/usr/bin", unless => "mysql -uroot -p${root_mysql_password} ${awo_mysql_db}", command => "mysql -uroot -p${root_mysql_password} -e \"\ CREATE DATABASE ${awo_mysql_db} DEFAULT CHARACTER SET UTF8;\"", require => Exec["set mysql root password"], } exec { "setup awo user": path => "/usr/bin", unless => "mysql -u${awo_mysql_user} -p${awo_mysql_pass}", command => "mysql -uroot -p${root_mysql_password} -e \"\ CREATE USER '${awo_mysql_user}'@'localhost' IDENTIFIED BY '${awo_mysql_pass}'; \ GRANT ALL PRIVILEGES ON ${awo_mysql_db}.* TO '${awo_mysql_user}'@'localhost' WITH GRANT OPTION;\"", require => Exec["setup awo db"], } }
Это объединяет все части головоломки: нашу пользовательскую конфигурацию apache, делает сайт простым однострочным и загружает базу данных и пользователя WordPress (только если они не существуют).
Мы не делаем установку WordPress как таковую. Мы работаем над этим сайтом почти четыре года, и у нас он есть в репозитории git (удобно размещается рядом с репозиторием Puppet с unuddle). Все миграции, которые мы выполнили в прошлом, показали, что «знаменитая 5-минутная установка» не может сравниться с легкостью клонирования git.
Создание и нахождение вышеупомянутых манифестов в Интернете заняло у меня около 12 часов общей рабочей нагрузки, но у меня также есть несколько лет опыта работы с куклами. Надеемся, что это руководство даст вам некоторые идеи и советы о том, как получить контроль над вашей средой WordPress с помощью Puppet. Дайте знать, если у вас появятся вопросы!