Сборка своего RPM-пакета Prometheus Server с шаблоном для firewalld и автозапуском
Используемые термины: Prometheus, CentOS.
Ранее мы уже рассматривали установку Prometheus и пример создания собственного RPM-пакета. В данной инструкции будет приведен пример создания пакета для установки серверной части Prometheus на Linux CentOS.
Наш собранный пакет позволит:
- Быстро и без лишних усилий установить бинарник Prometheus на систему CentOS.
- Запускать систему мониторинга в качестве сервиса.
- Разрешать правила брандмауэра при помощи сервиса.
Так как более подробное описание процесса сборки RPM-пакета есть в инструкции, ссылку на которую можно увидеть выше, мы не будем останавливаться на подробном описании сценария.
Предварительная подготовка
Чтобы не захламить систему, стоит выполнять сборку в тестовом окружении или контейнере Docker.
Стоит иметь ввиду, что процесс сборки, если допустить ошибку, может привести к выполнению потенциально опасных команд. Стоит выполнять сборку от пользователя с обычными правами.
Так или иначе, нам нужны утилиты:
yum install rpmdevtools rpmlint
Перейдем в каталог, в котором мы будем выполнять сборку, например:
cd /opt
Создадим структуру каталогов для сборки:
rpmdev-setuptree
Наши система готова.
Сборка Prometheus
Сборку выполним в несколько небольших шагов.
1. Создаем файл SPEC:
vi rpmbuild/SPECS/prometheus.spec
%{!?version: %define version 2.31.1}
%{!?release: %define release %(date +%%Y%%m%%d)}
Name: prometheus
Version: %{version}
Release: %{release}%{?dist}
Summary: Power your metrics and alerting with the leading open-source monitoring solution.
License: Apache 2.0
Vendor: Dmitriy Mosk
URL: https://prometheus.io/download/
Source0: https://github.com/prometheus/prometheus/releases/download/v%{version}/prometheus-%{version}.linux-amd64.tar.gz
Source1: firewalld
Source2: systemd
%description
Prometheus is an open-source systems monitoring and alerting toolkit originally
built at SoundCloud. Since its inception in 2012, many companies and
organizations have adopted Prometheus, and the project has a very active
developer and user community. It is now a standalone open source project and
maintained independently of any company. To emphasize this, and to clarify the
project's governance structure, Prometheus joined the Cloud Native Computing
Foundation in 2016 as the second hosted project, after Kubernetes.
%define owner prometheus
%prep
%{__mkdir_p} %{name}-%{version}/{firewalld,systemd}
%{__tar} -xzvf %{SOURCE0} -C %{_builddir}/%{name}-%{version} --strip-components 1
cp %{SOURCE1}/* %{_builddir}/%{name}-%{version}/firewalld/
cp %{SOURCE2}/* %{_builddir}/%{name}-%{version}/systemd/
%install
# Install Prometheus
%{__rm} -rf %{buildroot}
%{__mkdir_p} %{buildroot}/usr/local/bin
%{__mkdir_p} %{buildroot}/etc/prometheus/{console_libraries,consoles}
%{__mkdir_p} %{buildroot}%{_sharedstatedir}/prometheus
%{__install} -m755 %{_builddir}/%{name}-%{version}/prometheus %{buildroot}/usr/local/bin/
%{__install} -m755 %{_builddir}/%{name}-%{version}/promtool %{buildroot}/usr/local/bin/
%{__install} -m755 %{_builddir}/%{name}-%{version}/prometheus.yml %{buildroot}/etc/prometheus/
%{__install} -m755 -D %{_builddir}/%{name}-%{version}/console_libraries/* -t %{buildroot}/etc/prometheus/console_libraries
%{__install} -m755 -D %{_builddir}/%{name}-%{version}/consoles/* -t %{buildroot}/etc/prometheus/consoles
# Install firewalld srv
%{__mkdir_p} %{buildroot}%{_usr}/lib/firewalld/services
%{__install} -m644 %{_builddir}/%{name}-%{version}/firewalld/prometheus-server.xml %{buildroot}%{_usr}/lib/firewalld/services/
# Install systemd service
%{__mkdir_p} %{buildroot}%{_unitdir}
%{__install} -m644 %{_builddir}/%{name}-%{version}/systemd/prometheus.service %{buildroot}%{_unitdir}/
%pre
/usr/bin/getent group %{owner} &>/dev/null \
|| /usr/sbin/groupadd -r %{owner}
/usr/bin/getent passwd %{owner} &>/dev/null \
|| /usr/sbin/useradd -r -g %{owner} \
-c "Prometheus service account" -s /sbin/nologin %{owner}
%post
%systemd_post prometheus.service
test -f %{_bindir}/firewall-cmd && firewall-cmd --reload --quiet || :
%preun
%systemd_preun prometheus.service
if [ $1 -eq 0 ] && [ -x %{_bindir}/firewall-cmd ]; then
# Firewalld services uninstall
firewall-cmd --permanent --remove-service=prometheus-server
fi
%postun
%systemd_postun_with_restart prometheus.service
if [ $1 -eq 0 ] && [ -x /bin/firewall-cmd ]; then
# Firewalld services reload
firewall-cmd --reload --quiet
fi
%clean
%{__rm} -rf $RPM_BUILD_ROOT
%{__rm} -rf $RPM_BUILD_DIR/*
%files
%defattr(-,%{owner},%{owner})
%attr(644,root,root) %{_usr}/lib/firewalld/services/prometheus-server.xml
%attr(644,root,root) %{_unitdir}/prometheus.service
%{_usr}/local/bin/prometheus
%{_usr}/local/bin/promtool
%dir %{_sharedstatedir}/prometheus
%config %{_sysconfdir}/prometheus/console_libraries
%config %{_sysconfdir}/prometheus/consoles
%config %{_sysconfdir}/prometheus/prometheus.yml
%changelog
* Mon Nov 22 2021 Dmitriy Mosk <master@dmosk.ru>
- Create RPM specification
Краткое описание: в зависимости от переданной сборщику версии, будет выбраны нужные нам исходники, в противном случае будет версия 2.31.1 (самая свежая на момент обновления инструкции). При сборке будут извлечены бинарники и конфигурационные файлы, также будут разложены по местам шаблон для брандмауэра и юнита systemd.
2. Подготовка исходников
В нашем spec-файле мы используем 3 источника с исходниками. Нам нужно их подготовить. Для начала, скачаем архив Prometheus:
spectool -g -R rpmbuild/SPECS/prometheus.spec
Создаем каталоги:
mkdir rpmbuild/SOURCES/{firewalld,systemd}
Создаем файл с шаблоном для брандмауэра:
vi rpmbuild/SOURCES/firewalld/prometheus-server.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>prometheus-server</short>
<description>Prometheus Server</description>
<port protocol="tcp" port="9090"/>
</service>
* в данном примере будет создан шаблон для открытия порта 9090, на котором, по умолчанию, работает prometheus.
Создаем файл с юнитом systemd:
vi rpmbuild/SOURCES/systemd/prometheus.service
[Unit]
Description=Prometheus Service
After=network.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
Можно переходить к самой сборке.
3. Сборка пакета
Выполняем команду:
rpmbuild -bb rpmbuild/SPECS/prometheus.spec
Мы должны увидеть процесс сборки, после чего в каталоге rpmbuild/RPMS/x86_64 мы должны увидеть собранный пакет, например, prometheus-2.31.1-20211125.el7.x86_64.rpm.
Установка
У нас есть несколько способов установить собранный пакет:
- Скопировать его в собственный репозиторий, чтобы использовать команду yum install prometheus.
- Скопировать пакет на целевой компьютер и использовать команду yum localinstall prometheus-2.31.1-20211125.el7.x86_64.rpm.
После установки запускаем сервис:
systemctl enable prometheus --now
Разрешаем порты в брандмауэре:
firewall-cmd --permanent --add-service=prometheus-server
firewall-cmd --reload
Для теста работы службы выполняем:
systemctl status prometheus
Для проверки запуска на порту 9090 (порт работы prometheus по умолчанию):
ss -tunlp | grep :9090
Для работы веб-интерфейса открываем браузер и переходим по ссылку http://<IP-адрес сервера>:9090.