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

Вступление

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

Предпосылки

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

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

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

Создайте новый VPS Ubuntu 14.04 под названием «lamp-1», добавьте его как узел агента Puppet и подпишите его запрос сертификата на Master 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 для оценки кода внутри класса. Объявление класса происходит в двух разных вариантах: нормальном и ресурсоподобном.

Объявление нормального класса происходит, когда 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 stack мы знаем, что нам нужен сервер 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 apply, поэтому настройка агента / мастера не требуется.

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

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

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

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

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команду для выполнения манифеста. На лампе-1 запустите:

sudo puppet apply --test

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

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

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

Пример 2. Установка LAMP путем создания нового модуля

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

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

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

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

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

sudo vi lamp/manifests/init.pp

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

class lamp {

}

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

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

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

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

На кукольного мастера , редактировать главный манифест:

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

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

node default { }

node 'lamp-1' {

}

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

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

  include lamp

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

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

sudo puppet agent --test

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

http://lamp_1_public_IP/info.php

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

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

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

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

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

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

На вашем кукольного мастера , установите 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, просто удалите содержимое блока узла лампы-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
  }

Апач модуль можно передать параметры , которые отменяют поведение по умолчанию модуля. Мы передаем некоторые базовые настройки, которые отключают виртуальный хост по умолчанию, который создает модуль, и убедитесь, что мы создали виртуальный хост, который может использовать PHP. 

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

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

Как и модуль Apache, модуль MySQL может быть настроен путем передачи параметров 

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

  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
  }

Это объявление ресурса файла немного отличается от предыдущего. Основное отличие состоит в том, что мы указываем параметр источника вместо параметра content . Источник сообщает марионетке копировать файл, а не просто указывать содержимое файла. Указанный источник 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'

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

sudo puppet agent --test

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

http://lamp_1_public_IP/info.php

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

Заключение

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

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

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

Удачи!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *