In the last post we’ve installed and configured the Uyuni server. In this post we’ll add our first client we later on can manage through the Uyuni server. Quite some distributions are supported, and we’re not going for any flavor of openSUSE or SUSE (that for sure will work), but for a Debian 11 client. As our server is running in AWS, we’ll use the official Debian 11 AMI from the AWS marketplace. The supported features for Debian are listed here.

As usual, before we do anything else, we’ll bring the system to the latest release. As described in the last post, make sure that the fully qualified domain name is returned by “hostname -f”:

admin@uyuni-debian11:~$ hostname -f
uyuni-debian11.it.dbi-services.com
admin@uyuni-debian11:~$ sudo apt update && sudo apt dist-upgrade -y
admin@uyuni-debian11:~$ sudo reboot
admin@uyuni-debian11:~$ uname -a
Linux uyuni-debian11 5.10.0-20-cloud-amd64 #1 SMP Debian 5.10.158-2 (2022-12-13) x86_64 GNU/Linux
admin@uyuni-debian11:~$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Later on, when we bootstrap the client from the Uyuni web interface, we’ll need the ssh key for connecting, so we need to generate the keys for the root user:

admin@uyuni-debian11:~$ sudo bash
root@uyuni-debian11:/home/admin$ cd
root@uyuni-debian11:~$ ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:oTWP8toDbc79iM8o/mC8yuDjMNr7TtEyP3EOXbg08KE root@uyuni-debian11
The key's randomart image is:
+---[RSA 3072]----+
|      . .        |
|       + o       |
|      E O .      |
|     . = O       |
|    + *.S .      |
|     *.Bo        |
|o . . *=o.       |
|.=.+ ..*++..     |
|..===o+o=o+..    |
+----[SHA256]-----+
root@uyuni-debian11:~# 

Before we can start to integrate the client into the Uyuni server’s we need to create a bootstrap repository. This repository is used, when a client is registered for the first time. To do that, we need to create the Debian 11 channels. This can easily be done on the command line:

ec2-user@uyuni-server:~> sudo spacewalk-common-channels debian-11-pool-amd64-uyuni debian-11-amd64-uyuni-client debian-11-amd64-main-updates-uyuni debian-11-amd64-main-security-uyuni
SUSE Manager username: dwe
SUSE Manager password: 
ec2-user@uyuni-server:~> ps -ef | grep sync
root      7404  3390 99 15:41 ?        00:06:10 /usr/bin/python3 -u /usr/bin/spacewalk-repo-sync --channel debian-11-pool-amd64-uyuni --type deb --non-interactive

The synchronization started automatically and our new Debian 11 channels are now visible in the web interface:

The repositories got created as well:

To check the synchronization status, you can either do that from the command line by checking the log file (you’ll notice the Red Hat roots here, because of the “rhn” in the path):

ec2-user@uyuni-server:~> sudo tail -f /var/log/rhn/reposync/debian-11-pool-amd64-uyuni.log
2022/12/28 15:50:15 -00:00     42549/58640 : ogamesim-www_0.34-3.1_all.deb
2022/12/28 15:50:15 -00:00     42550/58640 : oggfwd_0.2-6+b2_amd64.deb
2022/12/28 15:50:15 -00:00     42551/58640 : oggvideotools_0.9.1-5.1_amd64.deb
...
2022/12/28 16:04:25 -00:00   Package batch #1715 of 2932 completed...
2022/12/28 16:04:26 -00:00   Package batch #1717 of 2932 completed...
2022/12/28 16:04:27 -00:00   Package batch #1716 of 2932 completed...
2022/12/28 16:04:27 -00:00   Package batch #1719 of 2932 completed...
2022/12/28 16:04:27 -00:00   Package batch #1720 of 2932 completed...
...
2022/12/28 16:12:19 -00:00   Package batch #2931 of 2932 completed...
2022/12/28 16:12:20 -00:00   Package batch #2930 of 2932 completed...
2022/12/28 16:12:20 -00:00   Package batch #2927 of 2932 completed...
2022/12/28 16:12:20 -00:00 Importing packages finished.
2022/12/28 16:12:20 -00:00 
2022/12/28 16:12:20 -00:00   Linking packages to the channel.
2022/12/28 16:12:23 -00:00     1000 packages linked
2022/12/28 16:12:25 -00:00     2000 packages linked
2022/12/28 16:12:26 -00:00     3000 packages linked
...

… or by using the web interface:

This will take some time as plenty of packages need to be synchronized. Before we continue we’ll wait until the synchronization completes. Again, this can be checked on the command line:

ec2-user@uyuni-server:~> sudo tail -10 /var/log/rhn/reposync/debian-11-pool-amd64-uyuni.log
2022/12/28 16:18:05 -00:00     54000 packages linked
2022/12/28 16:18:17 -00:00     55000 packages linked
2022/12/28 16:18:27 -00:00     56000 packages linked
2022/12/28 16:18:39 -00:00     57000 packages linked
2022/12/28 16:18:51 -00:00     58000 packages linked
2022/12/28 16:19:03 -00:00     58640 packages linked
2022/12/28 16:19:03 -00:00 
2022/12/28 16:19:03 -00:00   Patches in repo: 0.
2022/12/28 16:19:03 -00:00   Regenerating bootstrap repositories.
2022/12/28 16:19:04 -00:00 Sync completed.

… or by checking the repository in the web interface:

The next step is to create the bootstrap repository, which will be used by the client once it gets registered:

ec2-user@uyuni-server:~> sudo mgr-create-bootstrap-repo
1. debian11-amd64-uyuni
Enter a number of a product label: 1                                 

Creating bootstrap repo for debian11-amd64-uyuni
copy 'dirmngr-2.2.27-2+deb11u2.amd64-deb'
copy 'gnupg-2.2.27-2+deb11u2.all-deb'
...copy 'pinentry-curses-1.1.0-4.amd64-deb'
Exporting indices...
ERROR: package 'venv-salt-minion' not found

Suggestions:
mgr-create-bootstrap-repo uses the locally synchronized versions of files
from the Tools repository, and uses the locally synchronized pool channel
for dependency resolution.
Both should be fully synced before running the mgr-create-bootstrap-repo script.

This fails, because the tools channel was not yet synchronized. We can do that manually:

ec2-user@uyuni-server:~> sudo spacewalk-repo-sync --channel debian-11-amd64-uyuni-client 
16:35:46 ======================================
16:35:46 | Channel: debian-11-amd64-uyuni-client
16:35:46 ======================================
16:35:46 Sync of channel started.
16:35:46 Repo URL: https://download.opensuse.org/repositories/systemsmanagement:/Uyuni:/Stable:/Debian11-Uyuni-Client-Tools/Debian_11/
16:35:46     Packages in repo:                63
16:35:46     Packages already synced:         38
16:35:46     Packages to sync:                25
16:35:46     New packages to download:        25
16:35:46   Downloading packages:
16:35:46 Downloading total 25 files from 1 queues.
16:35:47     1/25 : golang-1.14_1.14.4-3_all.deb
16:35:47     2/25 : golang-1.14-doc_1.14.4-3_all.deb
16:35:47     3/25 : golang-1.14-src_1.14.4-3_i386.deb
16:35:47     4/25 : libopenscap-dev_1.3.4-1_i386.deb
16:35:47     5/25 : golang-1.14-src_1.14.4-3_amd64.deb
16:35:47     6/25 : libopenscap-perl_1.3.4-1_i386.deb
16:35:48     7/25 : libopenscap-dev_1.3.4-1_amd64.deb
16:35:48     8/25 : libopenscap8_1.3.4-1_i386.deb
16:35:48     9/25 : libopenscap-perl_1.3.4-1_amd64.deb
16:35:48     10/25 : libopenscap8_1.3.4-1_amd64.deb
16:35:48     11/25 : libopenscap8-dbg_1.3.4-1_amd64.deb
16:35:48     12/25 : golang-1.14-go_1.14.4-3_i386.deb
16:35:48     13/25 : prometheus-exporter-exporter_0.4.0-1_amd64.deb
16:35:48     14/25 : golang-1.14-go_1.14.4-3_amd64.deb
16:35:48     15/25 : python3-openscap_1.3.4-1_amd64.deb
16:35:48     16/25 : libopenscap8-dbg_1.3.4-1_i386.deb
16:35:48     17/25 : scap-security-guide-debian_0.1.64-1.52.2.uyuni_all.deb
16:35:48     18/25 : scap-security-guide_0.1.64-1.52.2.uyuni_all.deb
16:35:48     19/25 : prometheus-exporter-exporter_0.4.0-1_i386.deb
16:35:48     20/25 : python3-openscap_1.3.4-1_i386.deb
16:35:48     21/25 : spacecmd_4.4.4-2.2.uyuni_all.deb
16:35:49     22/25 : scap-security-guide-ubuntu_0.1.64-1.52.2.uyuni_all.deb
16:35:49     23/25 : scap-security-guide-redhat_0.1.64-1.52.2.uyuni_all.deb
16:35:49     24/25 : venv-salt-minion_3004-11.172.uyuni_i386.deb
16:35:49     25/25 : venv-salt-minion_3004-11.172.uyuni_amd64.deb
16:35:49 
16:35:49   Importing packages to DB:
16:35:51   Package batch #2 of 2 completed...
16:35:51   Package batch #1 of 2 completed...
16:35:51 
16:35:51   Linking packages to the channel.
16:35:51     25 packages linked
16:35:51 
16:35:51   Patches in repo: 0.
16:35:52   Regenerating bootstrap repositories.
Generating bootstrap repos for all available products which had changes.
Nothing to do.
16:35:52 Sync completed.
16:35:52 Total time: 0:00:06

Trying to create the bootstrap repository once more succeeds:

ec2-user@uyuni-server:~> sudo mgr-create-bootstrap-repo
1. debian11-amd64-uyuni
Enter a number of a product label: 1

Creating bootstrap repo for debian11-amd64-uyuni
copy 'dirmngr-2.2.27-2+deb11u2.amd64-deb'
copy 'gnupg-2.2.27-2+deb11u2.all-deb'
copy 'gnupg-l10n-2.2.27-2+deb11u2.all-deb'
copy 'gnupg-utils-2.2.27-2+deb11u2.amd64-deb'
copy 'gpg-2.2.27-2+deb11u2.amd64-deb'
copy 'gpg-agent-2.2.27-2+deb11u2.amd64-deb'
copy 'gpg-wks-client-2.2.27-2+deb11u2.amd64-deb'
copy 'gpg-wks-server-2.2.27-2+deb11u2.amd64-deb'
copy 'gpgconf-2.2.27-2+deb11u2.amd64-deb'
copy 'gpgsm-2.2.27-2+deb11u2.amd64-deb'
copy 'libassuan0-2.5.3-7.1.amd64-deb'
copy 'libksba8-1.5.0-3+deb11u1.amd64-deb'
copy 'libldap-2.4-2-2.4.57+dfsg-3+deb11u1.amd64-deb'
copy 'libldap-common-2.4.57+dfsg-3+deb11u1.all-deb'
copy 'libnpth0-1.6-3.amd64-deb'
copy 'libsasl2-2-2.1.27+dfsg-2.1+deb11u1.amd64-deb'
copy 'libsasl2-modules-2.1.27+dfsg-2.1+deb11u1.amd64-deb'
copy 'libsasl2-modules-db-2.1.27+dfsg-2.1+deb11u1.amd64-deb'
copy 'libsqlite3-0-3.34.1-3.amd64-deb'
copy 'pinentry-curses-1.1.0-4.amd64-deb'
copy 'venv-salt-minion-3004-11.172.uyuni.i386-deb'
copy 'venv-salt-minion-3004-11.172.uyuni.amd64-deb'
Skipping inclusion of 'dirmngr' '2.2.27-2+deb11u2' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'gnupg' '2.2.27-2+deb11u2' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'gnupg' '2.2.27-2+deb11u2' in 'bootstrap|main|i386', as this version already exists.
Skipping inclusion of 'gnupg' '2.2.27-2+deb11u2' in 'bootstrap|main|armhf', as this version already exists.
Skipping inclusion of 'gnupg-l10n' '2.2.27-2+deb11u2' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'gnupg-l10n' '2.2.27-2+deb11u2' in 'bootstrap|main|i386', as this version already exists.
Skipping inclusion of 'gnupg-l10n' '2.2.27-2+deb11u2' in 'bootstrap|main|armhf', as this version already exists.
Skipping inclusion of 'gnupg-utils' '2.2.27-2+deb11u2' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'gpg' '2.2.27-2+deb11u2' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'gpg-agent' '2.2.27-2+deb11u2' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'gpg-wks-client' '2.2.27-2+deb11u2' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'gpg-wks-server' '2.2.27-2+deb11u2' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'gpgconf' '2.2.27-2+deb11u2' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'gpgsm' '2.2.27-2+deb11u2' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'libassuan0' '2.5.3-7.1' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'libksba8' '1.5.0-3+deb11u1' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'libldap-2.4-2' '2.4.57+dfsg-3+deb11u1' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'libldap-common' '2.4.57+dfsg-3+deb11u1' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'libldap-common' '2.4.57+dfsg-3+deb11u1' in 'bootstrap|main|i386', as this version already exists.
Skipping inclusion of 'libldap-common' '2.4.57+dfsg-3+deb11u1' in 'bootstrap|main|armhf', as this version already exists.
Skipping inclusion of 'libnpth0' '1.6-3' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'libsasl2-2' '2.1.27+dfsg-2.1+deb11u1' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'libsasl2-modules' '2.1.27+dfsg-2.1+deb11u1' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'libsasl2-modules-db' '2.1.27+dfsg-2.1+deb11u1' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'libsqlite3-0' '3.34.1-3' in 'bootstrap|main|amd64', as this version already exists.
Skipping inclusion of 'pinentry-curses' '1.1.0-4' in 'bootstrap|main|amd64', as this version already exists.
Exporting indices...

Before we can add the client we need to create an activation key:

Now we are ready to register the client (we’ll use the activation key we’ve just created and the ssh key from the Debian system created above). If you are in a public cloud, remember to allow ssh access as root, because this is usually disabled.

Once the bootstrap finished, the Debian system appears under the list of systems:

No we are ready to manage the system with Uyuni, but this is the topic for the next post.