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

Розгортання 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-master02).

Налаштування DNS
Варіанти налаштування DNS серверів описані у відповідному розділі документації Puppet. В моєму випадку використовується підхід описаний у розділі про Round-Robin DNS. Хоча це не має принципового значення.

Авторизація по ssh з допомогою ключів
aspetrenko, aspetrenko.pub – приватний і публічний ключ адміністратора.
gitolite3, gitolite3.pub – ключі користувача gitolite3. Публічний ключ gitolite3.pub потрібно розмістити в списку авторизованих ключів (~/ssh/authorized_keys) користувача r10k на кожному сервері puppet-master02, щоб користувач 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
HostName sgl-git.example.com
IdentityFile ~/.ssh/aspetrenko
User gitolite3

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

aspetrenko@aspetrenko-pc:~$ mkdir sgl-git
aspetrenko@aspetrenko-pc:~$ cd sgl-git
aspetrenko@aspetrenko-pc:~/sgl-git$ git clone gitolite3@sgl-git: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 наступні рядки:

репо 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
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.