Foreman linux что это

Обновлено: 12.05.2024

В этой статье будет рассмотрена установка и настройка связки Puppet + Foreman для централизованного управления конфигурациями.

Для сервера, на котором будет установлена связка Puppet + Foreman, будет использоваться виртуальная машина (1 CPU, 2 Gb RAM, 20Gb HDD), в качестве клиентов будут физические ПК на которых установлена Ubuntu. Конфигурация моего виртуального сервера с указанными выше характеристиками позволяет без проблем обслуживать 500 клиентов (можно и больше).

Установка Puppet довольно простая (все последующие команды выполняются от root):

Этими командами мы скачиваем deb пакет с сайта разработчиков puppet и устанавливаем его. Данный пакет puppetlabs-release-trusty.deb при установке создает файл /etc/apt/sources.list.d/puppetlabs.list в котором прописаны репозитории puppet, а также импортируется gpg ключ которым подписан репозиторий puppet. Сам puppetmaster мы не устанавливаем, он будет установлен автоматически при установке Foreman.

На этом установка Puppet закончена, приступим к установке веб-интерфейса Foreman:

Здесь мы добавили файл /etc/apt/sources.list.d/foreman.list в который вписали репозитории от Foreman, а также добавили ключ от данного репозитория. После добавления репозитория мы обновили список пакетов и установили foreman-installer — это пакет который позволяет установить Foreman.

Далее нам нужно настроить правильное имя компьютера. Прописываем в /etc/hosts и /etc/hostname

Перезагружаем наш сервер.

Запускаем наш установщик коммандой foreman-installer -i.

Нас спрашивают — готовы ли мы к установке, отвечаем «y», далее следует меню в котором можно выбрать дополнительные конфигурации Foreman и дополнительные модули. Мы же устанавливаем стандартную конфигурацию, поэтому выбираем пункт «Save and run» и у нас начинается установка (можно было ставить командой foreman-installer без опции -i, тогда у нас поставится базовая установка, -i подразумевает интерактивный режим).


При последующем входе в Foreman мы получим другой интерфейс:


Здесь в списке будут отображаться наши клиенты.

Вот мы и завершили установку связки Puppet + Foreman. Давайте попробуем добавить клиента puppet и посмотреть что поменяется в веб-интерфейсе.

Для установки Puppet агентов на клиентские ПК я использую следующий скрипт:

Этот скрипт устанавливает puppet agent, настраивает автозапуск агента при старте системы, указывает адрес Puppet сервера и запускает агента. Также мы закомментируем в конфиге /etc/puppet/puppet.conf строку templatedir, если не закомеентировать — сыпятся ошибки (как фиксить без комментирования я не разобрался, хотя оно меня не раздражает).

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

Для просмотра сертификатов на сервере можно использовать комманду puppet cert --list --all:

Для подписи сертификата можно использовать комманду puppet cert --sign $client_name. Также для подписи сертификатов мы можем использовать веб-интерфейс от Foreman, для этого нам нужно перейти в меню «Инфраструктура» — «Капсули» — «Сертификаты» и здесь можно подписать или удалить сертификат.


Жмем «Подписать», в результате при просмотре списка сертификатов в консоли у нас будет 2 подписаных сертификата:

Переходим в меню «Узлы» — «Все узлы» — здесь мы видим 2 сервера (новый сервер может появиться не сразу, а через некоторое время, для того чтобы он появился сразу, нужно после подписи сертификата выполнить на клиенте команду puppet agent -t).


Поумолчанию Foreman берет манифесты из папки /etc/puppet/environments далее в записимоти от окружения. Сейчас мы добавим манифест в Foreman и попробуем применить его для одного из наших клиентов. Создаем папку mkdir -p /etc/puppet/environments/production/modules/vsftpd/manifests, в эту папку закидаем файл init.pp:


Отметить птичкой нужное нам окружение и нажать «Обновить».


В результате мы получим список доступных классов Puppet с указанием окружений, узлов к которым они применены и т.д.


Давайте добавим наш манифест в одному из клиентов. Для этого переходим в «Узлы» — «Все узлы», жмем на имени нужного нам узла и у нас открывается страница с детальной характеристикой узла.


Жмем кнопу «Изменить», попадаем на другую страницу с настройками указанного узла, тут жмем на вторую вкладку «Классы Puppet» и видим наш класс «vsftpd».


Выбираем наш клас (значок +), он перемещается в левую сторону с «Доступных классов» в «Включенные классы», подтверждаем изменения.

Все — наш манифест добавлен для выбраного сервера, остается подождать пока он будет применен на клиенте. Если мы не хотим ждать, можно зайти на клиент и выполнить комманду puppet agent -t, сразу после ее выполнения манифест будет применен к клиенту и на нем будет установлення vsftpd (в нашем случае).

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


Foreman is a complete lifecycle management tool for physical and virtual servers. We give system administrators the power to easily automate repetitive tasks, quickly deploy applications, and proactively manage servers, on-premise or in the cloud.

The 2021 community survey is now live! Please take a few minutes to fill it out and help us make Foreman better!


Provision from anywhere

Bare metal (MaaS), Amazon EC2, Google Compute Engine, OpenStack, Libvirt, oVirt, VMware, and many other providers allow you to manage a hybrid cloud through Foreman.



Configuration

An external node classifier, hiera-like parameters, and reports monitoring for Puppet, Salt and Chef are included. Completely ready to tweak host groups in your data center.



Monitor hosts

Foreman reports will tell you exactly what happened in your nodes, and alert you when things go awry. See in your dashboard which hosts are healthy, and which ones are outdated.


UIs slow you down? Hammer CLI gives you easy access to all the API calls you need to stay on top of your data center.

We provide a RESTful API to give you the power to automate most tasks, such as registering hosts, assigning roles to users, and more.

RBAC and LDAP integration

A thorough authorization system based on role based access control (RBAC) allows for tight policies for your Foreman users. If you use LDAP or FreeIPA, you can continue using them for authentication and authorization.

Audits

No more wondering why did your load balancer suddenly become a database. Check how, who and when in our audits system.

Plugins

A pluggable architecture allows you to extend Foreman in almost any direction. Visit our list of plugins for a glimpse.

Host groups

Horizontal scaling is an ubiquitous architecture in IT. Group your hosts and modify their configuration as if they were just one with Foreman.


Provisioning

Provision on bare-metal (MaaS) & public or private clouds all from one place with one simple process.


Configuration

A complete configuration management solution including an ENC for Puppet and Salt, built-in support for parameterized classes and hierarchical parameter storage.


Monitoring

Collect Puppet, Chef, Salt and Ansible reports and facts. Monitor host configuration, report status, distribution and trends.

The 2021 community survey is now live! Please take a few minutes to fill it out and help us make Foreman better!

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 и установим его в систему:


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



Настроим конфигурацию для просмотра в Foreman различий изменений файлов:



Если авторизация прошла успешно, значит Foreman установлен и работает должным образом. Теперь можно переходить к следующей главе.

2. Настройка Foreman

По умолчанию Foreman использует свой SSL-сертификат, сгенерированный Puppet и ваш браузер не будет принимать его. Вы можете добавить корневой сертификат ( /var/lib/puppet/ssl/certs/ca.pem ) в свой браузер, чтобы исчезли предупреждения небезопасного соединения (для Chromium добавлять сюда: Настройки/SSL/Центры сертификации).

При первом входе вы увидите страницу Dashboard, где будет показана общая статистика по всем узлам сети. При добавления узлов сети, здесь будет полезная статистическая информация.



При последующих входах вы будете перенаправляться на страницу списка узлов сети.

2.1. Смена пароля

Первым делом необходимо изменить пароль пользователя:



Пароль по умолчанию и так сложный, но лучше сделать свой.

2.2. Добавление модуля на примере NTP

Время должно быть точно установлено на главном сервере puppet-мастер. Для этого необходимо использовать NTP. Если время неверно, puppet-мастер может ошибочно выдавать сертификаты агентов из далекого прошлого или будущего, которые другие узлы будут считать устаревшими.

Установим модуль saz/ntp на puppet master:

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





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



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



Отмечаем пункт Override и в Default value по примеру предыдущего значения, добавляем сервера из шага выше. Я добавил такое значение:


Нажимаем Submit внизу страницы, тем самым мы переопределили параметр класса.

2.3. Добавление модуля accounts и ssh

На примере предыдущего модуля установим модуль accounts:


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



Установим модуль ssh:


После этого идём в Foreman и импортируем новые классы. Позже, после создания групп узлов сети, мы настроим классы accounts и ssh.

2.4. Добавление модуля mysql и apache

Для объяснения последующих названий групп database и web добавим модули apache и mysql. Добавляем модули по примеру предыдущих. Загрузить их можно командами:

3. Добавление узлов сети

Чтобы добавить узел сети в Puppet, необходимо установить puppet-агент на этот узел. Для установки puppet-агента скачаем и установим репозиторий puppet-labs:


Затем установим puppet-агент:


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

Заменим значение переменной START с no на yes, чтобы запустить puppet-агент после перезагрузки ОС. А также запустим puppet-агент:

После этого идём на Foreman в Infrastructure → Smart Proxies → Certificates:



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



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 обязателен.

Пример того, как выглядит один публичный ключ (остальные добавляются друг за другом ниже):


Самую верхнюю вкладку 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.

Не секрет, что у каждого разработчика есть свой арсенал инструментов, позволяющий ему так или иначе сделать свою жизнь проще. Сегодня мы поговорим о таком инструменте, как Foreman. Используя его, вы можете объявить в одном месте все процессы, которые необходимы для запуска вашего приложения. Для этого используется так называемый Procfile, который выглядит как-то так:


Как видите, все довольно просто, в каждой строчке файла содержится по названию типа процесса и строка для его запуска.

▌ Установка и использование

Чтобы начать им пользоваться, достаточно его установить, воспользовавшись для этого вашим системным пакетным менеджером или с помощью rubygems:


Если ваше приложение использует Foreman, то его запуск, при наличии готового Procfile, будет выглядеть довольно просто:


Вот как выглядит запуск всех процессов:


Foreman установит необходимые переменные окружения, запустит все процессы, ассоциированные с вашим приложением, а также отобразит вывод стандартных потоков (stdout и stderr) каждого. Как можно заметить, имена процессов раскрашиваются в различные цвета, что позволяет визуально их отличить. Значение переменной $PORT автоматически устанавливается Foreman отдельно для каждого запускаемого процесса.

Необходимо заметить, что ваши процессы не должны сами демонизироваться, потому как Foreman не сможет в таком случае управлять циклом их запуска-остановки.

▌ Развертывание

Foreman может экспортировать ваши задания на запуск в upstart, а также в классический юниксовый init (впрочем, так делать не рекомендуется), bluepill, runit и supervisord. Поддержка systemd также на подходе.

Экспорт в upstart

После экспорта в upstart, становятся доступными следующие команды:

Экспорт в inittab

▌ Возможности

Параллелизм



Foreman позволяет контролировать число запускаемых экземпляров каждого типа процесса, что тоже перекликается с идеей масштабирования с помощью процессов. Кстати говоря, данный подход уже успел полюбиться пользователям Heroku.

Переменные окружения

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

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


Хорошей практикой здесь будет создание и постановка на учет в систему контроля версий файла sample.env , который будет содержать пример конфигурации вашего приложения. Таким образом, для его развертывания в новом окружении, необходимо будет скопировать файл sample.env в .env , отредактировать его в соответствии с вашим окружением, после чего запустить Foreman.

Вы также можете попросить Foreman запустить процессы с переменными окружения из другого файла:

Назначение портов

По умолчанию Foreman назначает порты процессам, начиная с 5000, и делает это блоками в 100 штук на каждый тип процесса, причем в том порядке, в котором они перечислены в Procfile.

Скажем, для Procfile из примера выше, процесс web.1 получит 5000-ый порт, worker.1 — 5100-ый, а habr.1 — 5200-ый. Если вы запустите два процесса habr, то процессу habr.2 будет назначен порт с номером 5201.

Вы также можете выбрать стартовый порт вручную, например:

▌ Заключение

Как видите, в использовании таких вот хороших практик нет абсолютно ничего сложного, а времени данная штука позволяет сэкономить достаточно, чтобы оказаться в арсенале продвинутого разработчика.

Для получения более подробной информации обо всех доступных возможностях, вы можете обратиться к документации, а также на страницу репозитория проекта на github.

Читайте также: