Базовая установка и настройка Puppet 4 с хранением манифестов в SVN

в 11:28, , рубрики: devops, puppet, svn, ubunut, Настройка Linux, Серверное администрирование, системное администрирование

Доброго времени суток!

Сегодня будем готовить Puppet 4 на Ubuntu Server 16.04 c хранением манифестов в SVN. Так же статье будет рассмотрен пример создания простого собственного модуля для установки и конфигурирования агента сбора логов в Graylog2 через Graylog Collector Sidecar и использованием Filebeat в качестве бэкэнда. Данный пример не претендует на изящное решение, но описывает ключевые аспекты с примером.

Исходная машина для Puppet Server — VPS Ubuntu 16.04 — 4Gb Memory, 2 CPU cores.

Поехали:

Важно — сервер и управляемая нода должны быть доступны друг другу по имени! Если не используем DNS — необходимо прописать хосты в /etc/hosts:
в нашем примере на сервере:

172.16.248.189 ubuntu

на ноде:

172.16.248.34 puppet

Обновим систему на сервере:

apt-get update
apt-get upgrade
apt-get install mc #пригодится

Добавим официальный репозиторий Puppet:

cd /opt
curl -O https://apt.puppetlabs.com/puppetlabs-release-pc1-xenial.deb
sudo dpkg -i puppetlabs-release-pc1-xenial.deb
sudo apt-get update

Установим пакет:

sudo apt-get install puppetserver

Настроим распределение памяти для Puppet Server (по дефолту Puppet использует 2Gb):

sudo mcedit /etc/default/puppetserver

JAVA_ARGS="-Xms3g -Xmx3g -XX:MaxPermSize=256m"

Запустим сервер:

sudo systemctl start puppetserver

Убедимся что все ок:

sudo systemctl status puppetserver

Добавим сервер в автозапуск:

sudo systemctl enable puppetserver

Поздравляю! На этом установка и базовая настройка сервера закончена!

Установка агента puppet на управляемую ноду:

Добавим официальный репозиторий Puppet:

cd /opt
curl -O https://apt.puppetlabs.com/puppetlabs-release-pc1-xenial.deb
sudo dpkg -i puppetlabs-release-pc1-xenial.deb
sudo apt-get update

Установим пакет:

sudo apt-get install puppet-agent

Запускаем и добавляем в автозапуск:

sudo systemctl start puppet
sudo systemctl enable puppet

Если все прошло успешно, мы увидим на сервере запрос на подпись сертификата от ноды, посмотреть список сертификатов на сервере:

sudo /opt/puppetlabs/bin/puppet cert list --all

Подписать сертификат для ноды с hosname ubuntu:

sudo /opt/puppetlabs/bin/puppet cert sign ubuntu

В итоге должно получиться что-то вроде:

root@puppet:/var/log# sudo /opt/puppetlabs/bin/puppet cert list --all
+ "puppet.my-domain.org" (SHA256) A4:A8:4E:B0:81:7F:A0:84:F3:03:03:F0:DE:81:E8:73:A9:01:7A:90:F6:A2:27:0D:62:18:F9:D9:7B:F0:F0:9F (alt names: "DNS:puppet", "DNS:puppet.my-domain.org")
+ "ubuntu" (SHA256) 79:37:37:3F:D5:5C:C1:D3:FF:8D:BC:14:82:11:CE:9F:A6:4C:1C:90:3C:A6:A8:7D:E0:D8:81:D8:D7:D8:43:05

Протестируем нашу инсталляцию — для примера создадим дефолтный манифест puppet, путь по умолчанию:

sudo nano /etc/puppetlabs/code/environments/production/manifests/site.pp
file {'/tmp/it_works.txt':
ensure => present,
mode => '0644',
content => "It works on ${ipaddress_eth0}!n",
}

На управляемой ноде «дернем» агент — заставив его обратиться за изменениями конфигурации на сервер:

sudo /opt/puppetlabs/bin/puppet agent --test

Результато выполнения данного манифеста должно быть создание файла «it_works.txt» на ноде в
/tmp/:

cat /tmp/it_works.txt
It works on 172.16.248.189!

Поздравляю! У Вас получилось применить первый манифест Puppet к управляемой ноде!

Далее для ускорения отладки и тестов изменим на ноде интервал обращения агента к серверу (интервал задается в секундах):

nano /etc/puppetlabs/puppet/puppet.conf
runinterval = 180

Теперь попробуем создать и применить к ноде свой первый собственный модуль в окружении для нод по умолчанию — pdoruction (велосипед) для установки и настройки пакетов необходимых для сборки логов с ноды в Graylog (Graylog Collector Sidecar + Filebeat), на сервере подготовим директории модуля:

mkdir /etc/puppetlabs/code/environments/production/collector_sidecar/modtest
mkdir /etc/puppetlabs/code/environments/production/modules/collector_sidecar/manifests
mkdir /etc/puppetlabs/code/environments/production/modules/collector_sidecar/files
chmod 777 /etc/puppetlabs/code/environments/production/modules/collector_sidecar/files
cd mkdir /etc/puppetlabs/code/environments/production/modules/collector_sidecar/manifests

В каталог /etc/puppetlabs/code/environments/production/modules/collector_sidecar/files загружаем необходимые пакеты для установки:
collector-sidecar_0.1.4-1_amd64.deb
filebeat-5.6.4-amd64.deb
и необходимые конфиги в нашем случаем это файл:
collector_sidecar.yml

Создаем и редактируем манифест по умолчанию:

touch init.pp
nano init.pp

class collector_sidecar {
#скачаем файл пакета collector-sidecar на ноду в /opt с puppet сервера
file { '/opt/collector-sidecar_0.1.4-1_amd64.deb':
ensure => present,
mode => '0644',
source => 'puppet:///modules/collector_sidecar/collector-sidecar_0.1.4-1_amd64.deb',
}
#скачаем файл пакета filebeat на ноду в /opt с puppet сервера
file { '/opt/filebeat-5.6.4-amd64.deb':
ensure => present,
mode => '0644',
source => 'puppet:///modules/collector_sidecar/filebeat-5.6.4-amd64.deb',
}
#установим пакет collector-sidecar
package { 'collector-sidecar':
provider => dpkg,
ensure => installed,
source => '/opt/collector-sidecar_0.1.4-1_amd64.deb',
}
#скачаем конфиг - collector_sidecar.yml на ноду в etc/graylog/collector-sidecar/
file { '/etc/graylog/collector-sidecar/collector_sidecar.yml':
mode => '0644',
source => 'puppet:///modules/collector_sidecar/collector_sidecar.yml',
require => Package['collector-sidecar'] #зависимость, директива выполнится, только если в системе установлен пакет - collector-sidecar
}
#установим filebeat
package { 'filebeat':
provider => dpkg,
ensure => installed,
source => '/opt/filebeat-5.6.4-amd64.deb',
require => Package['collector-sidecar']
}
#добавим в сервисы graylog-collector-sidecar
exec { 'install_gcs_service':
command => '/usr/bin/graylog-collector-sidecar -service install',
creates => '/etc/systemd/system/collector-sidecar.service',
require => Package['collector-sidecar']
}
#запустим сервис collector-sidecar
service { 'collector-sidecar':
ensure => running,
enable => true,
require => Package['collector-sidecar']
}
#запустим сервис filebeat
service { 'filebeat':
ensure => running,
enable => true,
require => Package['filebeat']
}
}

Важно понимать философию работы Puppet — в манифестах описывается «состояние конфигурации» системы, к которому ее нужно привести.

Теперь можем «повешать» наш модуль в манифест выполняемый по умолчанию:

nano /etc/puppetlabs/code/environments/production/manifests/site.pp
# для теста манифестов локально
node 'default' {
include 'collector_sidecar'
}

node 'ubuntu' {
include 'collector_sidecar'
}

Произвести dry-run манифеста на сервере локально — будет эмулирован запуск, но фактических действий произведено не будет:

/opt/puppetlabs/bin/puppet apply --noop /etc/puppetlabs/code/environments/production/manifests/site.pp

Так же удобно для отладки смотреть лог на Puppet сервере:


tail -f puppetserver.log

На ноде puppet-agent пишет лог в syslog:
tail -f /var/log/syslog

Хранение манифестов в svn
Имеем Subversion сервер, на сервере подготовим репозиторий для хранения манифестов:
создание репозитория:

sudo svnadmin create /media/datadrive/svn/puppet

Скопируем манифесты с сервера puppet на сервер с svn:

scp -r administrator@puppet.my-domainorg/etc/puppetlabs/code/ /home/administrator/code/

Импортируем манифесты в созданный репозиторий:

svn import /home/administrator/code/ svn://svn.my-domain.org/puppet -m 'init'

Делаем chek-out репозитория в папку манифестов Pupppet на Puppet сервере:
если еще не стоит клиент svn:

apt install subversion
svn co svn://svn.my-domain.org/puppet /etc/puppetlabs/code --username=puppet

Теперь создаем рабочую копию репозитория у себя на рабочей машине и пробуем внести изменения в манифест, делаем commit, проверяем на Puppet сервере:

svn up /etc/puppetlabs/code/

Если все ОК — добавляем в cron update рабочей копии каждое n-е количество времени. Или же можем сделать пост-коммит хук.

Автор: sysbes

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js