Pull to refresh

Установка и настройка Puppet + Foreman на Ubuntu 14.04 (пошаговое руководство)

Reading time 8 min
Views 26K
image Доброго времени суток, жителям Хабра!

Когда число управляемых серверов достигает нескольких десятков, а то и сотен, приходится искать решение по автоматической настройке и управлению таким парком. Тут на помощь приходит 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

Результат должен быть похож на следующий:

Результат установки Foreman


Ссылка вида 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.

Вы должны увидеть следующее:

Результат установки saz/ntp


Сейчас модуль был установлен только для puppet-мастер. Теперь необходимо войти в веб интерфейс и добавить его к Foreman. Перейдите в меню Configure → Classes и нажмите Import from puppet.<domain.com>:

Configure → Classes


В результате вы увидите список доступных классов, отметьте нужные и нажмите Update:

Update


Для того, чтобы использовать ближние к вам ntp-серверы, перейдем на сайт www.pool.ntp.org. Там в правом блоке выберем нужный нам пул (Африка, Азия и т.д.) и заберём список серверов в буфер обмена.

Далее идём в настройки класса ntp, кликнув по его названию. Переходим во вкладку Smart Class Parameter и ищем в левом списке вкладку server list:

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

Если установка прошла успешно, то вы увидите следующее:

Результат установки 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 ~ $ sudo apt-get -y install puppet

Чтобы запустить Puppet в роли агента, необходимо закомментировать настройки зоны puppet-мастера. Также добавьте конфигурацию для агента, которая установит адрес нашего puppet-мастера. Приведём файл конфигурации /etc/puppet/puppet.conf в вид:

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 ~ $ sudo sed -i s/START=no/START=yes/g /etc/default/puppet
agent ~ $ sudo 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:

Infrastructure → Smart Proxies → Certificates


Там должен появится узел сети, на который мы только что установили puppet-агент. Можно использовать фильтр (вверху слева), чтобы увидеть только неподписанные сертификаты. Чтобы подписать, необходимо нажать кнопку Sign:

Certificates → Sign


В течение нескольких минут сервер server.<domain.com> (сервер, на котором мы только что установили агент) появится в списке Hosts → All hosts.

4. Добавление групп узлов сети


Перейдём в пункт меню Configure → Host Groups. Нажмём New Host Group. Вкладка Host Group должна получится следующей:

Configure → Host Groups


Группа root будет корневой. Она будет родителем всех остальных групп. У ней будет полный доступ ко всему. И в неё будут включены основные классы.

Далее перейдем во вкладку Puppet Classes и добавим необходимые классы нажав на +:

Puppet Classes


Нажимаем Submit.

Добавим по этому же принципу ещё две группы. Только теперь мы выберем в качестве Parent группу root, потому классы accounts, ntp и ssh наследуются и добавлять их повторно не нужно. Добавим только для группы database класс mysql::server, а для группы web класс apache.

Добавление группы database


Список всех групп


5. Добавление узла в группу


Чтобы включить узел в группу, необходимо перейти в его настройки.

Настройки узла сети


После этого в первой вкладке добавляем группу, как на скриншоте ниже:

Добавление группы к узлу сети


После этого нажимаем Submit и в течение нескольких минут на узле сети появится mysql. Таким же образом можно присвоить остальным двум серверам группу web:

Список узлов сети с присвоенными группами


Вся конфигурация распространяется на puppet-агенты автоматически в течение нетокоротого времени.

Если не хочется ждать, то можно на клиентах выполнить команду puppet agent --test и увидеть своими глазами, как создаётся конфигурация.

6. Настройка прав доступа с помощью модуля accounts


Собственно сейчас можно ещё раз посмотреть на схему, которую мы привели в начале и на основе её создать логику.

Перейдём в пункт меню Configure → Classes. Нажмём на accounts, чтобы перейти в настройки модуля. Из всех настроек нам будут нужны вкладки accounts, ssh keys, users.

Примечание
Вкладка accounts — в ней содержаться хэши «пользователь сервера → названия публичных ключей из вкладки ssh keys». Вкладка ssh keys — в ней содержаться хэши «название ключа → тип и значение». Вкладка users — в ней содержаться пользователи, которых необходимо создать или указать для уже существующих некоторые параметры.

Откроем последнюю вкладку users и установим её как на скриншоте:

users


Этот параметр настраивает домашний каталог пользователя. Здесь мы задействовали Merge overrides и Merge default параметры, которые позволят объединить конфигурацию для конечного узла сети.

Вкладку ssh keys заполним следующим образом:

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 заполним следующим образом:

accounts


Из этого параметра следует: root имеет доступ везде с аккаунта root (аккаунт root — это элемент из вкладки ssh keys), аккаунт dbadmin имеет root-доступ только к серверам из группы database, а пользователь admin есть только у группы web и аккаунт admin может подключаться только под пользователя admin.

На вкладке users добавим пользователя admin в группу www-data.

users


6.1 Настройка класса ssh


В классе accounts мы настроили ssh-доступ по ключам. Потому для более полной безопасности необходимо запретить доступ по паролю. Делается это с помощью класса ssh. Переходим в его настройки и открываем вкладку Smart Class Parameter. Далее client options приводим к следующему виду:

client options


Вкладку server options приводим к следующему виду:

server options


И вкладку storeconfigs enabled заполняем так:

storeconfigs enabled


В storeconfigs хранятся все факты о клиентах, поэтому вы можете запросить базу данных и получить списки узлов сети, соответствующие определенным критериям. Для большей безопасности мы это отключили.

7. Результаты


В процессе выполнения данного руководства ваша инфраструктура добавленная под управление Puppet станет быстро-конфигурируемой и масштабируемой. А главная цель — управления публичными ssh ключами будет максимально удобной.

Скриншот списка ключей пользователя admin на одной из машин группы root/web:

Список ssh-ключей


Помните, при настройке класса accounts для параметра ssh keys мы включали Merge overrides и Merge default. Это нужно для того, чтобы в конце для определённого узла сети собирался один структурированный файл с ssh-ключами.

Проверим, действительно ли можно авторизоваться под пользователем “admin” с помощью добавленного ключа:

Проверка ssh-подключения


Если у вас также тест прошёл успешно, то инфраструктура готова и можно постепенно подключать остальные ваши сервера к puppet-мастеру и настраивать другие сервисы через Puppet.

Использованные ресурсы: документация Puppet, документация Foreman.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+13
Comments 26
Comments Comments 26

Articles