Настройка masterless окружения Puppet в Ubuntu 14.04
Ubuntu | Комментировать запись
В современном мире облачных вычислений управление конфигурацией является очень важным аспектом. Средства управления конфигурациями позволяют надежно развертывать конфигурации на разных серверах. Одним из наиболее выдающихся инструментов управления конфигурациями является 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: Git, Puppet, SSH, Ubuntu 14.04