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

Вступление

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

Предпосылки

Перед началом этого урока у вас должна быть работающая установка агента / мастера Puppet. Если у вас его еще нет, следуйте этому руководству:How To Install Puppet To Manage Your Server Infrastructure.

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

Создать новый агентский узел

Создайте новый VPS Ubuntu 14.04 под названием «lamp-1»,add it as a Puppet agent node и подпишите его запрос сертификата на мастере Puppet.

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

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

Ресурсы

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

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 и может облегчить чтение манифестов.

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

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

Вот как форматируется классdefinition:

class example_class {
  ...
  code
  ...
}

Выше определен класс с именем «example_class», и код Puppet будет заключен в фигурные скобки.

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

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

normal class declaration возникает, когда ключевое словоinclude используется в коде Puppet, например:

include example_class

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

resource-like class declaration возникает, когда класс объявляется как ресурс, например:

class { 'example_class': }

Использование объявлений классов, подобных ресурсам, позволяет вам указатьclass parameters, которые переопределяют значения атрибутов класса по умолчанию. Если вы следовали предварительному руководству, вы уже использовали объявление класса, подобное ресурсу (класс «apache»), когда вы использовали модуль PuppetLabs Apache для установки 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 Module Fundamentals.

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

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

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

  • Пакет Apache (apache2) установлен

  • Служба Apache (apache2) работает

  • Установлен пакет MySQL Server (mysql-сервер)

  • MySQL Server service (mysql) работает

  • Установлен пакет PHP5 (php5)

  • Файл тестового PHP-скрипта (info.php)

  • Обновите apt перед установкой пакетов

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

Пример 1: установка LAMP с одним манифестом

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

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

  • exec: для выполнения команд, таких какapt-get

  • package: для установки пакетов через apt

  • service: чтобы убедиться, что служба работает

  • file: чтобы убедиться, что определенные файлы существуют

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

На новом VPSlamp-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 => '',    # phpinfo code
  require => Package['apache2'],        # require 'apache2' package before creating
}

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

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

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

sudo puppet apply --test

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

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

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

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

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

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

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

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

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

sudo vi lamp/manifests/init.pp

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

class lamp {

}

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

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

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

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

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

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

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

node default { }

node 'lamp-1' {

}

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

В блоке узлаlamp-1 добавьте следующий код для использования только что созданного модуля «lamp»:

  include lamp

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

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

sudo puppet agent --test

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

http://lamp_1_public_IP/info.php

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

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

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

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

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

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

На вашем Puppetmaster установите модуль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.

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

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 можно настроить, передав параметры (full documentation here.

Теперь давайте добавим файловый ресурс, который гарантирует, что 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. Source указывает puppet скопировать файл вместо того, чтобы просто указывать содержимое файла. Указанный источникpuppet:///modules/apache/info.php интерпретируется Puppet в/etc/puppet/modules/apache/files/info.php, поэтому мы должны создать исходный файл, чтобы это объявление ресурса работало должным образом.

Сохраните и выйдите изsite.pp.

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

sudo sh -c 'echo "" > /etc/puppet/modules/apache/files/info.php'

В следующий раз, когда ваш узел агента Puppetlamp-1 получит свою конфигурацию от мастера, он оценит основной манифест и применит модуль, определяющий настройку стека 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.

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

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

Удачи!

Related