Розгортання OpenSource Puppet 4 з кількома Puppet masters. Частина II. Налаштування Puppet Masters

Розгортання OpenSource Puppet 4 з кількома Puppet masters. Частина I. Підготовча
Розгортання OpenSource Puppet 4 з кількома Puppet masters. Частина III. Налаштування puppet-db з допомогою Puppet

Налаштування серверів puppet
Загальні налаштування серверів. На серверах puppet-master01, puppet-master02 і на puppet-db додамо репозиторії puppetlabs:

wget https://apt.puppetlabs.com/puppetlabs-release-pc1-xenial.deb
sudo dpkg -i puppetlabs-release-pc1-xenial.deb
update sudo apt

На серверах puppet-master01, puppet-master02 встановимо puppet-сервер:

sudo apt install puppetserver

Перевіримо адреса, порт і вимога авторизації в файлі /etc/puppetlabs/puppetserver/conf.d/webserver.conf, за замовчуванням має бути:

client-auth: want
ssl-host: 0.0.0.0
ssl-port: 8140

На сервері puppet-db досить puppet-агента:

sudo apt install puppet-agent

Інше на puppet-db встановимо з допомогою Puppet.

Загальні налаштування puppet-агентів
У файл /etc/puppetlabs/puppet/puppet.conf додати налаштування сервера сертифікації та ім'я сервера puppet, до якого вони будуть звертатися (ім'я кластера):

[main]
server = puppetmaster.example.com
ca_server = puppet-master01.example.com

Також ці налаштування необхідно буде зробити для всіх puppet-агентів на всіх керованих вузлах, в т. ч. на puppet-db.

Налаштування ноди puppet-master01
Сервер сертифікації повинен бути запущений в єдиному екземплярі. Переконаємося, що у файлі /etc/puppetlabs/puppetserver/services.d/ca.cfg включений запуск сервісу сертифікації:

puppetlabs.services.ca.certificate-authority-service/certificate-authority-service

Рядок НЕ повинна бути закоментований.

Налаштуємо список імен DNS сервера


У файлі /etc/puppetlabs/puppet/puppet.conf потрібно прописати альтернативні імена DNS для puppet-master01, для цього в секцію [main] додамо:

dns_alt_names = puppet-master01,puppet-master01.example.com,puppetmaster,puppetmaster.example.com

Далі ці імена будуть збережені в сертифікаті сервера.

Згенеруємо сертифікат для puppet-master01 з урахуванням альтернативних імен DNS:

aspetrenko@puppet-master01:~$ sudo -i puppet cert generate puppet-master01.example.com --dns_alt_names=puppet-master01,puppet-master01.example.com,puppetmaster,puppetmaster.example.com
Notice: puppet-master01.example.com.pem has a waiting certificate request
Notice: Signed certificate request for puppet-master01.example.com.pem
Notice: Removing file Puppet::SSL::CertificateRequest puppet-master01.example.com.pem at '/etc/puppetlabs/puppet/ssl/ca/requests/puppet-master01.example.com.pem.pem'
Notice: Removing file Puppet::SSL::CertificateRequest puppet-master01.example.com.pem at '/etc/puppetlabs/puppet/ssl/certificate_requests/puppet-master01.example.com.pem.pem'

Запустимо puppet-сервер на puppet-master01:

sudo systemctl start puppetserver.service

Налаштування ноди puppet-master02
На інших серверах puppet-master, крім першого, потрібно відключити запуск сервісу сертифікації в файлі /etc/puppetlabs/puppetserver/services.d/ca.cfg. Потрібно закоментувати рядок з certificate-authority-service, і розкоментувати sertificate-authority-disabled-service:

# To enable the CA service, leave the following line uncommented
#puppetlabs.services.ca.certificate-authority-service/certificate-authority-service
# To disable the CA service, comment out the above line and uncomment below the line
puppetlabs.services.ca.certificate-authority-disabled-service/certificate-authority-disabled-service

Налаштуємо список імен DNS сервера в файлі /etc/puppetlabs/puppet/puppet.conf, для цього в секцію [main] додамо:

dns_alt_names = puppet-master02,puppet-master02.example.com,puppetmaster,puppetmaster.example.com

Запитаємо сертифікат для puppet-master02 у puppet-master01:

aspetrenko@puppet-master02:~$ sudo -i puppet agent --test --waitforcert 60
Info: Creating a new key for SSL puppet-master02.example.com
Info: Caching certificate for ca
Info: csr_attributes file loading from /etc/puppetlabs/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for puppet-master02.example.com
Info: Certificate Request fingerprint (SHA256): 16:67:D9:84:A3:50:B6:43:35:08:FE:BA:05:77:7C:C5:E7:3E:A5:D6:D1:00:BE:11:63:AB:6E:93:B7:37:0A:33
Info: Caching certificate for ca
Info: Caching certificate for puppet-master02.example.com
Info: Caching certificate_revocation_list for ca

Підтвердимо запит сертифіката від агента puppet-master02 на сервері puppet-master01:

aspetrenko@puppet-master01:~$ sudo -i puppet cert sign puppet-master02.example.com --allow-dns-alt-names
Signing Certificate Request for:
"puppet-master02.example.com" (SHA256) 16:67:D9:84:A3:50:B6:43:35:08:FE:BA:05:77:7C:C5:E7:3E:A5:D6:D1:00:BE:11:63:AB:6E:93:B7:37:0A:33 (alt names: "DNS:puppet-master02", "DNS:puppet-master02.example.com", "DNS:puppetmaster", "DNS:puppetmaster.example.com")
**
Notice: Signed certificate request for puppet-master02.example.com
Notice: Removing file Puppet::SSL::CertificateRequest puppet-master02.example.com at '/etc/puppetlabs/puppet/ssl/ca/requests/puppet-master02.example.com.pem'

Отримаємо відповідь агента на puppet-master02:

Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for puppet-master02.example.com
Info: Applying configuration version '1477917008'
Info: Creating state file /opt/puppetlabs/puppet/cache/state/state.yaml
Notice: Applied catalog 0.02 in seconds

На puppet-master01 в списку сертифікатів повинно вийти щось на зразок цього:

aspetrenko@puppet-master01:~$ sudo -i puppet cert list -a
+ "puppet-master01.example.com" (SHA256) 1A:15:76:96:33:6E:F9:DA:9F:C3:8D:9E:FC:98:BA:FB:10:CF:FA:27:54:2C:F2:55:8D:B9:AA:6C:52:FA:9F:C1 (alt names: "DNS:puppet-master01", "DNS:puppet-master01.example.com", "DNS:puppetmaster", "DNS:puppetmaster.example.com")
+ "puppet-master02.example.com" (SHA256) 80:1B:2C:49:E3:16:C6:37:B5:FC:E2:40:6B:49:B8:9A:95:91:C1:76:9C:79:3D:D5:0A:81:29:1D:E6:C3:B6:52 (alt names: "DNS:puppet-master02", "DNS:puppet-master02.example.com", "DNS:puppetmaster", "DNS:puppetmaster.example.com")

УВАГА! Не забудьте скопіювати сертифіката центру сертифікації /etc/puppetlabs/puppet/ssl/ca/ca_crl.pem з puppet-master01 на puppet-master02 в теж розташування із збереженням власника і прав.

Запустимо puppet-сервер на puppet-master02:

sudo systemctl start puppetserver.service


Установка r10k на сервери puppet-master01 і puppet-master02
Документація про налаштування r10kdocs.puppet.com/pe/latest/r10k.html
puppet.com/blog/git-workflows-puppet-and-r10k

На всіх серверах puppet-master встановимо git і rubygems:

sudo apt install git rubygems
sudo gem install r10k

Помістимо користувача r10k в групу puppet:

sudo usermod -a -G puppet r10k

Створимо каталог для кеша репозиторію і дамо на нього права користувача r10k і групі puppet:

sudo mkdir -p /var/cache/r10k
sudo chown -R r10k:puppet /var/cache/r10k
sudo chmod 2775 /var/cache/r10k

Створимо каталог з налаштуваннями r10k:

sudo mkdir -p /etc/puppetlabs/r10k
sudo chown -R puppet:puppet /etc/puppetlabs
sudo chmod -R g+w /etc/puppetlabs

Також на кожному сервері puppet-master потрібно створити конфігураційний файл /etc/puppetlabs/r10k/r10k.yaml. Його вміст буде залежати від того, якого провайдера ви будете використовувати для роботи з git-репозиторієм.

Shellgit-провайдер
Цей провайдер доступний за замовчуванням, і підійде в тих випадках, якщо ви збираєтеся використовувати git-репозиторій в локальному каталозі без git-сервера; або найпростіший git-сервер з доступом по ssh.

Вміст конфиуграционного файлу /etc/puppetlabs/r10k/r10k.yaml:

# location for cached repos
:cachedir: '/var/cache/r10k'

git:
provider: 'shellgit'

# git repositories containing environments
:sources:
:base:
remote: 'gitolite3@sgl-git.example.com:puppet-environments' # Для доступу до сховища в gitolite3
# remote: '/srv/puppet.git' # Для доступу до shared репозиторія в локальному каталозі
# remote: 'ssh://aspetrenko@puppet-master01/srv/puppet.git' # Для доступу за допомогою ssh до дерева файлової системи на іншому комп'ютері
basedir: '/etc/puppetlabs/code/environments/'

Shellgit provider не вміє брати ім'я користувача з конфігураційного файлу r10k.yaml, тому для доступу до сховища на gitolite з потрібним ключем задамо параметри в /r10k/.ssh/config:

host sgl-git.example.com
HostName sgl-git.example.com
IdentityFile /home/r10k/.ssh/r10k
User gitolite3

Rugged-провайдер
Але краще використовувати rugged provider, тоді для кожного джерела в r10k.yaml можна буде вказати окремий ключ і ім'я користувача. Також можна буде працювати з репозиторіями по https-протоколу.

В Ubuntu для роботи з ssh та протоколами https в rugged режимі необхідно скомпілювати бібліотеку libssh2 з підтримкою openssl замість libgcrypt:
libssh2 on Debian and Ubuntu is compiled against libgcrypto instead of OpenSSL due to licensing reasons, and unfortunately libgcrypto does not support a number of required operations, including reading from a private key file. You will need to either use shellgit or recompile your own libssh2-1 package to use OpenSSL on these distributions.
Бібліотека libssh2 версії 1.5.0-2.dsc з xenial не підійде:
The error sources to libssh2/src/libgcrypt.c. Elsewhere, libssh2 v 1.6.0 works without complaint. If updating isn't available, as a обхідний шлях, use https instead of ssh to connect to private git repos.
Доведеться зробити бэкпорт з yakkety. Встановимо необхідні пакети на puppet-master01:

sudo apt make install cmake pkg-config libssh2-1-dev ruby-dev rubygems libevent-pthreads-2.0-5 openssl libssl-dev libz-dev libhttp-parser-dev

sudo apt install debhelper dh-autoreconf chrpath devscripts

і на puppet-master02 (пакети потрібні для складання rugged, через gem):

sudo apt make install cmake pkg-config ruby-dev rubygems libevent-pthreads-2.0-5 openssl libssl-dev libz-dev libhttp-parser-dev

Завантажити вихідні коди libssh2 і распакуем їх:

dget http://archive.ubuntu.com/ubuntu/pool/universe/libs/libssh2/libssh2_1.7.0-1.dsc
dpkg-source -x ./libssh2_1.7.0-1.dsc

Додамо до опису пакету додаткову інформацію про наших зміни:

cd libssh2-1.7.0/
dch -i

Потрібно додати в changelog опис на кшталт:
* Backport from yakkety
* Recompile with openssl support
Зарелизить changelog:

dch -r

У файлі /libssh2-1.7.0/debian/control поміняємо всі входження libgcrypt20-dev на libssl-dev:

sed -i 's/libgcrypt20-dev/libssl-dev/g' debian/control

І зберемо новий пакет з підтримкою openssl замість libgcrypt:

./configure --with-openssl --without-libgcrypt
dpkg-buildpackage -rfakeroot

Не забудемо видалити libssh2-1-dev від старої версії libssh2-1:

sudo apt remove libssh2-1-dev

Встановимо пересобранные пакети на puppet-master01 і puppet-master02 (dev-пакет потрібен для установки rugged через gem):

sudo dpkg -i libssh2-1_1.7.0-1ubuntu1_amd64.deb libssh2-1-dbg_1.7.0-1ubuntu1_amd64.deb libssh2-1-dev_1.7.0-1ubuntu1_amd64.deb

Встановимо r10k і rugged:

sudo gem install r10k rugged

І створимо конфігураційний файл /etc/puppetlabs/r10k/r10k.yaml на puppet-master01 і puppet-master02 з наступним вмістом:

# location for cached repos
:cachedir: '/var/cache/r10k'

git:
provider: 'rugged'
private_key: '/home/r10k/.ssh/r10k'

# git repositories containing environments
:sources:
:base:
remote: 'ssh://gitolite3@sgl-git.example.com/puppet-environments'
basedir: '/etc/puppetlabs/code/environments/'

Конфігурування репозиторію puppet-environments.git
Первісна настройка репозиторію. Склонируем репозиторій puppet-environments на свій робочий комп'ютер:

aspetrenko@aspetrenko-pc:~/sgl-git$ git clone gitolite3@sgl-git:puppet-environments
Cloning into 'puppet-environments'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.

Заповнимо репозиторій початковим вмістом, який візьмемо на puppet-master01:

aspetrenko@aspetrenko-pc:~/sgl-git$ scp -r aspetrenko@puppet-master01:/etc/puppetlabs/code/environments/production/* /home/GKSM/aspetrenko/sgl-git/puppet-environments/

Перейдемо в репозиторій і додамо символічне посилання для origin, яка буде називатися production, згідно з ім'ям оточення в puppet:

aspetrenko@aspetrenko-pc:~/sgl-git$ cd puppet-environments/
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git symbolic-ref HEAD refs/heads/production
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git push --set-upstream origin production

І зафіксуємо зміни:

aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git add --all
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git commit -a -m "Initial commit"

Створення post-recive хука
Створимо post-recive хук в репозиториии puppet-environments, який буде запускати r10k на серверах puppet-master01 і puppet-master02, з наступним вмістом:

aspetrenko@sgl-git:~$ sudo cat /media/data/repositories/puppet-environments.git/hooks/post-receive
#!/bin/bash

umask 0002

while read oldrev newrev ref
do
branch=$(echo $ref | cut -d/ -f3)
echo
echo "--> Deploying ${branch}..."
echo
ssh -i /var/lib/gitolite3/.ssh/gitolite3 r10k@puppet-master01 "r10k deploy environment $branch -p"
ssh -i /var/lib/gitolite3/.ssh/gitolite3 r10k@puppet-master02 "r10k deploy environment $branch -p"
# sometimes r10k gets wrong permissions too
find /etc/puppetlabs/code/environments/$branch/modules -type d -exec chmod 2775 {} \; 2> /dev/null
find /etc/puppetlabs/code/environments/$branch/modules -type f -exec chmod 664 {} \; 2> /dev/null
done

Не забудемо зробити його виконуваним:

aspetrenko@sgl-git:~$ sudo chmod 0775 /media/data/repositories/puppet-environments.git/hooks/post-receive


Перевірка post-recive хука
Створимо директорію manifets і файл .keep, щоб git не ігнорував порожню директорію:

aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ touch manifests/.keep
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git add manifests/.keep
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git commit manifests/.keep -m "Test commit"
[production 72bd288] Test commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 manifests/.keep

Відправимо зміни в репозиторій:

aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git push -u origin production

Далі git-хук з допомогою r10k внесе відповідні зміни в /etc/puppetlabs/code/environments на кожному сервері. Перевіримо наявність змін на puppet-master01 і puppet-master02.

Установка і настройка Librarian-puppet
librarian-puppet.com
Librarian-puppet бере на себе управління директорією modules/, і завжди буде перевстановлювати (якщо відсутні) модулі описані в Puppetfile, тому вам не потрібно зберігати і відстежувати стан директорії modules/ Git.

Librarian-puppet — це менеджер (ака Bundler для gem) для вашої інфраструктури puppet. Ви можете використовувати librarian-puppet для керування модулями Puppet незалежно від того, де зберігаються модулі в Puppet Forge, в Git-репозиторії або в локальній теці.

Librarian-puppet вміє вирішувати залежно описані в Modulefile або metadata.json.
Forge-модулі можуть бути встановлені з Puppetlabs Forge або внутрішнього сховища Forge такого як Pulp.

Git-модулі можуть бути встановлені з гілки, тега або специфічного коміта. Модулі можуть бути встановлені з GitHub використовуючи tarballs, без необхідності установки Git. Модулі можуть бути встановлені з каталогу у локальній файловій системі. Залежно модулів можуть бути дозволені прозоро без необхідності перераховувати всі модулі в явному вигляді.
Установка librarian-puppet
На комп'ютері, де ми працюємо з репозиторієм, з допомогою gem встановимо librarian-puppet:

aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ sudo gem install librarian-puppet

Видалимо директорію modules з усіма вкладеними файлами, які були скопійовані з початкового репозиторію Puppet:

aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git rm -rf modules

Проинициализируем librarian-puppet в репозиторії:

aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ librarian-puppet init

Закомментіруем рядок з metadata в Puppetfile. Наведемо Puppetfile до наступного вигляду:

aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ cat Puppetfile 
#!/usr/bin/env ruby
#^syntax detection

forge "https://forgeapi.puppetlabs.com"

# use dependencies defined in metadata.json
# metadata

# use dependencies defined in Modulefile
# modulefile

# A module from the Puppet Forge
mod 'puppetlabs-stdlib'
mod 'puppetlabs-ntp'
mod 'puppetlabs-puppetdb'
mod 'puppetlabs-firewall' # For puppetlabs-puppetdb
mod 'puppetlabs-inifile' # For puppetlabs-puppetdb
mod 'puppetlabs-postgresql' # For puppetlabs-puppetdb
mod 'puppetlabs-apt' # For puppetlabs-puppetdb
mod 'puppetlabs-concat' # For puppetlabs-puppetdb

Створимо файл .keep в директорії modules, щоб git не ігнорував порожню директорію:

aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ touch modules/.keep

Додамо, згенеровані за допомогою команди librarian-puppet init, файли в git, і відправимо зміни на сервери puppet-master01 і puppet-master02:

git add --all
git commit -a -m "librarian-puppet init"
git push -u origin production

Якщо все налаштовано правильно, то в каталозі /etc/puppetlabs/code/environments/production/modules/ на серверах повинно з'явитися модулі перераховані в Puppetfile.

Розгортання OpenSource Puppet 4 з кількома Puppet masters. Частина III. Налаштування puppet-db з допомогою Puppet
Джерело: Хабрахабр

0 коментарів

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