Базовая установка и настройка Puppet 4 с хранением манифестов в SVN
Доброго времени суток!
Сегодня будем готовить 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-е количество времени. Или же можем сделать пост-коммит хук.