→ Развертывание OpenSource Puppet 4 с несколькими Puppet masters. Часть I. Подготовительная
→ Развертывание OpenSource Puppet 4 с несколькими Puppet masters. Часть II. Настройка Puppet Masters
Зададим настройки для ноды puppet-db в репозитории puppet-environments.git.
В репозитории puppet-environments.git в файл manifests/nodes.pp добавим настройки puppet-db:
Хочу выразить благодарность Кену Барберу (Ken Barber) за помощь в настройке. Изначально я клонировал репозиторий модуля puppet-db, вносил в него изменения в части размещения данных postgresql, и устанавливал уже измененный модуль. Он подсказал, как сделать лучше.
Не забудем создать каталог /media/data/postgresql/9.4/main если планируется использовать нестандартное размещение БД:
Зафиксируем изменения в репозитории, чтобы они попали на серверы puppet. Для любого размещения postgresql datadir выполним:
Не забудьте задать настройки puppetmaster в /etc/puppetlabs/puppet/puppet.conf на сервере puppet-db.
Отправим запрос на добавление сертификата для сервера puppet-db на puppet-master01:
Подтвердим сертификат на puppet-master01:
После чего настройки сделанные в nodes.pp будут автоматически применены для puppet-db: будет установлен и настроен postgresql сервер и служба puppet-db.
Добавим в файл manifests/nodes.pp следующие строки:
Или такие, если требуется настройка ntp (без использования hiera):
Зафиксируем изменения в репозитории:
И отправим изменения на сервер gitolite3:
Применим изменения на серверах puppet-master01 и puppet-master02:
Проверим, применились ли настройки подключения к puppet-db на puppet-master01 и puppet-master02:
Проверим, применились ли настройки ntp на puppet-master01 и puppet-master02:
Для упрощения отладки hiera сделаем символическую ссылку на конфигурационный файл hiera на puppet-master01 и puppet-master02:
Создадим файл manifests/site.pp, и подключим hiera с помощью hiera_include('classes'). Содержимое site.pp:
На серверах puppet-master01 и puppet-master02 в файле /etc/puppetlabs/puppet/hiera.yaml по-умолчанию заданы настройки хиерархии:
Создадим конфигурацию по умолчанию в файле common.yaml, которая будет применяться для всех нод, и зададим настройки ntp-клиента:
Создадим каталог для хранения конфигураций отдельных нод в hiera:
Имя конфигурационных файлов будет соответствовать именам сертификатов нод (%{::trusted.certname}).
Аналогично в файле hieradata/nodes/puppet-master02.example.com.
В случае стандартного размещения datadir для postgresql все просто:
А вот для этого случая простого решения не нашлось. Не знаю насколько критично наличие расширения pg_trgm в postgresql для функционирования puppet-db. На всякий случай решил не убирать это расширение.
Дело в том, что в hiera нельзя просто так взять и объявить ресурсы (Defining resource types), как в Puppet language:
Я перепробовал несколько не слишком удачных вариантов добавления ресурсов с помощью hiera:
→ serverfault.com/questions/549720/hiera-include-equivalent-for-resource-types/549807
→ graviline.ru/index/show/41130
Пока не нашел модуль tedivm-hieratic. Создатель модуля заявляет поддержку Puppet 3.x, но и в Puppet 4 все заработало. В Puppetfile нужно прописать еще один модуль:
Включить hieratic в файле manifests/site.pp:
И тогда можно будет задать конфиг для нестандартного размещения datadir для postgresql hieradata/nodes/puppet-db.yaml:
Если настроили ноды через hiera, нужно не забыть удалить настройки нод из manifets/nodes.pp.
Фиксация изменений:
Применение настроек на puppet-db:
В результате получим инфраструктуру Puppet, которую можно расширять в дальнейшем, добавляя дополнительные ноды puppet-master по мере возрастания нагрузки на имеющиеся серверы. Теперь можно приступать к написанию манифестов для управляемых нод. Но об этом как-нибудь в другой раз.
→ Развертывание OpenSource Puppet 4 с несколькими Puppet masters. Часть II. Настройка Puppet Masters
Настройка puppet-db с помощью Puppet
Зададим настройки для ноды puppet-db в репозитории puppet-environments.git.
В случае стандартного размещения datadir для postgresql
В репозитории puppet-environments.git в файл manifests/nodes.pp добавим настройки puppet-db:
node default {
}
node puppet-db {
class { 'puppetdb':
listen_addresses => '0.0.0.0',
}
}
В случае нестандартного размещения datadir для postgresql
Хочу выразить благодарность Кену Барберу (Ken Barber) за помощь в настройке. Изначально я клонировал репозиторий модуля puppet-db, вносил в него изменения в части размещения данных postgresql, и устанавливал уже измененный модуль. Он подсказал, как сделать лучше.
node default {
}
node 'puppet-db.example.com' {
class { 'puppetdb':
listen_address => '0.0.0.0',
manage_dbserver => false,
}
class { '::postgresql::globals':
manage_package_repo => true,
version => '9.4',
}
class { '::postgresql::server':
datadir => '/media/data/postgresql/9.4/main',
}
postgresql::server::extension { 'pg_trgm':
database => 'puppetdb',
}
}
Не забудем создать каталог /media/data/postgresql/9.4/main если планируется использовать нестандартное размещение БД:
aspetrenko@puppet-db:~$ sudo mkdir -p /media/data/postgresql/9.4
Фиксация изменений в репозитории
Зафиксируем изменения в репозитории, чтобы они попали на серверы puppet. Для любого размещения postgresql datadir выполним:
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git add manifests/nodes.pp
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git commit manifests/nodes.pp -m "Add puppet-db config to nodes.pp"
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git push -u origin production
Применение настроек puppet-db
Не забудьте задать настройки puppetmaster в /etc/puppetlabs/puppet/puppet.conf на сервере puppet-db.
Отправим запрос на добавление сертификата для сервера puppet-db на puppet-master01:
aspetrenko@puppet-db:~$ sudo -i puppet agent --enable
aspetrenko@puppet-db:~$ sudo -i puppet agent --test --waitforcert 60
Подтвердим сертификат на puppet-master01:
aspetrenko@puppet-master01:/etc/puppetlabs/code/environments/production$ sudo -i puppet cert list
"puppet-db.example.com" (SHA256) 9C:98:4C:D8:A9:B6:9D:27:5A:9D:A8:5F:15:E2:D8:99:6F:CF:0E:34:5B:B5:5C:BC:23:0D:6E:E0:84:BA:3F:05
aspetrenko@puppet-master01:/etc/puppetlabs/code/environments/production$ sudo -i puppet cert --sign puppet-db.example.com
Signing Certificate Request for:
"puppet-db.example.com" (SHA256) 9C:98:4C:D8:A9:B6:9D:27:5A:9D:A8:5F:15:E2:D8:99:6F:CF:0E:34:5B:B5:5C:BC:23:0D:6E:E0:84:BA:3F:05
После чего настройки сделанные в nodes.pp будут автоматически применены для puppet-db: будет установлен и настроен postgresql сервер и служба puppet-db.
Подключение puppet-master01 и puppet-master02 к puppet-db
Добавим в файл manifests/nodes.pp следующие строки:
node 'puppet-master01.example.com' {
class { 'puppetdb::master::config':
puppetdb_server => 'puppet-db.example.com',
}
}
node 'puppet-master02.example.com' {
class { 'puppetdb::master::config':
puppetdb_server => 'puppet-db.example.com',
}
}
Или такие, если требуется настройка ntp (без использования hiera):
node 'puppet-master01.example.com' {
class {'::ntp':
servers => [ 'time.example.com', '0.pool.ntp.org' ],
}
class { 'puppetdb::master::config':
puppetdb_server => 'puppet-db.example.com',
}
}
node 'puppet-master02.example.com' {
class {'::ntp':
servers => [ 'time.example.com', '0.pool.ntp.org' ],
}
class { 'puppetdb::master::config':
puppetdb_server => 'puppet-db.example.com',
}
}
Зафиксируем изменения в репозитории:
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git commit manifests/nodes.pp -m "Setup puppet-db server for puppet-master01 and puppet-master02"
И отправим изменения на сервер gitolite3:
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git push -u origin production
Применим изменения на серверах puppet-master01 и puppet-master02:
sudo -i puppet agent --test
Проверим, применились ли настройки подключения к puppet-db на puppet-master01 и puppet-master02:
cat /etc/puppetlabs/puppet/puppetdb.conf
[main]
server_urls = https://puppet-db.example.com:8081/
soft_write_failure = false
Проверим, применились ли настройки ntp на puppet-master01 и puppet-master02:
cat /etc/ntp.conf | grep server
# Set up servers for ntpd with next options:
# server - IP address or DNS name of upstream NTP server
# prefer - select preferrable server
server time.example.com iburst
server 0.pool.ntp.org iburst
Настройка Hiera
Для упрощения отладки hiera сделаем символическую ссылку на конфигурационный файл hiera на puppet-master01 и puppet-master02:
sudo ln -s /etc/puppetlabs/puppet/hiera.yaml /etc/hiera.yaml
Создадим файл manifests/site.pp, и подключим hiera с помощью hiera_include('classes'). Содержимое site.pp:
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ cat manifests/site.pp
hiera_include('classes')
На серверах puppet-master01 и puppet-master02 в файле /etc/puppetlabs/puppet/hiera.yaml по-умолчанию заданы настройки хиерархии:
:hierarchy:
- "nodes/%{::trusted.certname}"
- common
Создадим конфигурацию по умолчанию в файле common.yaml, которая будет применяться для всех нод, и зададим настройки ntp-клиента:
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ cat hieradata/common.yaml
---
classes:
- ntp
ntp::servers:
- time.example.com
# - 1.pool.ntp.org
# - 2.pool.ntp.org
# - 3.pool.ntp.org
Создадим каталог для хранения конфигураций отдельных нод в hiera:
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ mkdir hieradata/nodes
Имя конфигурационных файлов будет соответствовать именам сертификатов нод (%{::trusted.certname}).
Альтернативная реализация с помощью hiera, тех же настроек, что были заданы выше в manifests/nodes.pp
Конфигурация puppet-master
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ cat hieradata/nodes/puppet-master01.example.com.yaml
---
classes:
- puppetdb::master::config
puppetdb::master::config::puppetdb_server: 'puppet-db.example.com'
Аналогично в файле hieradata/nodes/puppet-master02.example.com.
Конфигурация для puppet-db
Стандартное размещения datadir для postgresql
В случае стандартного размещения datadir для postgresql все просто:
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ cat hieradata/nodes/puppet-db.example.com.yaml
---
classes:
- puppetdb
puppetdb::listen_address: '0.0.0.0'
Нестандартное размещения datadir для postgresql
А вот для этого случая простого решения не нашлось. Не знаю насколько критично наличие расширения pg_trgm в postgresql для функционирования puppet-db. На всякий случай решил не убирать это расширение.
Дело в том, что в hiera нельзя просто так взять и объявить ресурсы (Defining resource types), как в Puppet language:
postgresql::server::extension { 'pg_trgm':
database => 'puppetdb',
}
Я перепробовал несколько не слишком удачных вариантов добавления ресурсов с помощью hiera:
→ serverfault.com/questions/549720/hiera-include-equivalent-for-resource-types/549807
→ graviline.ru/index/show/41130
Пока не нашел модуль tedivm-hieratic. Создатель модуля заявляет поддержку Puppet 3.x, но и в Puppet 4 все заработало. В Puppetfile нужно прописать еще один модуль:
mod 'tedivm-hieratic' # Hieratic allows Puppet Resources to be created directly in Hiera.
Включить hieratic в файле manifests/site.pp:
include hieratic
И тогда можно будет задать конфиг для нестандартного размещения datadir для postgresql hieradata/nodes/puppet-db.yaml:
---
classes:
- puppetdb
- postgresql::globals
- postgresql::server
puppetdb::listen_address: '0.0.0.0'
puppetdb::manage_dbserver: false
postgresql::globals::manage_package_repo: true
postgresql::globals::version: '9.4'
postgresql::server::datadir: '/media/data/postgresql/9.4/main'
postgresql_server_extension:
pg_trgm:
name: 'pg_trgm'
database: 'puppetdb'
Применение конфигурации
Если настроили ноды через hiera, нужно не забыть удалить настройки нод из manifets/nodes.pp.
Фиксация изменений:
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git add --all
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git commit -a -m "Hiera config"
aspetrenko@aspetrenko-pc:~/sgl-git/puppet-environments$ git push -u origin production
Применение настроек на puppet-db:
aspetrenko@puppet-db:~$ sudo -i puppet agent --test
В результате получим инфраструктуру Puppet, которую можно расширять в дальнейшем, добавляя дополнительные ноды puppet-master по мере возрастания нагрузки на имеющиеся серверы. Теперь можно приступать к написанию манифестов для управляемых нод. Но об этом как-нибудь в другой раз.