Привет, Хабр!

Незадолго до прихода Рождества, в IT-отделе было решено изучить Spacewalk, — это Red Hat система, бесплатный аналог Satellite, для централизованного управления конфигурациями, обновлений систем, удобной поддержкой всего серверного парка.

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

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

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

Перед тем как я начну, хотел бы вкратце осветить, что было и не было затронуто, чтобы не претендовать на полный мануал по работе со Spacewalk:

+ Установка и конфигурация сервера/клиента
+ Настройка системы в GUI
+ Траблшутинг установки/обновления пакетов, работы с конфигурациями
+ Errata (сбор информации о критический обновлениях, уязвимостях и пр.)

— Proxy (пропала надобность, после отказа от HA)
— Cobbler/kickstart
— OpenSCAP

Системные требования


В связи с тем, что вся инфраструктура работает на VMWare, то и работа проводилась на ВМ под управлением CentOS 7. Рекомендуемыми системными требованиями от разработчика являются:

  • 4GB RAM
  • 6GB свободного места для /var/satellite/
  • 12GB для БД

Я же использовал:

  • 6GB RAM
  • 4 CPU(s)
  • 40GB HDD

Также советую отключить SELinux и, если не используете, firewalld. Либо добавить http сервис в исключения.

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

Установка


Непосредственно установка описана как в официальной документации, так и на нескольких сайтах, однако для целостности статьи позволю себе упомянуть и здесь этот пункт.

Spacewalk работает с двумя СУБД: PostgreSQL и Oracle RDBMS. Я имею опыт работы с первой, ее и буду использовать сейчас.

Есть две возможности установки: как через автоматический инсталлер от Spacewalk, который и себя, и БД установит и настроит, правда, на тот же самый сервер, и установка в ручную, где можно поставить ДБ и приложение на разные сервера. Я рассмотрю оба варианта, начну с раздельной установки.

PostgreSQL


yum install -y postgresql-server

Также необходимо подключить PL/Tcl модули для PG:

yum install -y postgresql-pltcl
postgresql-setup initdb
systemctl start postgresql

Создадим БД, пользователя, и подключим модуль:


su - postgres -c 'PGPASSWORD=verystrong; createdb spcwlkdb ; createlang plpgsql spcwlkdb ; createlang pltclu spcwlkdb ; yes $PGPASSWORD | createuser -P -sDR spcwlkuser'

Дабы избежать проблем с подключением, стоит изменить /var/lib/pgsql/data/pg_hba.conf, добавив строки ДО линии all:

local spcwlkdb spcwlkuser md5
host  spcwlkdb spcwlkuser 127.0.0.1/8 md5
local spcwlkdb postgres   ident

Перезапустим все:

systemctl restart postgresql

Если вы собираетесь ставить приложение и БД на разных серверах, убедитесь, что на сервере БД установлен пакет postgresql-contrib.

Spacewalk


Подключаем репозитории:

rpm -Uvh https://copr-be.cloud.fedoraproject.org/results/@spacewalkproject/spacewalk-2.8/epel-7-x86_64/00736372-spacewalk-repo/spacewalk-repo-2.8-11.el7.centos.noarch.rpm

Также подключим epel:

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

Java:

(cd /etc/yum.repos.d && curl -O https://copr.fedorainfracloud.org/coprs/g/spacewalkproject/java-packages/repo/epel-7/group_spacewalkproject-java-packages-epel-7.repo)

Теперь непосредственно установщик для Spacewalk-postgres:

yum -y install spacewalk-setup-postgresql

Подключаемся к нашей БД:

spacewalk-setup-postgresql create --db spcwlkdb --user spcwlkuser --password verystrong

В том случае, если вы используете раздельный метод БД/приложение, то в вам будет нужно добавить флаг --standalone и указать IP адрес сервера БД, также не забудьте открыть порт 5432.

Заметка: советую провести тюнинг БД в соответствии в вашим железом для более продуктивной работы всей системы.

Теперь установим сам Spacewalk и запустим установку:

yum -y install spacewalk-postgresql
spacewalk-setup --external-postgresql

Дальше будет задано несколько вопросов, как по SSL сертификату, так и по БД. Можно вводить все значения вручную, или можно воспользоваться флагом --answer-file, и указать путь к файлу с ответами, чтобы в будущем автоматизировать установку:

admin-email = root@localhost
ssl-set-cnames = spcwlkserver
ssl-set-org = Unicorn
ssl-set-org-unit = EOH
ssl-set-city = Prague
ssl-set-state = HMP
ssl-set-country = CZ
ssl-password = verystrong
ssl-set-email = root@localhost
ssl-config-sslvhost = Y
db-backend=postgresql
db-name=spcwlkdb
db-user=spcwlkuser
db-password=verystrong
db-host=localhost
db-port=5432
enable-tftp=Y

Для управления непосредственно приложением, стоит использовать:

/usr/sbin/spacewalk-service [stop|start|restart]

Для вывода всех способствующих приложению сторонних сервисов:

spacewalk-service status

Вариант второй, автоматическая установка


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

yum -y install spacewalk-setup-postgresql
yum -y install spacewalk-postgresql
spacewalk-setup

Опять же, будут заданы вопросы касательно БД и SSL, используем ключ --answer-file и путь к файлу с ответами.

Base & Child Channels, Repos


Для управления клиентскими станциями, Spacewalk использует систему так называемых каналов, которые могут быть как основными (Base), так и дочерними (Child), к каждому каналу привязывается репозиторий, который вам нужен, а так же ключ — с помощью которого происходит сопряжение клиента с сервером.

Репозитории в итоге синхронизируются с каналами, которые, в свою очередь, связаны с клиентами, так и проходит работа Spacewalk в общем виде. Тут же стоит упомянуть errata, которые можно привязать к каналам, что упрощает обновление и контроль за пакетами.

Всех клиентов можно объединять в группы по разным признакам, причем как с одинаковыми, так и с разными каналами или репозиториями, есть возможность работать с большим количеством клиентов на раз, что очень помогает делать обновления на 100+ серверах.

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

Все действия в Spacewalk происходят по расписанию (Schedule), практически любое действие можно настроить на время, которое вам удобнее всего.

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



Введи пароль, имя администратора, имя организации (что тоже является одним из способов управления клиентами), и переходите на стартовую панель.

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

Channels — Manage Software Channels — Create Channel:



Рекомендую задавать имена каналов в соответствии с типов и видом ОС, которые будут привязаны к этому каналу, например, CentOS_7_x86_64, в качестве чексам смело можно выбирать sha256, поле Channell Summary предназначено для небольшого описания канала. также, можете по желанию указать дополнительную информацию.

Теперь создадим дочерний канал и привяжем его к основному. Идем тем же способом, как создание основного канала, только в поле Parent Channel укажем уже созданный ранее канал.

Привяжем репозитории к основному и дочернему каналам.
Channels — Manage Repositories



Для основных каналов я использую Base Resources, для дочерних — Updates.

После создания репозиториев, нужно соединить их с каналами.
Channels — Manage Software Channels, откройте ваш основной канал, откройте раздел Repositories.



Здесь будут все созданные репозитории, выбирайте нужный вам, отмечайте, и нажмите на Update Resources.

Дальше откройте подраздел Sync:



Где вы можете синхронизировать репозиторий и канал, настроить расписание для синхронизации.

Заметка: в моем случае шаловливых ручек, мне пришлось еще удалить стандартный репозиторий из клиентской системы.

Установка клиента, сопряжение клиента с сервером, управление ключами, настройка канала конфигураций


Как я уже упомянул ранее, Spacewalk использует систему ключей от Red Hat Network, с помощью которых происходит сопряжение и управление.

Чтобы создать ключ, идем в Systems — Activation Keys — Create Key:



Тут все предельно просто, разве стоит упомянуть, что сам ключ вы можете задать и сами, его формат всегда будет 1-ХХХХХ, а также, каждый ключ привязывается к каналу. Флаг Universal Default заставляет новые системы подхватывать параметры ключа.

Установка клиента

Подключим клиентский репозиторий и установим необходимые пакеты:

rpm -Uvh https://copr-be.cloud.fedoraproject.org/results/@spacewalkproject/spacewalk-2.8-client/epel-7-x86_64/00742644-spacewalk-repo/spacewalk-client-repo-2.8-11.el7.centos.noarch.rpm
yum -y install rhn-client-tools rhn-check rhn-setup rhnsd m2crypto yum-rhn-plugin rhncfg-actions deltarpm


Заметка: rhncfg-actions и deltarpm нужны для корректной работы конфигураций и удаленного управления.

Spacewalk использует rhn_check для синхронизации клиент-сервера, которая проходит каждые 4 часа. Это значение можно убавить до 60 минут, но для меня ни один, ни другой варианты не являлись оптимальными, посему есть два варианта: использовать osad, который идет вместе с Spacewalk, или попросту добавить cronjob для rhn_check, допустим, на каждую минуту, пока мы тестируем систему, потом значение можно поменять, как вам будет угодно.

crontab -e
* * * * * /usr/sbin/rhn_check

Также будет не лишним добавить /usr/bin/rhn-actions-control --enable-all в Крон тоже, он используется для развертывания конфигураций, и иногда тупит.

Возвращаемся в управление ключами, и копируем ID ключа, который мы создали, и выполняем:

rhnreg_ks --serverUrl=http://your-server-ip/XMLRPC --activationkey=1-YOURKEY --force

Только не забываем поменять значения IP и ключа на свои. Опять же, советую использовать флаг --force, так как я замечал проблемы без использования этого флага.

Возвращаемся в Systems — All, довольные замечаем нашу систему. Ее можно теперь открыть и поисследовать, что и как там, а я пока настоятельно рекомендую создать группу для более удобного управления системами.

Systems — System Goups — Create Group, заполняем имя и описание, сохраняем, открываем свежесозданную группу, идем в раздел Systems и добавляем систему в группу.

Теперь подпишем систему к каналу, Systems — Ваша система — Software папка — Software Channels подпапка:



Выбирайте ваш канал и жмите на подтверждение. Можно ради интереса попробовать установить пакет, Software — Packages — Install.

Канал конфигураций

Чтобы управлять конфигурациями между сервером-клиентом/локальной машиной, а так же удаленным управлением, стоит настроить канал конфигураций и привязать к нему систему.
Идем в Configuration — Configuration Channels — Create Config Channel, задаем имя, описание, сохраняем, потом в Configuration — Manage Configuration Channels — Subscribe to Channels и подписываем канал конфигураций к софтверному каналу, и к системе.



Теперь мы можем деплоить конфигурации как с сервера, так и с локальных машин, и создавать разделы.

Configuration — Add Files — Create File/Upload File:



Так же, можем отправлять удаленные команда в виде bash-скрипта:



Напоминаю, что все действия проходят через расписание (Schedule), список всех действий примененных относительно данной системы можно посмотреть в разделе Events:



Errata

Одна из важнейших функций в Spacewalk это поддержка errata, которая удобно привязывается к каналам, и позволяет следить за уровнем важности последних обновлений. Настраивается это прямо на сервере, помимо скриптов, нужно скачать необходимые пакеты для Перла:

yum -y install perl-Frontier-RPC perl-Text-Unidecode
wget https://raw.githubusercontent.com/stevemeier/cefs/master/errata-import.pl
chmod +x errata-import.pl

Затем создадим основной скрипт обновления и сбора errata, который будет хранится в /etc/rhn/:

#!/bin/bash
cd /etc/rhn/
wget -N http://cefs.steve-meier.de/errata.latest.xml
wget -N https://www.redhat.com/security/data/oval/com.redhat.rhsa-all.xml
export SPACEWALK_USER='root'
export SPACEWALK_PASS='verystrong'
./errata-import.pl --server  YourServerIPAddress --errata errata.latest.xml --rhsa-oval  com.redhat.rhsa-all.xml --publish
unset SPACEWALK_USER
unset SPACEWALK_PASS

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

Сделаем скрипт исполняемым, и добавим его в Cron:

chmod +x spcwlk_errata.sh
crontab -e
0 2 * * 7 /usr/bin/sh /etc/rhn/spcwlk_errata.sh

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



Итог


Важный пункт, лично на мой взгляд, который я упустил, это настройка и установка прокси, а также поднятие всей системы как HA. У меня была идея настроить приложение через pacemaker, а на БД проводить синхронизации. По итогу было решено отказаться от этой идеи, в виду не очень большого серверного парка клиентский станций. Однако, если система в ближайшие полгода покажет себя крайне полезной, возможно, придется расширить изначальный сервер.

Автоматизация


Сервер:

Bash-скрипт для развертывания сервера (ОТКЛЮЧАЕТ firewalld):

#!/bin/sh
#
rpm -Uvh https://copr-be.cloud.fedoraproject.org/results/@spacewalkproject/spacewalk-2.8/epel-7-x86_64/00736372-spacewalk-repo/spacewalk-repo-2.8-11.el7.centos.noarch.rpm
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
(cd /etc/yum.repos.d && curl -O https://copr.fedorainfracloud.org/coprs/g/spacewalkproject/java-packages/repo/epel-7/group_spacewalkproject-java-packages-epel-7.repo)
yum -y install spacewalk-setup-postgresql spacewalk-postgresql wget perl-Frontier-RPC perl-Text-Unidecode perl-XML-Simple
#
mkdir /usr/share/spcwlk-tmp/
echo 'admin-email = root@localhost
ssl-set-cnames = spcwlkserver
ssl-set-org = Unicorn
ssl-set-org-unit = EOH
ssl-set-city = Prague
ssl-set-state = SCK
ssl-set-country = CZ
ssl-password = verystrong
ssl-set-email = root@localhost
ssl-config-sslvhost = Y
db-backend=postgresql
db-name=spcwlkdb
db-user=spcwlkuser
db-password=verystrong
db-host=localhost
db-port=5432
enable-tftp=Y' > /usr/share/spcwlk-tmp/spcwlk_answer
spacewalk-setup --answer-file=/usr/share/spcwlk-tmp/spcwlk_answer
#
systemctl stop firewalld
systemctl disable firewalld
#


Bash-скрипт для установки errata (сначала задать имя и пароль для администратора Spacewalk):
#!/bin/sh
#
wget https://raw.githubusercontent.com/stevemeier/cefs/master/errata-import.pl -P /etc/rhn/
echo '#!/bin/bash
cd /etc/rhn/
wget -N http://cefs.steve-meier.de/errata.latest.xml
wget -N https://www.redhat.com/security/data/oval/com.redhat.rhsa-all.xml
export SPACEWALK_USER='gui username'
export SPACEWALK_PASS='Password to your gui account'
./errata-import.pl --server  YourServerIPAddress --errata errata.latest.xml --rhsa-oval  com.redhat.rhsa-all.xml --publish
unset SPACEWALK_USER
unset SPACEWALK_PASS' > /etc/rhn/spcwlk_errata.sh
#
chmod +x /etc/rhn/errata-import.pl
chmod +x /etc/rhn/spcwlk_errata.sh
#
echo '#!/bin/bash
#
/etc/rhn/./spcwlk_errata.sh' > /etc/rhn/spcwlk_errata_cron.sh
chmod +x /etc/rhn/spcwlk_errata_cron.sh
echo '0 2 * * 7 /usr/bin/sh /etc/rhn/spcwlk_errata_cron.sh' >> /var/spool/cron/root
/etc/rhn/./spcwlk_errata.sh
#


Ansible плейбук для развертывания сервера (не забудьте добавить answer-file):

- hosts: spcwlk-server
  tasks:
   - name: Install Spacewalk repo
     yum:
      name: https://copr-be.cloud.fedoraproject.org/results/@spacewalkproject/spacewalk-2.8/epel-7-x86_64/00736372-spacewalk-repo/spacewalk-repo-2.8-11.el7.centos.noarch.rpm
      state: present

   - name: Install epel repo
     yum:
      name: https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
      state: present

   - name: Install PostgreSQL packages
     yum:
      name:
      - spacewalk-setup-postgresql
      - spacewalk-postgresql
      - wget
      - perl-Frontier-RPC
      - perl-Text-Unidecode
      - perl-XML-Simple

   - name: Creates directory for Spacewalk answer file
     file:
       path: /usr/share/spcwlk-tmp/
       state: directory
       mode: 0755

   - name: Deploy answer file
     copy:
       src: /etc/ansible/spcwlk_answer
       dest: /usr/share/spcwlk-tmp/spcwlk_answer

   - name: Spacewalk Server Deploy
     shell: spacewalk-setup --answer-file=/usr/share/spcwlk-tmp/spcwlk_answer

   - name: Stop firewalld
     systemd:
       name: firewalld
       state: stopped
       enabled: no


Клиент:

Bash-скрипт для развертывания клиента (не забываем про IP и ключ):
#!/bin/sh
#
rpm -Uvh https://copr-be.cloud.fedoraproject.org/results/@spacewalkproject/spacewalk-2.8-client/epel-7-x86_64/00742644-spacewalk-repo/spacewalk-client-repo-2.8-11.el7.centos.noarch.rpm
yum -y install rhn-client-tools rhn-check rhn-setup rhnsd m2crypto yum-rhn-plugin rhncfg-actions deltarpm wget
echo '#!/bin/bash
#
/usr/sbin/rhn_check' > rhn_check.sh
mv rhn_check.sh /etc/cron.hourly/
chmod +x /etc/cron.hourly/rhn_check.sh
echo '* * * * * /usr/bin/sh /etc/cron.hourly/rhn_check.sh' >> /var/spool/cron/root
/usr/bin/rhn-actions-control --enable-all
cd /usr/share/rhn/
wget http://YourServerIPAddress/pub/RHN-ORG-TRUSTED-SSL-CERT
rhnreg_ks --serverUrl=http://172.22.64.41/XMLRPC --activationkey=1-xxxxxxxxxxxxxxxxxxxxxxxxxxxx --force


Anisble плейбук для развертывания клиента:

- hosts: spcwlk-clients
  tasks:
    - name: Install spacewalk repo
      yum:
       name: https://copr-be.cloud.fedoraproject.org/results/@spacewalkproject/spacewalk-2.8-client/epel-7-x86_64/00742644-spacewalk-repo/spacewalk-client-repo-2.8-11.el7.centos.noarch.rpm
       state: present

    - name: Install client packages
      yum:
        name:
          - rhn-client-tools
          - rhn-check
          - rhn-setup
          - rhnsd
          - m2crypto
          - yum-rhn-plugin
          - rhncfg-actions
          - deltarpm
          - wget

    - name: Create cronjob for rhn_check
      cron:
        name: "rhn_check"
        minute: "*"
        hour: "*"
        day: "*"
        month: "*"
        weekday: "*"
        job: "/usr/sbin/rhn_check"

    - name: Enable controls for config and remote control deployment
      shell: /usr/bin/rhn-actions-control --enable-all

    - name: Get certificate from server to client
      get_url:
        url: http://YourServerIPAddress/pub/RHN-ORG-TRUSTED-SSL-CERT
        dest: /usr/share/rhn/

    - name: Register client to server
      rhn_register:
        state: present
        server_url: http://YourServerIPAddress/XMLRPC
        activationkey: "{{ activation_key }}"


Всем спасибо за прочтение статьи. Удачи!

Комментарии (7)


  1. SlavikF
    09.01.2019 23:16
    +1

    Spacewalk — для централизованного управления конфигурациями, обновлений систем, удобной поддержкой всего серверного парка.

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


    Как-то заумно написано… Это наверное, чтобы я не понял.

    Просмотрел статью.

    И так и не понял зачем нужна эта система?

    Может приведёте пару примеров — какие вопросы решает эта система?


    1. gecube
      10.01.2019 07:59

      Полностью поддержу. Я абсолютно не понял из статьи зачем нужна эта система. Ну, ок, положим она решает частную задачу — контроль за обновлениями софта на парке серверов, причем сервера можно объединять в группы. Тогда чем это лучше локального клона всех необходимых репозиториев + scm, который будет следить за актуальностью конфигурации и версий ПО на целевых серверах ?!
      Я уж не говорю о том, что в статье наличествуют прям сомнительные рекомендации (вроде отключения selinux — стоило написать, что это норм для теста, но не для продакшн) и не раскрыт вопрос: как spacewalk организует репозитории? Он сам их, что ли, хранит?


  1. Meklon
    10.01.2019 08:26

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


    1. sazanstheme Автор
      10.01.2019 14:01

      Как remote control, я предполагаю. Несколько задач в расписание задать.


    1. gecube
      10.01.2019 17:37

      Рекомендую посмотреть в сторону AWS (Ansible Tower).
      Тем более, что сам Ред Хат рекомендует ansible как средство для организации управлением lifecycle приложения


      1. Meklon
        11.01.2019 10:28

        Ansible Tower стоит очень негуманно, насколько я помню. Машин много, поэтому это критичный вопрос.


        1. gecube
          11.01.2019 15:31

          Извините, не AWS, а AWX. И, да, он бесплатен.
          github.com/ansible/awx
          habr.com/company/pixonic/blog/352184