Most of you probably heard of Red Hat Satellite, a product which is used to manage Linux infrastructures. Maybe you also heard about SUSE Manager, which does more or less the same thing. Both solutions traditionally used Spacewalk as the underlying system management solution, but Spacewalk discontinued on May 31 2020. While Red Hat went for Foreman as a replacement for Spacewalk, the openSUSE community decided to fork Spacewalk and to create a new project called Uyuni, which as based on the Salt stack. The home of Uyuni is here, and what looks really promising is the support for various Linux distributions.

For the demo setup used in this post, we’ll use the OpenSUSE Leap 15.4 AWS AMI. Once this is up and running make sure that the system is patched to the latest release (make also sure that you meet the system requirements):

ec2-user@uyuni-server:~> sudo zypper update -y
ec2-user@uyuni-server:~> sudo reboot
ec2-user@uyuni-server:~> uname -a
Linux uyuni-server 5.14.21-150400.24.38-default #1 SMP PREEMPT_DYNAMIC Fri Dec 9 09:29:22 UTC 2022 (e9c5676) x86_64 x86_64 x86_64 GNU/Linux
ec2-user@uyuni-server:~> cat /etc/os-release
NAME="openSUSE Leap"
VERSION="15.4"
ID="opensuse-leap"
ID_LIKE="suse opensuse"
VERSION_ID="15.4"
PRETTY_NAME="openSUSE Leap 15.4"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:opensuse:leap:15.4"
BUG_REPORT_URL="https://bugs.opensuse.org"
HOME_URL="https://www.opensuse.org/"
DOCUMENTATION_URL="https://en.opensuse.org/Portal:Leap"
LOGO="distributor-logo-Leap"

It is essential that “hostname -f” returns the fully qualified domain name of the system. In our case this was done by setting up “/etc/hosts”:

ec2-user@uyuni-server:~> cat /etc/hosts | grep uyuni
10.0.1.235      uyuni-server.it.dbi-services.com uyuni-server
ec2-user@uyuni-server:~> hostname -f
uyuni-server.it.dbi-services.com

The installation itself is quite simple, as everything is installed using zypper:

ec2-user@uyuni-server:~> sudo bash
uyuni-server:/home/ec2-user $ repo=repositories/systemsmanagement:/
uyuni-server:/home/ec2-user $ repo=${repo}Uyuni:/Stable/images/repo/Uyuni-Server-POOL-x86_64-Media1/
uyuni-server:/home/ec2-user $ zypper ar https://download.opensuse.org/$repo uyuni-server-stable
Adding repository 'uyuni-server-stable' ................................................................................................................................................................................................................................[done]
Repository 'uyuni-server-stable' successfully added

URI         : https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable/images/repo/Uyuni-Server-POOL-x86_64-Media1/
Enabled     : Yes
GPG Check   : Yes
Autorefresh : No
Priority    : 99 (default priority)

Repository priorities are without effect. All enabled repositories share the same priority.
uyuni-server:/home/ec2-user $ zypper ref
Repository 'Update repository of openSUSE Backports' is up to date.                                                                                                                                                                                                           
Repository 'Debug Repository' is up to date.                                                                                                                                                                                                                                  
Repository 'Update Repository (Debug)' is up to date.                                                                                                                                                                                                                         
Repository 'Non-OSS Repository' is up to date.                                                                                                                                                                                                                                
Repository 'Main Repository' is up to date.                                                                                                                                                                                                                                   
Retrieving repository 'Update repository with updates from SUSE Linux Enterprise 15' metadata ..........................................................................................................................................................................[done]
Building repository 'Update repository with updates from SUSE Linux Enterprise 15' cache ...............................................................................................................................................................................[done]
Repository 'Source Repository' is up to date.                                                                                                                                                                                                                                 
Repository 'Main Update Repository' is up to date.                                                                                                                                                                                                                            
Repository 'Update Repository (Non-Oss)' is up to date.                                                                                                                                                                                                                       

New repository or package signing key received:

  Repository:       uyuni-server-stable
  Key Fingerprint:  62F0 28DE 22F8 BF49 B88B C9E5 972E 5D6C 0D20 833E
  Key Name:         systemsmanagement:Uyuni OBS Project <systemsmanagement:[email protected]>
  Key Algorithm:    RSA 2048
  Key Created:      Fri Oct  7 14:00:36 2022
  Key Expires:      Sun Dec 15 14:00:36 2024
  Rpm Name:         gpg-pubkey-0d20833e-63403104



    Note: Signing data enables the recipient to verify that no modifications occurred after the data
    were signed. Accepting data with no, wrong or unknown signature can lead to a corrupted system
    and in extreme cases even to a system compromise.

    Note: A GPG pubkey is clearly identified by its fingerprint. Do not rely on the key's name. If
    you are not sure whether the presented key is authentic, ask the repository provider or check
    their web site. Many providers maintain a web page showing the fingerprints of the GPG keys they
    are using.

Do you want to reject the key, trust temporarily, or trust always? [r/t/a/?] (r): t
Retrieving repository 'uyuni-server-stable' metadata ...................................................................................................................................................................................................................[done]
Building repository 'uyuni-server-stable' cache ........................................................................................................................................................................................................................[done]
All repositories have been refreshed.
uyuni-server:/home/ec2-user $ zypper in patterns-uyuni_server
...
Overall download size: 598.2 MiB. Already cached: 0 B. After the operation, additional 1.4 GiB will be used.
Continue? [y/n/v/...? shows all options] (y): y
Do you agree with the terms of the license? [yes/no] (no): yes
Retrieving package bzip2-1.0.8-150400.1.122.x86_64                                                                                                                                                                                     (1/493),  44.6 KiB ( 73.1 KiB unpacked)
Retrieving: bzip2-1.0.8-150400.1.122.x86_64.rpm ............................................................................................................................................................................................................[done (2.6 KiB/s)]
Retrieving package grub2-i386-efi-2.06-150400.9.9.noarch                                                                                                                                                                               (2/493), 997.1 KiB (  3.7 MiB unpacked)
Retrieving: grub2-i386-efi-2.06-150400.9.9.noarch.rpm ......
...
uyuni-server:/home/ec2-user $ reboot

That’s it for the installation. Once the system is up again, Uyuni needs to be configured. We’ll do it with YaST (Make sure you enable and start the firewall, otherwise the setup will fail):

ec2-user@uyuni-server:~> sudo systemctl status firewalld
○ firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: disabled)
     Active: inactive (dead)
       Docs: man:firewalld(1)
ec2-user@uyuni-server:~> sudo systemctl enable firewalld
Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service.
Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service.
ec2-user@uyuni-server:~> sudo systemctl start firewalld
ec2-user@uyuni-server:~> sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: disabled)
     Active: active (running) since Wed 2022-12-28 10:19:47 UTC; 4s ago
       Docs: man:firewalld(1)
   Main PID: 2322 (firewalld)
      Tasks: 2 (limit: 4915)
     CGroup: /system.slice/firewalld.service
             └─ 2322 /usr/bin/python3 /usr/sbin/firewalld --nofork --nopid

Dec 28 10:19:47 uyuni-server systemd[1]: Starting firewalld - dynamic firewall daemon...
Dec 28 10:19:47 uyuni-server systemd[1]: Started firewalld - dynamic firewall daemon.
ec2-user@uyuni-server:~> sudo yast

This will bring up the YaST user interface and Uyuni can be configured as follows (we’ll ignore the warnings about disk and swap space as this is just for a demo):

When everything went fine, a couple of services have been started, including a PostgreSQL instance which holds the configuration:

ec2-user@uyuni-server:~> ps -ef | egrep "postgres|salt|httpd"
postgres  7352     1  0 10:23 ?        00:00:00 /usr/lib/postgresql14/bin/postgres -D /var/lib/pgsql/data
postgres  7353  7352  0 10:23 ?        00:00:00 postgres: logger 
postgres  7355  7352  0 10:23 ?        00:00:00 postgres: checkpointer 
postgres  7356  7352  0 10:23 ?        00:00:00 postgres: background writer 
postgres  7357  7352  0 10:23 ?        00:00:00 postgres: walwriter 
postgres  7358  7352  0 10:23 ?        00:00:00 postgres: autovacuum launcher 
postgres  7359  7352  0 10:23 ?        00:00:00 postgres: archiver 
postgres  7360  7352  0 10:23 ?        00:00:00 postgres: stats collector 
postgres  7361  7352  0 10:23 ?        00:00:00 postgres: logical replication launcher 
salt      7474     1  0 10:23 ?        00:00:01 /usr/bin/python3 /usr/bin/salt-api
salt      7479     1  0 10:23 ?        00:00:01 /usr/bin/python3 /usr/bin/salt-master
salt      7541  7479  0 10:23 ?        00:00:00 /usr/bin/python3 /usr/bin/salt-master
salt      7554  7479  0 10:23 ?        00:00:00 /usr/bin/python3 /usr/bin/salt-master
salt      7555  7479  0 10:23 ?        00:00:00 /usr/bin/python3 /usr/bin/salt-master
salt      7558  7474  0 10:23 ?        00:00:02 /usr/bin/python3 /usr/bin/salt-api
salt      7559  7479  0 10:23 ?        00:00:00 /usr/bin/python3 /usr/bin/salt-master
salt      7560  7479  0 10:23 ?        00:00:01 /usr/bin/python3 /usr/bin/salt-master
salt      7561  7479  0 10:23 ?        00:00:04 /usr/bin/python3 /usr/bin/salt-master
salt      7562  7479  0 10:23 ?        00:00:00 /usr/bin/python3 /usr/bin/salt-master
salt      7563  7562  0 10:23 ?        00:00:00 /usr/bin/python3 /usr/bin/salt-master
postgres  7573  7352  0 10:23 ?        00:00:00 postgres: uyuni uyuni ::1(48654) idle
salt      7574  7562  0 10:23 ?        00:00:03 /usr/bin/python3 /usr/bin/salt-master
salt      7575  7562  0 10:23 ?        00:00:03 /usr/bin/python3 /usr/bin/salt-master
salt      7576  7562  0 10:23 ?        00:00:04 /usr/bin/python3 /usr/bin/salt-master
salt      7577  7562  0 10:23 ?        00:00:04 /usr/bin/python3 /usr/bin/salt-master
salt      7578  7562  0 10:23 ?        00:00:03 /usr/bin/python3 /usr/bin/salt-master
salt      7579  7562  0 10:23 ?        00:00:04 /usr/bin/python3 /usr/bin/salt-master
salt      7582  7562  0 10:23 ?        00:00:03 /usr/bin/python3 /usr/bin/salt-master
salt      7583  7562  0 10:23 ?        00:00:03 /usr/bin/python3 /usr/bin/salt-master
postgres  9088  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(40206) idle in transaction
postgres  9090  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(40238) idle in transaction
postgres  9091  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(40240) idle
root      9167     1  0 10:24 ?        00:00:00 /usr/sbin/httpd-prefork -DSYSCONFIG -DSSL -DISSUSE -C PidFile /run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
wwwrun    9180  9167  0 10:24 ?        00:00:00 /usr/sbin/httpd-prefork -DSYSCONFIG -DSSL -DISSUSE -C PidFile /run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
wwwrun    9182  9167  0 10:24 ?        00:00:00 /usr/sbin/httpd-prefork -DSYSCONFIG -DSSL -DISSUSE -C PidFile /run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
wwwrun    9183  9167  0 10:24 ?        00:00:00 /usr/sbin/httpd-prefork -DSYSCONFIG -DSSL -DISSUSE -C PidFile /run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
wwwrun    9184  9167  0 10:24 ?        00:00:00 /usr/sbin/httpd-prefork -DSYSCONFIG -DSSL -DISSUSE -C PidFile /run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
wwwrun    9185  9167  0 10:24 ?        00:00:00 /usr/sbin/httpd-prefork -DSYSCONFIG -DSSL -DISSUSE -C PidFile /run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
root      9192  9173  1 10:24 ?        00:00:07 /usr/bin/java -Djava.library.path=/usr/lib:/usr/lib64:/usr/lib/gcj/postgresql-jdbc:/usr/lib64/gcj/postgresql-jdbc -classpath /usr/share/rhn/search/lib/*:/usr/share/rhn/classes:/usr/share/rhn/lib/spacewalk-asm.jar:/usr/share/rhn/lib/rhn.jar:/usr/share/rhn/lib/java-branding.jar -Dfile.encoding=UTF-8 -Xms32m -Xmx512m -Dlog4j2.configurationFile=/usr/share/rhn/search/classes/log4j2.xml com.redhat.satellite.search.Main
postgres  9233  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49370) idle
wwwrun    9234  9167  0 10:24 ?        00:00:00 /usr/sbin/httpd-prefork -DSYSCONFIG -DSSL -DISSUSE -C PidFile /run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -DSYSTEMD -DFOREGROUND -k start
postgres  9380  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49372) idle
postgres  9381  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49384) idle
postgres  9382  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49398) idle
postgres  9386  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49412) idle
postgres  9387  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49426) idle
postgres  9388  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49438) idle
postgres  9390  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49440) idle
postgres  9391  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49442) idle
postgres  9392  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49454) idle
postgres  9393  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49460) idle
postgres  9394  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49464) idle
postgres  9395  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49468) idle
postgres  9396  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49470) idle
postgres  9397  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49478) idle
postgres  9398  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49494) idle
postgres  9473  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49504) idle
postgres  9474  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49514) idle
postgres  9475  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(49530) idle
postgres  9477  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(47244) idle
postgres  9478  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(47242) idle
postgres  9534  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(47262) idle
postgres  9535  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(47264) idle
postgres  9536  7352  0 10:24 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(47270) idle
salt     10844  7479  0 10:28 ?        00:00:00 /usr/bin/python3 /usr/bin/salt-master
postgres 11013  7352  0 10:30 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(39514) idle
postgres 11014  7352  0 10:30 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(39528) idle
postgres 11015  7352  0 10:30 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(39530) idle
postgres 11020  7352  0 10:30 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(39544) idle
postgres 11021  7352  0 10:30 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(39552) idle
postgres 11022  7352  0 10:30 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(39560) idle
postgres 11023  7352  0 10:30 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(39564) idle
postgres 11024  7352  0 10:30 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(39568) idle
postgres 11027  7352  0 10:30 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(39584) idle
postgres 11056  7352  0 10:30 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(35346) idle
postgres 11057  7352  0 10:30 ?        00:00:00 postgres: uyuni uyuni 127.0.0.1(35354) idle
ec2-user 11182  1579  0 10:31 pts/0    00:00:00 grep -E --color=auto postgres|salt|httpd

The version of PostgreSQL is one version behind the latest minor release as of now, but this is not so bad:

ec2-user@uyuni-server:~> sudo su - postgres
postgres@uyuni-server:~> psql
psql (14.5)
Type "help" for help.

postgres=$ \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 reportdb  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 uyuni     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(5 rows)

postgres=# 

The final step is to create an organization using the web interface:

That’s all for the server setup and configuration part. In the next post we’ll add a client we can then manage with the brand new Uyuni server.