Настройка masterless окружения Puppet в Ubuntu 14.04

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

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

Данный сценарий хорошо подходит для маленьких кластеров. В объёмных кластерах модули становятся довольно сложными, а из-за большого количества клиентов сценарий выполняется очень медленно. В таком случае есть два варианта решения:

  • Кластеризация master-сервера Puppet, что позволит обрабатывать высокую нагрузку (для этого, скорее всего, потребуется купить официальную версию Puppet);
  • Переход в режим masterless, то есть отказ от master-сервера Puppet.

Данное руководство рассматривает второй вариант.

В окружении masterless (то есть, без мастер-сервера) каждая нода содержит копии всех модулей Puppet, загруженных через Git. Puppet выполняет обновление конфигураций локально. Недостатком этого метода является то, что каждый сервер загружает все модули, а затем применяет только необходимый модуль. Потому эта настройка – не лучший вариант для работы с конфиденциальной информацией. Тем не менее, masterless окружение очень гибкое и прекрасно работает без необходимости масштабировать инфраструктуру.

Требования

Примечание: Подробные инструкции по работе с Git можно найти в руководстве «Установка Git на Ubuntu 14.04» и других статьях этой серии.

Для работы понадобятся два сервера: сервер Git и клиент Puppet. В руководстве будут использоваться их условные IP-адреса: your_git_server_ip и your_puppet_server_ip соответственно.

Итак, чтобы выполнить руководство, подготовьте:

  • Первый сервер Ubuntu 14.04 с доступом к sudo и ключами SSH.
  • Второй сервер Ubuntu 14.04 с ключами SSH и предустановленным Git Labs.

1: Создание репозитория Git

Для начала создайте репозиторий Git, в котором можно будет хранить модули Puppet.

Откройте интерфейс Git Labs в браузере (http://your_git_server_ip). Создайте аккаунт, заполнив форму New user? Create an account. Вы получите электронное письмо для активации аккаунта, после чего у вас появится доступ к главной странице.

Нажмите зелёную кнопку + New Project на главной странице. Введите puppetв поле Project path и нажмите Create project. Выберите Public в Visibility Level и нажмите зелёную кнопку Create Project.

Скопируйте SSH URL, который появится в верхней части экрана проекта. Он выглядит примерно так:

git@your_git_server_ip:username/puppet.git

2: Добавление SSH-ключа в Git Labs

На сервере Puppet создайте SSH -ключ и добавьте его на сервер Git Labs.

Войдите на сервер Puppet как root (поскольку эти файлы будут принадлежать пользователю root, вам понадобятся права для настройки базового репозитория Git в каталоге Puppet).

Создайте SSH-ключ для пользователя root.

Отключите защиту паролем, потому что этот ключ будет использоваться в сценариях.

ssh-keygen -t rsa

Просмотрите открытый ключ:

cat ~/.ssh/id_rsa.pub

Скопируйте его. Он должен иметь примерно такой вид:

ssh-rsa длинная_строка_цифр root@hostname

Откройте дашборд Git Labs. Кликните Profile settings в верхней панели. В левом меню кликните SSH Keys, затем нажмите зелёную кнопку Add an SSH Key. В поле Title добавьте описание ключа (к примеру, Root Puppet Key), в поле Key добавьте открытый ключ. Затем нажмите Add key.

3: Установка Puppet и Git

Перейдите на сервер Puppet и загрузите пакет Puppet для Ubuntu 14.04.

wget http://apt.puppetlabs.com/puppetlabs-release-trusty.deb

Установите пакет.

dpkg -i /tmp/puppetlabs-release-trusty.deb

Обновите индекс пакетов системы.

apt-get update

Установите Puppet и Git.

apt-get install puppet git-core

Подготовьте окружение Git согласно инструкциям данного руководства.

4: Загрузка начальных настроек Puppet

Теперь можно загрузить в репозиторий начальные настройки Puppet.

Откройте каталог /etc/puppet, в котором хранятся все конфигурационные файлы Puppet.

cd /etc/puppet

Инициируйте git-репозиторий.

git init

Чтобы добавить файлы в текущий каталог:

git add .

Оставьте описательное сообщение о коммите:

git commit -m "Initial commit of Puppet files"

Добавьте созданный ранее проект Git, внеся SSH URL, скопированный в первом разделе руководства.

Загрузите изменения в репозиторий:

git push -u origin master

5: Настройка Puppet

Закройте сессию root и войдите как обычный пользователь с правами sudo.

Для начала нужно отредактировать файл /etc/puppet/puppet.conf. Откройте его в текстовом редакторе:

sudo nano /etc/puppet/puppet.conf

Файл выглядит так:

[main] logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
templatedir=$confdir/templates
[master] # These are needed when the puppetmaster is run by passenger
# and can safely be removed if webrick is used.
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY

Удалите раздел [master], поскольку в данной настройке мастер-сервер использоваться не будет. Затем удалите последнюю строку в разделе [main], которая начинается с templatedir, она устарела. После этого замените строку factpath=$vardir/lib/facter строкой factpath=$confdir/facter. Переменная $confdiris устанавливает каталог /etc/puppet/, в котором хранится репозиторий Puppet.

После все изменений файл puppet.conf должен иметь такой вид:

[main] logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$confdir/facter

6: Добавление модуля Puppet

Итак, программа Puppet настроена, но она не будет работать без модулей и манифестов. Манифесты – это файлы, которые содержат инструкции по работе Puppet.

Попробуйте создать первый модуль, cron-puppet. Этот модуль будет разворачивать Puppet при помощи Git. Он будет устанавливать Git hook, который будет запускать Puppet после удачного выполнения команды git pull и настраивать cron job для запуска команды git pull каждые 30 минут.

Перейдите в каталог modules:

cd /etc/puppet/modules

Создайте каталог cron-puppet, а в нём – каталоги manifests и files.

sudo nano cron-puppet/manifests/init.pp

Скопируйте следующий код в init.pp. Этот файл будет отвечать за загрузку настроек Puppet из репозитория Git.

class cron-puppet {
file { 'post-hook':
ensure  => file,
path    => '/etc/puppet/.git/hooks/post-merge',
source  => 'puppet:///modules/cron-puppet/post-merge',
mode    => 0755,
owner   => root,
group   => root,
}
cron { 'puppet-apply':
ensure  => present,
command => "cd /etc/puppet ; /usr/bin/git pull",
user    => root,
minute  => '*/30',
require => File['post-hook'],
}
}

Сохраните и закройте файл.

Откройте файл post-merge в каталоге files.

sudo nano cron-puppet/files/post-merge

Скопируйте следующий сценарий bash в файл post-merge. Этот сценарий будет запускаться после успешной загрузки настроек Git и вносить результат в лог.

#!/bin/bash -e
## Run Puppet locally using puppet apply
/usr/bin/puppet apply /etc/puppet/manifests/site.pp
## Log status of the Puppet run
if [ $? -eq 0 ] then
/usr/bin/logger -i "Puppet has run successfully" -t "puppet-run"
exit 0
else
/usr/bin/logger -i "Puppet has ran into an error, please run Puppet manually" -t "puppet-run"
exit 1
fi

Сохраните и закройте файл.

Теперь нужно настроить Puppet для запуска этого модуля. Создайте глобальный манифест в /etc/puppet/manifests/site.pp.

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

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

node default {
include cron-puppet
}

Сохраните и закройте файл.

Чтобы обеспечить работу модуля, введите:

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

Команда должна вернуть:


Notice: Finished catalog run in 0.18 seconds

Теперь подтвердите изменения в репозитории Git и создайте сообщение о коммите. Войдите как root (поскольку у этого пользователя есть SSH-ключ для доступа к репозиторию).

Откройте каталог /etc/puppet:

cd /etc/puppet

Добавьте все содержимое каталога в коммит:

git add .

Отправьте коммит:

git commit -m "Added the cron-puppet module"

Отправьте изменения:

git push -u origin master

Заключение

Чтобы добавить больше серверов, просто следуйте разделу 3 (установите Puppet и Git), клонируйте репозиторий Git в каталог /etc/puppet на новый сервер и примените манифест site.pp.

Эту установку можно автоматизировать.

Для этого добавьте SSH-ключ в GitLab и используйте следующий сценарий:

#!/bin/bash -e
## Install Git and Puppet
wget -O /tmp/puppetlabs.deb http://apt.puppetlabs.com/puppetlabs-release-`lsb_release -cs`.deb
dpkg -i /tmp/puppetlabs.deb
apt-get update
apt-get -y install git-core puppet
# Clone the 'puppet' repo
cd /etc
mv puppet/ puppet-bak
git clone http://your_git_server_ip/username/puppet.git /etc/puppet
# Run Puppet initially to set up the auto-deploy mechanism
puppet apply /etc/puppet/manifests/site.pp

Примечание: Замените условные данные в команде своими данными.

Теперь у вас есть готовое к использованию masterless окружения Puppet.

Tags: , , ,

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