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):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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”:
1 2 3 4 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | 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:Uyuni@build.opensuse.org> 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):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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.