- PVSM.RU - https://www.pvsm.ru -
- cfpuppetserver [1] — модуль автоматической настройки Puppet Server + PuppetDB + PostgreSQL + r10k + librarian-puppet
- Краткое введение в Puppet
- Описывается изначальное развёртывание с нуля
Немного лирики. Казалось бы с этой статьи следует начинать весь цикл, но всё же целевой аудиторией являются более опытные пользователи Open Source продуктов Puppet Labs, которых не устраивают отдельные малоинтегрированные модули с Puppet Forge. Как и с любым случаем "library vs. framework", расплатой является следование мировоззрению автора интегрированного решения.
Puppet — это в первую очередь специфичный язык декларативного задания конечного состояния системы. Для сравнения крайне подойдёт GNU Makefile, где помимо непосредственного описания зависимостей есть возможность начудить на полную катушку.
Абстракция Puppet примерно следующая (срыв шаблонов — забудьте всё, что вы знали о терминах в программировании!).
define
, который создаёт экземпляры других типов или же в виде расширения на Ruby с полётом фантазии.Puppet может использоваться для локального развёртывания без сети и соответствующей инфраструктуры. Это может использоваться для создания образов контейнеров. Есть даже целое направление ратующих за отказ от централизованного сервера.
В идеологически правильном ключе, инфраструктура Puppet состоит из агента — привилегированного сервиса на целевой системе и сервера, раздающего ценные указания в виде декларативных каталогов ресурсов по запросу от агентов. Безопасность реализована на уровне приватной инфраструктуры публичного ключа (X.509 [4]). Попросту говоря, тех же механизмов, что и в HTTPS, но с собственным CA и обязательной проверкой клиентского сертификата.
В упрощённом виде процедура развёртывания выглядит примерно так:
puppet facts
. Эти факты доступны в качестве глобальных переменных.Для вкушения всех прелестей, существует дополнительные плюшки в виде:
first
— выдаётся первое попавшиеся по приоритету значениеunique
— собирает все значения в одномерный массив и убирает дубликатыhash
— объединяет все найденные YAML Hash. Дубликаты ключей выбираются по приоритету.deep
— по сути рекурсивный вариант hashlookup()
, т.к. и в любом файле иерархии через специальный ключ lookup_options [9], что активно используется в модуле cfnetwork [10].Требуется понимать, что Puppet Server становится уязвимым местом всей IT инфраструктуры, т.к. определяет конечную конфигурацию всех систем. В особых случаях имеет смысл делать разделение — отдельный сервер для критичных элементов инфраструктуры с крайне ограниченным доступов и ручным обновлением и второй для всего остального.
Доступность Puppet Server определяет возможность управления всей инфраструктурой. Имеет смысл размещать Puppet Server на виртуалке в более надёжном и быстро восстанавливаемом стороннем облаке, чем собственные возможности. Или же следует устанавливать несколько серверов.
В любом случае, не следует устанавливать иные сервисы на системе, где будет развёрнут Puppet Server с прибамбасами. Виртуализация и контейнеризация вам в помощь.
Полное описание есть у производителя [12].
puppet lookup
.Данный процесс достаточно примитивен, но требует соблюдения определённой последовательности шагов. Поскольку делать это вручную неблагодарное занятие, автор научит плохому, а именно скачивать непонятные скрипты с интернета и запускать под root'ом на своей системе.
Три основных компонента сервера — это сам Puppet Server, PuppetDB и PostgreSQL. Их всех можно запихнуть на один узел или же разбить на две-три системы. Puppet Server и Puppet DB могут быть запущены множество раз, а вот PostgeSQL является единым узлом отказа. Есть разнообразные подход к репликации и кластеризации PostgeSQL.Удобный подход в случае основного и второстепенного серверов будет Master + Read-Only Slave, что поддерживается в самом PuppetDB как основной и read-only узел базы данных, но автоматизация такой настройки требует времени и поэтому пока не входит в модуль cfpuppetserver
.
Непосредственно конфигурацию можно просто хранить хоть на файловой системе вместе с Puppet Server, но это как писать скрипты на боевом веб-сервере. Самое подходящее решение — это git репозиторий. Утилита r10k [14] умеет вытягивать все ветки репозитория и развёртывать их на Puppet Server как отдельные Среды. У r10k
достаточно плохо [15] с вытягиванием зависимостей, поэтому поверх используется librarian-puppet [16]. Стоит сразу заметить, что основной канонической Средой Puppet является "production". Поэтому в репозитории конфигурации следует использовать ветку с названием "production", а не "master".
По железу описано самим производителем [17]. Модуль cfpuppetserver
пока поддерживает только Debian Jessie+ и Ubuntu Trusty+.
Для самого r10k размещение репозитория не имеет большого значения — главное его доступность. Например, в целях тестирования репозиторий можно разместить на той же системе с доступом через file://
. Хорошим стартом будет пример конфигурации codingfuture/puppet-exampleenv [18].
git clone https://github.com/codingfuture/puppet-exampleenv my-puppet-conf && cd my-puppet-conf
$EDITOR data/common.yaml
$MY_DOMAIN
— корневое доменной имя (например, example.org)$HOST_NAME
— имя клиентского узла без доменаmkdir data/$MY_DOMAIN
cp data/example.com/puppet.yaml data/${MY_DOMAIN}/puppet.yaml
$EDITOR nano -w data/${MY_DOMAIN}/puppet.yaml
— настройка узла с Puppet Server по подсказкам в комментарияхcp data/example.com/host.yaml data/${MY_DOMAIN}/${HOST_NAME}.yaml
$EDITOR nano -w data/${MY_DOMAIN}/${HOST_NAME}.yaml
— настройка произвольного узла по подсказкам в комментариях
Модуль cfpuppetserver
позволяет установить всё средствами самого же Puppet, но для изначального установки базовые операции продублированы скриптом Bash.
На целевой системе:
wget https://raw.githubusercontent.com/codingfuture/puppet-cfpuppetserver/master/setup_puppetserver.sh
less setup_puppetserver.sh
bash setup_puppetserver.sh <repo_uri> puppet.${MY_DOMAIN}
.
bash setup_puppetserver.sh ssh://git@git.example.com/puppet-conf
bash setup_puppetserver.sh file:///root/puppetconf/
ssh-keygen -t rsa -b 2048
/root/.ssh/id_rsa.pub
на удалённом сервере Git.../usr/bin/ssh -T deploypuppet@puppet.${MY_DOMAIN} ./puppetdeploy.sh
/etc/puppetlabs/deploy.sh
/opt/puppetlabs/bin/puppet agent --test
echo "128.1.1.1 puppet.example.com" >> /etc/hosts
/root/genclientinit.sh ${HOST_NAME}.${MY_DOMAIN}
. /opt/puppetlabs/bin/puppet agent --test
. При первом запуске будет сгенерирован запрос на подпись сертификата.puppet cert list
— сверяем сигнатуру сертификата для пущей параноидальности.puppet cert sign ${HOST_NAME}.${MY_DOMAIN}
— собственно, подписываем сертификат.bash <<EOT
#!/bin/bash
http_proxy=
if test "$(id -un)" != 'root'; then
echo 'This script must run as root'
exit 1
fi
if test ! -z ""; then
echo -n >/etc/cflocation
fi
if test ! -z ""; then
echo -n >/etc/cflocationpool
fi
if test ! -z "$http_proxy"; then
export http_proxy
export https_proxy="$http_proxy"
export HTTP_PROXY="$http_proxy"
export HTTPS_PROXY="$http_proxy"
fi
echo host.example.com > /etc/hostname
hostname host.example.com
if ! which lsb-release | read; then
apt-get install lsb-release
fi
codename=$(lsb_release -cs)
if test -z "$codename"; then
echo "Failed to detect correct codename"
exit 1
fi
wget https://apt.puppetlabs.com/puppetlabs-release-pc1-${codename}.deb
dpkg -i puppetlabs-release-pc1-${codename}.deb
mkdir -p /etc/puppetlabs/puppet
cat > /etc/puppetlabs/puppet/puppet.conf <<EOF
[main]
certname = host.example.com
server = puppet.example.com
ca_server = puppet.example.com
environment = production
EOF
apt-get update &&
apt-get install puppet-agent
while ! /opt/puppetlabs/bin/puppet agent --test --wairforcert 120; do
echo "Please go to puppetserver and exec the following command when we wait for key"
echo "> puppet cert sign host.example.com"
echo "Use CTRL+C to stop cycle, if fails due to different reasons"
sleep 5
done
EOT
~# ./setup_puppetserver.sh
Usage: ./setup_puppetserver.sh <r10k_repo_url> [<certname=hostname> [<cflocation> [<cflocationpool> [<http_proxy>] ] ] ]
r10k_repo_url
— URI Git репозиторияcertname
— полное доменное имя узлаcflocation
— инициализация факта cf_locationcflocationpool
— инициализация факта cf_location_poolhttp_proxy
— прокси сервер для HTTP и HTTPS запросов~# /root/genclientinit.sh
Usage: ./genclientinit.sh <certname> [<cflocation> [<cflocationpool> [<http_proxy>]]]
Значение параметров такое же, как у предыдущего скрипта.
cfpuppetserver
deployuser = 'deploypuppet'
— имя пользователя для автоматического развёртывания обновлений конфигурацииdeployuser_auth_keys = undef
— список ключей для $deployuserrepo_url = undef
— URI репозитория (пример: ssh://user@host/repo или file:///some/path)puppetserver = true
— устанавливать ли компонент Puppet Server на данный узелpuppetdb = true
— устанавливать ли компонент PuppetDB на данный узелpuppetdb_port = 8081
— порт для PuppetDBsetup_postgresql = true
— устанавливать ли компонент PostgreSQL на данный узел (только если включена установка PuppetDB)service_face = 'any'
— название ресурса cfnetwork::iface
для принятия входящих соединенийpuppetserver_mem = auto
— оперативная память под Puppet Server в мегайбатах (минимум 192MB)puppetdb_mem = auto
— оперативная память под PuppetDB в мегайбатах (минимум 192MB)postgresql_mem = auto
— оперативная память под PostgreSQL в мегайбатах (минимум 128MB)cfpuppetserver::puppetdb
postgresql_host = 'localhost'
— адрес базы данныхpostgresql_listen = $postgresql_host
— значение идёт прямо в директиву listen_addresses
PostgreSQLpostgresql_port = 5432
— порт базы данныхpostgresql_user = 'puppetdb'
— пользователь PuppetDB в базе данныхpostgresql_pass = 'puppetdb'
— пароль пользователя PuppetDB в базе данныхpostgresql_ssl = false
— включение шифрования соединения на основе сертификатов Puppet PKIcfpuppetserver::puppetserver
autosign = false
— НЕ СТОИТ использовать в боевой среде, разве что в DMZ. Существует исключительно для автоматизации тестирования.global_hiera_config = 'cfpuppetserver/hiera.yaml'
— путь к файлу конфигурации Hiera по умолчанию по канонам Puppet (первый компонент — название модуля, остальное — путь под папкой files/
в модуле)Автор: andvgal
Источник [19]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/ssh/113558
Ссылки в тексте:
[1] cfpuppetserver: https://forge.puppetlabs.com/codingfuture/cfpuppetserver
[2] Часть I: сеть и сетевой фильтр (cfnetwork + cffirehol): https://habrahabr.ru/post/277085/
[3] Часть II: доступ и стандартное окружение (cfauth + cfsystem): https://habrahabr.ru/post/277309/
[4] X.509: https://en.wikipedia.org/wiki/X.509
[5] YAML: http://yaml.org/
[6] PUP-5983: https://tickets.puppetlabs.com/browse/PUP-5983
[7] PUP-5952: https://tickets.puppetlabs.com/browse/PUP-5952
[8] PUP-5899: https://tickets.puppetlabs.com/browse/PUP-5899
[9] lookup_options: https://docs.puppetlabs.com/puppet/latest/reference/lookup_quick.html#setting-lookupoptions-in-data
[10] cfnetwork: https://forge.puppetlabs.com/codingfuture/cfnetwork
[11] площадка: https://forge.puppetlabs.com/
[12] есть у производителя: https://docs.puppetlabs.com/puppet/4.0/reference/release_notes.html
[13] ERB: http://apidock.com/ruby/ERB
[14] r10k: https://github.com/puppetlabs/r10k
[15] плохо: https://tickets.puppetlabs.com/browse/RK-3
[16] librarian-puppet: http://www.rubydoc.info/gems/librarian-puppet
[17] описано самим производителем: https://docs.puppetlabs.com/puppet/latest/reference/system_requirements.html#hardware
[18] codingfuture/puppet-exampleenv: https://github.com/codingfuture/puppet-exampleenv
[19] Источник: https://habrahabr.ru/post/278163/
Нажмите здесь для печати.