Поиск по сайту:

Начало работы с Puppet Code: манифесты и модули


Введение

После настройки Puppet в конфигурации агент/мастер вам может понадобиться помощь в написании манифестов и модулей Puppet. Чтобы эффективно использовать Puppet, вы должны понимать, как создаются манифесты и модули. В этом руководстве рассматриваются основы кода Puppet и показано, как создавать манифесты и модули, которые помогут вам начать использовать Puppet для управления серверной средой. Мы покажем три разных способа использования Puppet для настройки стека LAMP на Ubuntu 14.04 VPS.

Предпосылки

Прежде чем приступить к этому руководству, у вас должна быть работающая установка агента/мастера Puppet. Если у вас его еще нет, следуйте этому руководству: Как установить Puppet для управления инфраструктурой вашего сервера.

Вы также должны иметь возможность создать хотя бы один новый VPS, который будет служить узлом агента Puppet, которым будет управлять мастер Puppet.

Создайте новый узел агента

Создайте новый VPS Ubuntu 14.04 под названием «lamp-1», добавьте его в качестве узла агента Puppet и подпишите его запрос сертификата на мастере Puppet.

Основы кукольного кода

Прежде чем приступить к написанию кода Puppet, который будет настраивать наши системы, давайте сделаем шаг назад и рассмотрим некоторые соответствующие термины и концепции Puppet.

Ресурсы

Кукольный код состоит в основном из объявлений ресурсов. Ресурс описывает что-то о состоянии системы, например, должен существовать определенный пользователь или файл или должен быть установлен пакет. Вот пример объявления пользовательского ресурса:

user { 'mitchell':
  ensure     => present,
  uid        => '1000',
  gid        => '1000',
  shell      => '/bin/bash',
  home       => '/home/mitchell'
}

Объявления ресурсов имеют следующий формат:

resource_type { 'resource_name'
  attribute => value
  ...
}

Следовательно, предыдущее объявление ресурса описывает пользовательский ресурс с именем «mitchell» с указанными атрибутами.

Чтобы вывести список всех типов ресурсов по умолчанию, доступных для Puppet, введите следующую команду:

puppet resource --types

В этом руководстве мы рассмотрим еще несколько типов ресурсов.

Манифесты

Кукольные программы называются манифестами. Манифесты состоят из кукольного кода, а их имена файлов имеют расширение .pp. Основной манифест по умолчанию в Puppet, установленный через apt, — это /etc/puppet/manifests/site.pp.

Если вы выполнили обязательное руководство по Puppet, вы уже написали манифест, который создает файл и устанавливает Apache. Мы также напишем еще несколько в этом уроке.

Классы

В Puppet классы — это блоки кода, которые можно вызывать в коде где угодно. Использование классов позволяет повторно использовать код Puppet и может упростить чтение манифестов.

Определение класса

Определение класса — это место, где живет код, составляющий класс. Определение класса делает класс доступным для использования в манифестах, но на самом деле ничего не оценивает.

Вот как форматируется определение класса:

class example_class {
  ...
  code
  ...
}

В приведенном выше примере определен класс с именем «example_class», а код Puppet будет находиться между фигурными скобками.

Декларация класса

Объявление класса происходит, когда класс вызывается в манифесте. Объявление класса указывает Puppet оценить код внутри класса. Объявления классов бывают двух видов: обычные и ресурсоподобные.

Обычное объявление класса происходит, когда ключевое слово include используется в коде Puppet, например:

include example_class

Это заставит Puppet оценить код в example_class.

Объявление класса, подобного ресурсу, происходит, когда класс объявляется как ресурс, например так:

class { 'example_class': }

Использование объявлений классов, подобных ресурсам, позволяет указать параметры класса, которые переопределяют значения атрибутов класса по умолчанию. Если вы следовали предварительному руководству, вы уже использовали объявление класса, похожего на ресурс (класс \apache), когда использовали модуль Apache PuppetLabs для установки Apache на host2:

node 'host2' {
  class { 'apache': }             # use apache module
  apache::vhost { 'example.com':  # define vhost resource
    port    => '80',
    docroot => '/var/www/html'
  }
}

Теперь, когда вы знаете о ресурсах, манифестах и классах, вам захочется узнать о модулях.

Модули

Модуль — это набор манифестов и данных (таких как факты, файлы и шаблоны), которые имеют определенную структуру каталогов. Модули полезны для организации кода Puppet, поскольку они позволяют разделить код на несколько манифестов. Лучшей практикой считается использование модулей для организации почти всех ваших манифестов Puppet.

Чтобы добавить модуль в Puppet, поместите его в каталог /etc/puppet/modules.

Мы рассмотрим детали, необходимые для написания вашего собственного базового модуля. Если вы хотите узнать больше, ознакомьтесь со справочным руководством по основам модуля PuppetLabs.

Разработка манифеста

Чтобы продемонстрировать, как писать манифесты, классы и модули Puppet, мы будем использовать Puppet для настройки стека LAMP в Ubuntu (аналогично настройке в этом руководстве). Если вы никогда раньше не настраивали стек LAMP, вам следует просмотреть связанное руководство, чтобы ознакомиться с тем, как настроить его вручную.

Из руководства по стеку LAMP мы знаем, что нам нужен сервер Ubuntu 14.04 со следующими ресурсами:

  • Пакет Apache (apache2) установлен
  • Служба Apache (apache2) работает
  • Установлен пакет MySQL Server (mysql-server)
  • Служба MySQL Server (mysql) работает
  • Пакет PHP5 (php5) установлен
  • Тестовый файл сценария PHP (info.php)
  • Обновите apt перед установкой пакетов

В следующих трех разделах будут показаны различные способы использования Puppet для достижения аналогичных результатов, работающий сервер LAMP. В первом примере показано, как написать базовый манифест, который находится в одном файле. Во втором примере показано, как создать и использовать класс и модуль на основе манифеста, разработанного в первом примере. Наконец, в третьем примере показано, как использовать уже существующие общедоступные модули для быстрой и простой настройки аналогичного стека LAMP. Если вы хотите попробовать все три примера, в учебных целях мы рекомендуем каждый раз начинать с нового VPS (как описано в предварительных требованиях).

Пример 1. Установка LAMP с помощью одного манифеста

Если вы никогда раньше не писали манифест Puppet, этот пример — хорошее место для начала. Манифест будет разработан на узле агента Puppet и выполнен с помощью puppet apply, поэтому установка агента/мастера не требуется.

Вы узнаете, как написать манифест, который будет использовать следующие типы объявлений ресурсов:

  • exec: для выполнения команд, таких как apt-get
  • package: для установки пакетов через apt
  • служба: чтобы убедиться, что служба запущена.
  • файл: чтобы убедиться, что определенные файлы существуют

Создать манифест

На новом VPS lamp-1 создайте новый манифест:

sudo vi /etc/puppet/manifests/lamp.pp

Добавьте следующие строки, чтобы объявить ресурсы, которые, как мы только что определили, нам нужны. Встроенные комментарии детализируют каждое объявление ресурса:

# execute 'apt-get update'
exec { 'apt-update':                    # exec resource named 'apt-update'
  command => '/usr/bin/apt-get update'  # command this resource will run
}

# install apache2 package
package { 'apache2':
  require => Exec['apt-update'],        # require 'apt-update' before installing
  ensure => installed,
}

# ensure apache2 service is running
service { 'apache2':
  ensure => running,
}

# install mysql-server package
package { 'mysql-server':
  require => Exec['apt-update'],        # require 'apt-update' before installing
  ensure => installed,
}

# ensure mysql service is running
service { 'mysql':
  ensure => running,
}

# install php5 package
package { 'php5':
  require => Exec['apt-update'],        # require 'apt-update' before installing
  ensure => installed,
}

# ensure info.php file exists
file { '/var/www/html/info.php':
  ensure => file,
  content => '<?php  phpinfo(); ?>',    # phpinfo code
  require => Package['apache2'],        # require 'apache2' package before creating
} 

Сохранить и выйти.

Применить манифест

Теперь вы захотите использовать команду puppet apply для выполнения манифеста. На lamp-1 выполните следующее:

sudo puppet apply --test

Вы увидите много строк вывода, которые показывают, как меняется состояние вашего сервера, чтобы соответствовать объявлениям ресурсов в вашем манифесте. Если ошибок не было, вы сможете посетить общедоступный IP-адрес (или доменное имя, если вы его настроили) и увидеть страницу информации о PHP, которая указывает, что Apache и PHP работают. Вы также можете убедиться, что MySQL установлен на вашем сервере (он не защищен, но мы пока не будем об этом беспокоиться). Поздравляю! Вы настраиваете стек LAMP с помощью Puppet.

Эта конкретная настройка не слишком захватывающая, потому что мы не воспользовались преимуществами нашей настройки агента/мастера. В настоящее время манифест недоступен для других узлов агента, и Puppet не проверяет постоянно (каждые 30 минут), находится ли наш сервер в состоянии, описанном в манифесте.

Теперь мы хотим преобразовать манифест, который мы только что разработали, в модуль, чтобы его могли использовать другие ваши узлы Puppet.

Пример 2. Установите LAMP, создав новый модуль

Теперь давайте создадим базовый модуль на основе манифеста LAMP, разработанного в примере 1. На этот раз мы сделаем это на узле master Puppet. Чтобы создать модуль, вы должны создать каталог (имя которого соответствует имени вашего модуля) в каталоге modules Puppet, и он должен содержать каталог с именем manifests, и этот каталог должен содержат файл init.pp. Файл init.pp должен содержать только класс Puppet, имя которого соответствует имени модуля.

Создать модуль

На master Puppet создайте структуру каталогов для модуля с именем lamp:

cd /etc/puppet/modules
sudo mkdir -p lamp/manifests

Теперь создайте и отредактируйте файл init.pp вашего модуля:

sudo vi lamp/manifests/init.pp

В этом файле добавьте блок для класса с именем «лампа», добавив следующие строки:

class lamp {

}

Скопируйте содержимое манифеста LAMP, которое вы создали ранее (или скопируйте его из примера 1 выше), и вставьте его в блок класса lamp. В этом файле вы создали определение класса для класса «лампа». В настоящее время код внутри класса не будет оцениваться, но он доступен для объявления. Кроме того, поскольку он соответствует соглашениям Puppet по определению модуль, к этому классу можно обращаться как к модулю из других манифестов.

Сохранить и выйти.

Использовать модуль в основном манифесте

Теперь, когда у нас настроен базовый модуль лампы, давайте настроим наш основной манифест, чтобы использовать его для установки стека LAMP на lamp-1.

В мастере Puppet отредактируйте основной манифест:

sudo vi /etc/puppet/manifests/site.pp

Предполагая, что файл пуст, добавьте следующие блоки node (замените \lamp-1 именем хоста агента Puppet, на который вы хотите установить LAMP):

node default { }

node 'lamp-1' {

}

Блок узла позволяет указать код Puppet, который будет применяться только к определенным узлам агента. Узел по умолчанию применяется к каждому узлу агента, для которого не указан блок узла — мы оставим его пустым. Блок узла lamp-1 будет применяться к вашему узлу агента lamp-1 Puppet.

В блок узла lamp-1 добавьте следующий код, чтобы использовать только что созданный модуль \lamp:

  include lamp

Теперь сохраните и выйдите.

В следующий раз, когда ваш узел агента lamp-1 Puppet получит свою конфигурацию от мастера, он оценит основной манифест и применит модуль, определяющий настройку стека LAMP. Если вы хотите попробовать его немедленно, выполните следующую команду на узле агента lamp-1:

sudo puppet agent --test

После завершения вы увидите, что базовый стек LAMP настроен точно так же, как в примере 1. Чтобы убедиться, что Apache и PHP работают, перейдите на общедоступный IP-адрес lamp-1 в веб-браузер:

http://lamp_1_public_IP/info.php

Вы должны увидеть информационную страницу для вашей установки PHP.

Обратите внимание, что вы можете повторно использовать созданный вами модуль «лампы», объявив его в других блоках узлов. Использование модулей — лучший способ способствовать повторному использованию кода Puppet, и это полезно для логической организации вашего кода.

Теперь мы покажем вам, как использовать уже существующие модули для достижения аналогичной настройки.

Пример 3: установка LAMP с уже существующими модулями

В Puppet Forge есть репозиторий общедоступных модулей, которые могут быть полезны при разработке собственной инфраструктуры. Модули Puppet Forge можно быстро установить с помощью встроенной команды puppet module. Так уж получилось, что модули для установки и обслуживания Apache и MySQL доступны здесь. Мы покажем, как их можно использовать для настройки нашего стека LAMP.

Установите модули Apache и MySQL

На master Puppet установите модуль puppetlabs-apache:

sudo puppet module install puppetlabs-apache

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

Notice: Preparing to install into /etc/puppetlabs/puppet/modules ...
Notice: Downloading from https://forgeapi.puppetlabs.com ...
Notice: Installing -- do not interrupt ...
/etc/puppet/modules
└─┬ puppetlabs-apache (v1.0.1)
  ├── puppetlabs-concat (v1.0.0) [/etc/puppet/modules]
  └── puppetlabs-stdlib (v3.2.0) [/etc/puppet/modules]

Также установите модуль puppetlabs-mysql:

sudo puppet module install puppetlabs-mysql

Теперь модули apache и mysql доступны для использования!

Изменить основной манифест

Теперь давайте отредактируем наш основной манифест, чтобы он использовал новые модули для установки нашего стека LAMP.

В мастере Puppet отредактируйте основной манифест:

sudo vi /etc/puppet/manifests/site.pp

Предполагая, что файл пуст, добавьте следующие блоки узла (если вы следовали примеру 2, просто удалите содержимое блока узла lamp-1):

node default { }

node 'lamp-1' {

}

В блоке узла lamp-1 используйте объявление класса, похожего на ресурс, для использования модуля apache (встроенные комментарии поясняют каждую строку):

  class { 'apache':                # use the "apache" module
    default_vhost => false,        # don't use the default vhost
    default_mods => false,         # don't load default mods
    mpm_module => 'prefork',        # use the "prefork" mpm_module
  }
   include apache::mod::php        # include mod php
   apache::vhost { 'example.com':  # create a vhost called "example.com"
    port    => '80',               # use port 80
    docroot => '/var/www/html',     # set the docroot to the /var/www/html
  }

Модулю apache можно передать параметры, которые переопределяют поведение модуля по умолчанию. Мы передаем некоторые базовые настройки, которые отключают виртуальный хост по умолчанию, создаваемый модулем, и убеждаемся, что мы создаем виртуальный хост, который может использовать PHP. Полную документацию по модулю PuppetLabs-Apache см. в файле readme.

Использование модуля MySQL похоже на использование модуля Apache. Мы не будем усложнять, так как на данный момент мы фактически не используем базу данных. Добавьте следующие строки в блок узла:

  class { 'mysql::server':
    root_password => 'password',
  }

Как и модуль Apache, модуль MySQL можно настроить, передав параметры (полная документация здесь.

Теперь давайте добавим файловый ресурс, который гарантирует, что info.php будет скопирован в нужное место. На этот раз мы будем использовать параметр source, чтобы указать файл для копирования. Добавьте следующие строки в блок узла:

  file { 'info.php':                                # file resource name
    path => '/var/www/html/info.php',               # destination path
    ensure => file,
    require => Class['apache'],                     # require apache class be used
    source => 'puppet:///modules/apache/info.php',  # specify location of file to be copied
  }

Это объявление файлового ресурса немного отличается от предыдущего. Основное отличие состоит в том, что мы указываем параметр source вместо параметра content. Источник указывает puppet скопировать файл вместо простого указания содержимого файла. Указанный источник, puppet:///modules/apache/info.php, интерпретируется Puppet в /etc/puppet/modules/apache/files/info.php, поэтому мы должны создать исходный файл, чтобы это объявление ресурса работало правильно.

Сохраните и закройте site.pp.

Создайте файл info.php с помощью следующей команды:

sudo sh -c 'echo "<?php  phpinfo(); ?>" > /etc/puppet/modules/apache/files/info.php'

В следующий раз, когда ваш узел агента lamp-1 Puppet получит свою конфигурацию от мастера, он оценит основной манифест и применит модуль, определяющий настройку стека LAMP. Если вы хотите попробовать его немедленно, выполните следующую команду на узле агента lamp-1:

sudo puppet agent --test

После завершения вы увидите, что базовый стек LAMP настроен точно так же, как в примере 1. Чтобы убедиться, что Apache и PHP работают, перейдите на общедоступный IP-адрес lamp-1 в веб-браузер:

http://lamp_1_public_IP/info.php

Вы должны увидеть информационную страницу для вашей установки PHP.

Заключение

Поздравляем! Вы использовали Puppet для настройки стека Ubuntu 14.04 LAMP.

Теперь, когда вы знакомы с основами кода Puppet и можете писать базовые манифесты и модули, вам следует попробовать использовать Puppet для настройки других аспектов вашей среды.

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

Удачи!