Pull to refresh

Развертывание OpenSource Puppet 4 с несколькими Puppet masters. Часть I. Подготовительная

Reading time 8 min
Views 6.8K
Развертывание OpenSource Puppet 4 с несколькими Puppet masters. Часть II. Настройка Puppet Masters
Развертывание OpenSource Puppet 4 с несколькими Puppet masters. Часть III. Настройка puppet-db с помощью Puppet

Предисловие


Мой опыт использования puppet. До написания настоящей статьи, я работал с Open Source Puppet версии 3 в stand alone конфигурации, и использовал его для управления несколькими сотнями хостов. Но пришло время расти: количество управляемых хостов вышло за тысячу, и грозит в ближайшем будущем перевалить за несколько тысяч. Было принято решение для распределения нагрузки и повышения отказоустойчивости развернуть Open Source Puppet версии 4 с несколькими серверами Puppet Master и отдельным сервером PuppetDB с postgresql. А также использовать для хранения окружений с конфигурациями конечных хостов git-репозиторий на git-сервере.

Краткий обзор статей на habrahabr по развертыванию Puppet


Вначале хотел бы предложить краткий обзор уже имеющийся статей на habrahabr.

Настройка современного Puppet сервера с нуля
Перевод статьи «Setup of modern Puppet of the server from scratch» выполненный grundic, оригинал которой мне удалось найти только в кэше гугла. Эта статья была взята мной за основу при подготовке публикации. Детали, описанные в оригинале статьи «Setup of modern Puppet of the server from scratch», как и дополнения переводчика в ее переводе, уже успели немного устареть. Это, а также желание поделиться описанием дополнительных тонкостей, побудило меня к написанию собственной статьи.

Вариант развёртывания Linux систем на базе Puppet 4. Часть III: установка Puppet Server (cfpuppetserver)
Статья является частью цикла, где автор andvgal описывает развертывание целой инфраструктуры. В статье автор предлагает автоматизировать процесс установки puppet с помощью пакета cfpuppetserver, разработанного самим автором статьи. Очень интересно, но сложно для начинающего кукловода.

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

Как стать кукловодом или Puppet для начинающих
Статья хорошо начинается, даются базовые понятия о Puppet. В конце статьи автор Aecktann обещает продолжение, которое, к сожалению, за 4 года так и не появилось.

Puppet, система управления конфигурациями. Статья в двух частях: Часть I, Часть II
Автор spanasik дает базовые понятия о Puppet, а также описывает установку stand alone puppet master без других компонентов.

Введение


Общие сведения о Puppet. Puppet-агенты установлены на управляемых узлах, которые называются нодами (node). Через определенные интервалы времени (по умолчанию 30 минут) puppet-агенты подключаются к серверам Puppet, передают данные о нодах (факты), на которых они установлены; получают от серверов описания конфигураций для управляемых нод, а также необходимые данные и инструменты для настройки конфигураций.

Конфигурации для управляемых нод хранятся на серверах puppet в виде текстовых файлов. Такие файлы называются манифестами. Манифесты объединяются в окружения. Каждое окружение puppet содержит свой набор манифестов. Окружение по умолчанию называется production. Для тестирования обычно используют окружение developmement. Каждый управляемый узел может одновременно находится только в одном окружении.

Окружения, содержащие текстовые файлы с манифестами puppet, принято хранить в git-репозитории, который можно разместить на git-сервере. Каждому окружению будет соответствовать ветка (branch) в git-репозитории.

Для синхронизации окружений на каждом puppet-сервере используется робот R10k, который запускается с помощью post-receive хука в git-репозитории. Подробнее об этом роботе в блоге его создателя.

Данные, передаваемые puppet-агентами на серверы puppet, можно хранить локально на серверах в виде текстовых файлов, или в базе данных PuppetDB. PuppetDB позволяет использовать продвинутые возможности puppet, а также может использоваться в сторонних приложениях.

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

Имена серверов


puppetmaster.example.com – имя кластера.
puppet-master01.example.com – Puppet Master нода 1, также на нем будет работать Certificate Authority Service.
puppet-master02.example.com – Puppet Master нода 2.
Соответственно можно продолжить puppet-masterN.example.com – Puppet Master нода N. Все настройки, сделанные для puppet-master02.example.com подойдут для последующих нод.
puppet-db.example.com – сервер PuppetDB, сервер postgresql.
sgl-git.example.com – git-сервер для хранения git-репозитория, который содержит окружения с манифестами puppet.

Об ОС на серверах


На всех серверах установлена ОС Ubuntu 16.04.

Пользователи


aspetrenko — пользователь-администратор с правами для выполнения sudo (присутсвует на всех серверах).
gitolite3 – пользователь от имени которого работает git-сервер gitolite3 (на сервере sgl-git).
r10k – пользователь от имени которого работает робот r10k (на серверах puppet-master).

Настройка DNS


Варианты настройки DNS серверов описаны в соответствующем разделе документации Puppet. В моем случае используется подход описанный в разделе про Round-Robin DNS. Хотя это не имеет принципиального значения.

Авторизация по ssh с помощью ключей


aspetrenko, aspetrenko.pub – приватный и публичный ключ администратора.
gitolite3, gitolite3.pub – ключи пользователя gitolite3. Публичный ключ gitolite3.pub нужно разместить в списке авторизованных ключей (~/ssh/authorized_keys) пользователя r10k на каждом сервере puppet-master, чтобы пользователь gitolite3 мог авторизоваться и запустить обновление окружений.
r10k, r10k.pub – ключи пользователя r10k. Публичный ключ r10k.pub нужно разместить в административном репозитории gitolite3 (каталог keydir в репозитории gitolite-admin) для того, чтобы робот r10k мог авторизоваться на git-сервере, и забрать окружения из git-репозитория для обновления окружений в локальной файловой системе. Ключи можно создать на любом компьютере, где есть ssh-keygen. Ключи нужно создавать без защиты паролем, чтобы авторизация могла происходить без участия человека. Создадим ключи администратора, и скопируем публичный ключ на sgl-git:

aspetrenko@aspetrenko-pc:~$ ssh-keygen -t rsa -f ~/.ssh/aspetrenko
aspetrenko@aspetrenko-pc:~$ scp ~/.ssh/aspetrenko.pub aspetrenko@sgl-git:/home/aspetrenko/.ssh/

Он будет выполнять роль ключа администратора gitolite3. Создадим пользователя для r10k на серверах puppet-master01 и puppet-master02:

sudo useradd -m -s /bin/bash r10k

И зададим пользователю r10k пароль:

sudo passwd r10k

С паролем будет удобнее в процессе установки. Потом вход по паролю можно будет отключить, и оставить авторизацию только по ключу.

Создадим ключи пользователя r10k на puppet-master01, и скопируем приватный ключ на сервер puppet-master02:

aspetrenko@puppet-master01:~$ sudo su - r10k
r10k@puppet-master01:~$ ssh-keygen -t rsa -f ~/.ssh/r10k
r10k@puppet-master01:~$ scp /home/r10k/.ssh/r10k r10k@puppet-master02:/home/r10k/.ssh/

В процессе установки git-сервера gitolite3, автоматически будет создан пользователь с аналогичным именем gitolite3. Нужно будет добавить публичный ключ этого пользователя в список доверенных ключей пользователя r10k на серверах puppet-master01 и puppet-master02, чтобы gitolite3 мог с помощью post-receive хука в репозитории puppet-environments запустить робота R10k.

Подробнее об автоизации с использованием ключей можно прочитать, например здесь. В итоге должно получиться как на схеме ниже.



Установка и настройка git-сервера


Подробнее о gitolite можно почитать в официальной документации или на хабре.

Установим gitolite3 на sgl-git


Установим git и perl:

aspetrenko@sgl-git:~$ sudo apt install git perl

Запустим установку gitolite из репозитория Ubuntu:

aspetrenko@sgl-git:~$ sudo apt install gitolite3

В процессе установки укажем абсолютный путь к публичному ключу администратора aspetrenko.pub. Если вы ошиблись, то путь к ключу администратора можно указать следующим образом от системного пользователя gitolite3:

aspetrenko@sgl-git:~$ sudo su - gitolite3
gitolite3@sgl-git:~$ $HOME/bin/gitolite setup -pk /home/aspetrenko/.ssh/aspetrenko.pub

Ключ будет сохранен в административном репозитории gitolite-admin в каталоге keydir под именем admin.pub.

Gitolite3 хранит репозитории в своем домашнем каталоге /var/lib/gitolite3/repositories/. Если вы хотите хранить репозитории в другом месте, как я, то можно перенести их следующим образом:
Добавить в файл /etc/gitolite3/gitolite.rc в раздел "%RC = ("

# Custom path for repos
    GL_REPO_BASE => "/media/data/repositories",

И перенести репозитории в новое расположение:

sudo mv /var/lib/gitolite3/repositories /media/data/

Настроим gitolite3


Напрямую редактировать git-репозитории в каталоге /var/lib/gitolite3/repositories нельзя. На компьютере aspetrenko-pc, откуда будем работать с репозиториями на нашем сервере, укажем настройки авторизации по ssh для sgl-git в файле ~/.ssh/config:

host sgl-git.example.com
  HostName sgl-git.example.com
  IdentityFile ~/.ssh/aspetrenko
  User gitolite3

где aspetrenko — приватный ключ администратора. Cклонируем административный репозиторий себе в домашний каталог:

aspetrenko@aspetrenko-pc:~$ mkdir sgl-git
aspetrenko@aspetrenko-pc:~$ cd sgl-git
aspetrenko@aspetrenko-pc:~/sgl-git$ git clone gitolite3@sgl-git.example.com:gitolite-admin

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

aspetrenko@aspetrenko-pc:~/sgl-git/gitolite-admin$ tree
.
├── conf
│   └── gitolite.conf
└── keydir
    └── admin.pub

2 directories, 2 files

Настройки доступа к репозиториям находятся в файле gitolite-admin/conf/gitolite.conf

aspetrenko@aspetrenko-pc:~/sgl-git/gitolite-admin$ cat conf/gitolite.conf 
repo gitolite-admin
    RW+     =   admin

repo testing
    RW+     =   @all

admin – это пользователь, ключ которого был указан при настройке gitolite3:

aspetrenko@aspetrenko-pc:~/sgl-git$ cat gitolite-admin/keydir/admin.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDIFC/2v1S4WvvITHAXCuVle7dLZz0zL7z4dAWXvmMcqCLepfGI1suDBby6PW04tVwHvniAW5B/5HbZ2Fr7zCoeMrhGE5Z76/DBfidhO15CZbAMPOcs3X7aP4aZFK2GfiXCt7/yunP6f3zp3i6KbsZhcSeeUmmkeQFwccJsstVJbj9ciWHrLN/UDHwT5OTBVFKBpRZGM5pT6xzvWaPNN4IRlk5AN4ClrhWf13 aspetrenko@aspetrenko-pc

Поместим публичный ключ пользователя r10k в административный репозиторий gitolite3:

r10k@puppet-master01:~$ scp /home/r10k/.ssh/r10k.pub aspetrenko@aspetrenko-pc:/home/aspetrenko/sgl-git/gitolite-admin/keydir

Добавим ключ r10k.pub в git:

aspetrenko@aspetrenko-pc:~/sgl-git/gitolite-admin$ git add keydir/r10k.pub

Создадим репозиторий для хранения окружений puppet, для этого на aspetrenko-pc добавим в файл gitolite-admin/conf/gitolite.conf следующие строки:

repo puppet-environments
    RW+     =   admin
    R       =   r10k	

Зафиксируем изменения в git:

aspetrenko@aspetrenko-pc:~/sgl-git/gitolite-admin$ git commit -a -m "Add puppet-environments repo"
[master 585326d] Add puppet-environments repo
 1 file changed, 3 insertions(+)

И отправим все это на sgl-git:

aspetrenko@aspetrenko-pc:~/sgl-git/gitolite-admin$ git push
Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 411 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
remote: Initialized empty Git repository in /media/data/repositories/puppet-environments.git/
To gitolite3@sgl-git:gitolite-admin
   7946dea..585326d  master -> master

Gitolite3 с помощью хуков создаст новый пустой репозиторий на sgl-git:

aspetrenko@sgl-git:~$ sudo ls /media/data/repositories/puppet-environments.git
branches  config  gl-conf  HEAD  hooks  info  objects  refs

Не забудьте создать ключи для пользователя gitolite3, и добавить публичный ключ в в список доверенных ключей пользователя r10k на каждом сервере puppet-master01 и puppet-master02:

aspetrenko@sgl-git:~$ sudo su - gitolite3
gitolite3@sgl-git:~$ ssh-keygen -t rsa -f ~/.ssh/gitolite3
gitolite3@sgl-git:~$ ssh-copy-id -i ~/.ssh/gitolite3.pub r10k@puppet-master01
gitolite3@sgl-git:~$ ssh-copy-id -i ~/.ssh/gitolite3.pub r10k@puppet-master02

Приватный ключ gitolite3 должен оказаться в директории /var/lib/gitolite3/.ssh.

Развертывание OpenSource Puppet 4 с несколькими Puppet masters. Часть II. Настройка Puppet Masters
Tags:
Hubs:
+8
Comments 0
Comments Leave a comment

Articles