Доброго времени суток, жителям !
Когда число управляемых серверов достигает нескольких десятков, а то и сотен, приходится искать решение по автоматической настройке и управлению таким парком. Тут на помощь приходит Puppet. Почему Puppet? Puppet кроссплатформенный, имеет богатое сообщество, имеет множество готовых модулей (4800+), имеет Enterprise версии. Все эти плюсы не дают усомнится в мощи данного продукта. Но управлять из консоли таким «комбайном» не так просто. Потому для удобного управления и настройки Puppet был разработан Foreman. Далее установка и настройка этой связки на примере задачи управления SSH-ключами.
Требования:
- чистый сервер для puppet-мастер;
- команды на сервере puppet-мастер выполняются как root;
- команды на серверах puppet-агент выполняются через sudo.
Используемое ПО:
- ОС Ubuntu 14.04.5 LTS;
- Puppet 3.8.7;
- Foreman 1.11.4.
Цели:
- получить удобный способ автоматизированного управления инфраструктурой сети;
- получить удобный способ управления ssh-ключами.
Примечание.
Все скриншоты и кусок конфигурации скрыты спойлерами. Для лучшего понимания, где выполняются команды, перед каждой командой добавил тип сервера (master или agent).
1. Установка Foreman + Puppet на puppet-мастера
Добавим репозиторий установщика Foreman/Puppet и установим его в систему:
master ~ $ apt-get -y install ca-certificates
master ~ $ cd ~ && wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
master ~ $ dpkg -i puppetlabs-release-trusty.deb
master ~ $ sh -c 'echo "deb http://deb.theforeman.org/ trusty 1.11" > /etc/apt/sources.list.d/foreman.list'
master ~ $ sh -c 'echo "deb http://deb.theforeman.org/ plugins 1.11" >> /etc/apt/sources.list.d/foreman.list'
master ~ $ cd ~ && wget -q http://deb.theforeman.org/pubkey.gpg -O- | apt-key add -
master ~ $ apt-get update && apt-get -y install foreman-installer
Запустим установщик:
master ~ $ foreman-installer
Результат должен быть похож на следующий:
Ссылка вида puppet.<domain.com> и логином с паролем нам пригодятся дальше.
Настроим конфигурацию для просмотра в Foreman различий изменений файлов:
master ~ $ nano /etc/puppet/puppet.conf
> show_diff = true
Откроем в браузере ссылку, рекомендованную в предыдущем шаге: puppet.<domain.com>
И введём логин: admin и пароль, который мы видели в консоли после установки.
Если авторизация прошла успешно, значит Foreman установлен и работает должным образом. Теперь можно переходить к следующей главе.
2. Настройка Foreman
По умолчанию Foreman использует свой SSL-сертификат, сгенерированный Puppet и ваш браузер не будет принимать его. Вы можете добавить корневой сертификат (/var/lib/puppet/ssl/certs/ca.pem
) в свой браузер, чтобы исчезли предупреждения небезопасного соединения (для Chromium добавлять сюда: Настройки/SSL/Центры сертификации).
При первом входе вы увидите страницу Dashboard, где будет показана общая статистика по всем узлам сети. При добавления узлов сети, здесь будет полезная статистическая информация.
При последующих входах вы будете перенаправляться на страницу списка узлов сети.
2.1. Смена пароля
Первым делом необходимо изменить пароль пользователя:
Пароль по умолчанию и так сложный, но лучше сделать свой.
2.2. Добавление модуля на примере NTP
Время должно быть точно установлено на главном сервере puppet-мастер. Для этого необходимо использовать NTP. Если время неверно, puppet-мастер может ошибочно выдавать сертификаты агентов из далекого прошлого или будущего, которые другие узлы будут считать устаревшими.
Иногда, чтобы иметь возможность управлять модулями Puppet через Foreman, необходимо установить модули, разработчиками которых являются не Puppet-Labs, а разработчики сообщества Puppet. Это вытекает из того факта, что Foreman использует HTTP-запросы Restful API для Puppet, но не во всех модулях определено управление с помощью такого API.
Установим модуль saz/ntp на puppet master:
master ~ $ puppet module install saz/ntp
Примечание.
Модуль saz/ntp прекрасно работает на версии Foreman 1.11. Для других версий Foreman, можно использовать модули с сайта forge.puppetlabs.com по поиску ntp.
Вы должны увидеть следующее:
Сейчас модуль был установлен только для puppet-мастер. Теперь необходимо войти в веб интерфейс и добавить его к Foreman. Перейдите в меню Configure -> Classes и нажмите Import from puppet.<domain.com>:
В результате вы увидите список доступных классов, отметьте нужные и нажмите Update:
Для того, чтобы использовать ближние к вам ntp-серверы, перейдем на сайт www.pool.ntp.org. Там в правом блоке выберем нужный нам пул (Африка, Азия и т.д.) и заберём список серверов в буфер обмена.
Далее идём в настройки класса ntp, кликнув по его названию. Переходим во вкладку Smart Class Parameter и ищем в левом списке вкладку server list:
Отмечаем пункт Override и в Default value по примеру предыдущего значения, добавляем сервера из шага выше. Я добавил такое значение:
["0.asia.pool.ntp.org","1.asia.pool.ntp.org","2.asia.pool.ntp.org","3.asia.pool.ntp.org"]
Нажимаем Submit внизу страницы, тем самым мы переопределили параметр класса.
2.3. Добавление модуля accounts и ssh
На примере предыдущего модуля установим модуль accounts:
master ~ $ puppet module install camptocamp-accounts
Если установка прошла успешно, то вы увидите следующее:
Установим модуль ssh:
master ~ $ puppet module install saz/ssh
После этого идём в Foreman и импортируем новые классы. Позже, после создания групп узлов сети, мы настроим классы accounts и ssh.
2.4. Добавление модуля mysql и apache
Для объяснения последующих названий групп database и web добавим модули apache и mysql. Добавляем модули по примеру предыдущих. Загрузить их можно командами:
master ~ $ puppet module install puppetlabs-apache
master ~ $ puppet module install puppetlabs-mysql
3. Добавление узлов сети
Чтобы добавить узел сети в Puppet, необходимо установить puppet-агент на этот узел. Для установки puppet-агента скачаем и установим репозиторий puppet-labs:
agent ~ $ cd ~ && wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
agent ~ $ sudo dpkg -i puppetlabs-release-trusty.deb
agent ~ $ sudo apt-get update
Затем установим puppet-агент:
agent ~ $ apt-get -y install puppet
Чтобы запустить Puppet в роли агента, необходимо закомментировать настройки зоны puppet-мастера. Также добавьте конфигурацию для агента, которая установит адрес нашего puppet-мастера. Приведём файл конфигурации /etc/puppet/puppet.conf
в вид:
[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
#templatedir=$confdir/templates
#[master]
# These are needed when the puppetmaster is run by passenger
# and can safely be removed if webrick is used.
#ssl_client_header = SSL_CLIENT_S_DN
#ssl_client_verify_header = SSL_CLIENT_VERIFY
[agent]
server = puppet.domain.com
# где puppet.domain.com - hostname или IP-адрес вашего master-сервера
Заменим значение переменной START с no на yes, чтобы запустить puppet-агент после перезагрузки ОС. А также запустим puppet-агент:
agent ~ $ sed -i s/START=no/START=yes/g /etc/default/puppet
agent ~ $ service puppet start
При небольшой инфраструктуре puppet-агент можно запускать в виде демона. Есть также способ запуска через CRON: docs.puppet.com/puppet/3.6/services_agent_unix.html#running-puppet-agent-as-a-cron-job.
Примечание.
Puppet-агент по умолчанию ищет домен puppet-мастера в своей зоне, если явно не указан параметр server (в файле puppet.conf). Например: server.domain.com будет искать сервер puppet.domain.com. Потому, если вы ещё идёте по инструкции, то у вас всё должно работать.
После этого идём на Foreman в Infrastructure -> Smart Proxies -> Certificates:
Там должен появится узел сети, на который мы только что установили puppet-агент. Можно использовать фильтр (вверху слева), чтобы увидеть только неподписанные сертификаты. Чтобы подписать, необходимо нажать кнопку Sign:
В течение нескольких минут сервер server.<domain.com> (сервер, на котором мы только что установили агент) появится в списке Hosts -> All hosts.
4. Добавление групп узлов сети
Перейдём в пункт меню Configure -> Host Groups. Нажмём New Host Group. Вкладка Host Group должна получится следующей:
Группа root будет корневой. Она будет родителем всех остальных групп. У ней будет полный доступ ко всему. И в неё будут включены основные классы.
Далее перейдем во вкладку Puppet Classes и добавим необходимые классы нажав на +:
Нажимаем Submit.
Добавим по этому же принципу ещё две группы. Только теперь мы выберем в качестве Parent группу root, потому классы accounts, ntp и ssh наследуются и добавлять их повторно не нужно. Добавим только для группы database класс mysql::server, а для группы web класс apache.
5. Добавление узла в группу
Чтобы включить узел в группу, необходимо перейти в его настройки.
После этого в первой вкладке добавляем группу, как на скриншоте ниже:
После этого нажимаем Submit и в течение нескольких минут на узле сети появится mysql. Таким же образом можно присвоить остальным двум серверам группу web:
Вся конфигурация распространяется на puppet-агенты автоматически в течение нетокоротого времени.
Если не хочется ждать, то можно на клиентах выполнить команду puppet agent --test
и увидеть своими глазами, как создаётся конфигурация.
6. Настройка прав доступа с помощью модуля accounts
Собственно сейчас можно ещё раз посмотреть на схему, которую мы привели в начале и на основе её создать логику.
Перейдём в пункт меню Configure -> Classes. Нажмём на accounts, чтобы перейти в настройки модуля. Из всех настроек нам будут нужны вкладки accounts, ssh keys, users.
Примечание.
Вкладка accounts — в ней содержаться хэши «пользователь сервера -> названия публичных ключей из вкладки ssh keys». Вкладка ssh keys — в ней содержаться хэши «название ключа -> тип и значение». Вкладка users — в ней содержаться пользователи, которых необходимо создать или указать для уже существующих некоторые параметры.
Откроем последнюю вкладку users и установим её как на скриншоте:
Этот параметр настраивает домашний каталог пользователя. Здесь мы задействовали Merge overrides и Merge default параметры, которые позволят объединить конфигурацию для конечного узла сети.
Вкладку ssh keys заполним следующим образом:
В поле Default value необходимо вписать все публичные ключи аккаунтов, которые будут использоваться во вкладке accounts. Эти публичные ключи пользователей, которые будут иметь доступ на те или иные сервера. Отступ в два пробела перед параметрами type и public обязателен.
Пример того, как выглядит один публичный ключ (остальные добавляются друг за другом ниже):
admin:
type: ssh-rsa
public: AAAAB3NzaC1yc2EAAAADAQABAAABAQDXibuyi2MFzERps7mD2J38mhd4phXQlOEZrmui9rDdcYD0XeEnvdRTZPcsMOw6DRT1ERpzbcFehj+G29YxoiXZ541gVjVvsATAqojN3zEkMz5b0AgBNcKDFi9h/qwlK9YDv2trKEcRHQ4kBN332Z6oqdBFerUMys5dvc3RVlE+x2kVmYNmGIlma5twC9w/wRNoD+nUK+3bk+I+Og40f//uFAKFeY4DMoCrdOsHJrPak5nD9vL6a2m/Fe3jfgmpBCcnV3LS2mr+PdRYbtju7nzfu8WT0ugMAUi+dDMRFh3DmfCzXbOi2TPi+mP//L/A19thXffd/QzW7wmAgxlj+km1
Самую верхнюю вкладку accounts заполним следующим образом:
Из этого параметра следует: root имеет доступ везде с аккаунта root (аккаунт root — это элемент из вкладки ssh keys), аккаунт dbadmin имеет root-доступ только к серверам из группы database, а пользователь admin есть только у группы web и аккаунт admin может подключаться только под пользователя admin.
На вкладке users добавим пользователя admin в группу www-data.
6.1 Настройка класса ssh
В классе accounts мы настроили ssh-доступ по ключам. Потому для более полной безопасности необходимо запретить доступ по паролю. Делается это с помощью класса ssh. Переходим в его настройки и открываем вкладку Smart Class Parameter. Далее client options приводим к следующему виду:
Вкладку server options приводим к следующему виду:
И вкладку storeconfigs enabled заполняем так:
В storeconfigs хранятся все факты о клиентах, поэтому вы можете запросить базу данных и получить списки узлов сети, соответствующие определенным критериям. Для большей безопасности мы это отключили.
7. Результаты
В процессе выполнения данного руководства ваша инфраструктура добавленная под управление Puppet станет быстро-конфигурируемой и масштабируемой. А главная цель — управления публичными ssh ключами будет максимально удобной.
Скриншот списка ключей пользователя admin на одной из машин группы root/web:
Помните, при настройке класса accounts для параметра ssh keys мы включали Merge overrides и Merge default. Это нужно для того, чтобы в конце для определённого узла сети собирался один структурированный файл с ssh-ключами.
Проверим, действительно ли можно авторизоваться под пользователем “admin” с помощью добавленного ключа:
Если у вас также тест прошёл успешно, то инфраструктура готова и можно постепенно подключать остальные ваши сервера к puppet-мастеру и настраивать другие сервисы через Puppet.
Использованные ресурсы: документация Puppet, документация Foreman.
Автор: rebirther23