Seite wählen

NETWAYS Blog

Foreman Birthday Event 2024 – Recap

On Monday, 15.07.2024, I met early with my colleagues Lennart and Matthias to travel to Garching for the Foreman Birthday Event. This year it was again hosted by ATIX at a conference room next to their office, so thanks to all of them for having as there, especially to Bernhard! And also thanks to the community members that joined us! It was a nice mix from the German community with also some international guests from Red Hat, mostly familiar faces but also some new ones. And it is as great to see the community still growing even after 15 years as it is great to meet all the people who became friends in this time.

The morning

After some time to get together we entered the room and Bernhard gave the official welcome before handing over to his colleagues for the first talk.

First Talk“Automated Provisioning with SecureBoot and Foreman” by Jan Löser and Markus Reisner was a great talk giving insights in SecureBoot in general as a start. Then they showed the current state of Foreman handling SecureBoot and why the implementation is limiting real world scenarios. But ATIX is working on a complete overhaul of the feature and thanks to the community input it is taking shape. The new feature will be backwards compatible, so no change needed if you do not want to use it. This is great, especially as the first step will require some manual work to setup everything. But the plans for automated setup are there and as I know the guys it will not take too long to get this implemented, too. With this in place using SecureBoot with Foreman will give you a better experience!

As second speaker Martin Alfke told us the story “How Foreman Community enables new contributors”. While working with Foreman already for a long time at different customers, he never joined the community in a deeper sense. After they developed Hiera Data Manager customers asked for some integration with Foreman. And with the help of the community they delivered! So now you can debug the Hiera data of your Puppet environment not only much easier, but also directly from the Foreman UI. Foreman-HDM
On the day Martin got the help with the last missing piece, the Foreman installer, and was encourage to join official Professional Services starting with a blogpost.

After a short break Evgeni Golov introduced the audience to “Foreman build test environment: migration from Jenkins to GitHub Actions”. He showed where the Project was before starting the migration, the current stage and what else is planned. He also encouraged the Plugin developers in the room to make use of it. And I think other projects can also learn from it. So take a look at his slides.

The afternoon

ATIX invited us to have lunch in the restaurant of the office complex which provided some nice choices and great quality of food. I also used this for a nice mixture of private and business talk with Martin and some ATIX guys. It is always great to realize how well we work together in the community even we are somehow competitors.

Then the stage was mine asking the question “Foreman – a complete lifecycle management tool for desktops?”. A bit out of my comfort zone it was not a technical deep talk with many demos, but a more light one sharing my experience based on some use cases. Starting with a simple virtual desktop over our training setup to the proof of concept we did for a customer project I looked into the challenges we experienced and how we solved them if we did already. After that I came to the conclusion that Foreman is ready to manage Linux desktops with only a bit of work, but the Linux desktops are not ready to be automated without putting some more work into.

Fifth Talk“Foreman documentation: Helping users figure things out since May 15, 2019” by Maximilian Kolb and Aneta Šteflová Petrová talked us through the progress the Foreman documentation made since Red Hat started to upstream the documentation. The anecdotes and examples given by the two technical writers showed their great commitment to the project. One reason they pointed out why the project is seen as a real success story is how closely developers and technical writers of different companies involved work together.
Afterwards we had a short discussion on how to improve further and how to reach the goal of the new documentation being the default one.

And last but not least Ian Ballou joined us remotely from the US to show “New Feature: Pushing Containers Into Katello”. It was great having him give this demo even without being on-site. He did really dived deep into this new feature and answered all the questions the audience had afterwards. So if you had a Container registry to push your images to and then to be synced from to Katello, this will make your life easier by allowing direct push to Katello’s registry.

Cake time

After the talks and a short feedback round unfortunately some had to leave, but for the rest of us it was cake time. Bernhard hesitated to cut the cake, so this job become my honor. After a quick count I had to cut it into 20 pieces directly starting the discussion how to do this best with everyone offering suggestions. But with the problem solved, we split into groups. Some still discussing topics from the talks, some talking about other aspects of the project or IT in general and others just having a friendly chat. About one hour later it was time to leave so we could catch our train back to Nuremberg, but we were not the last ones.

CakeMe cutting the cake

It was again a great event, so thanks to everyone who made it possible. I already heard the feedback like having an introduction round, having more hands-on demos, more time for open discussion, more hybrid. Not sure what of this we can implement next year, but I want to make it a similar success again in 2025!

Other celebrations

But we were not the only one celebrating the Foreman’s 15th birthday. Christian Stankowic made a special on the podcast FOCUS ON: LINUX consisting of two episodes. Episode 110 is “15 Jahre Foreman” (in German) which has Christian, Evgeni, Bernhard and me talking about the project and trying to include every possible pun. Episode 111 is an Interview with Ohad Levy about the project’s history and answering questions.

P.S.: As a side note for Ian: I promised to eat a slice of the birthday cake in your name so the second piece was also delicious and replaced my diner! 😉

Dirk Götz
Dirk Götz
Principal Consultant

Dirk ist Red Hat Spezialist und arbeitet bei NETWAYS im Bereich Consulting für Icinga, Puppet, Ansible, Foreman und andere Systems-Management-Lösungen. Früher war er bei einem Träger der gesetzlichen Rentenversicherung als Senior Administrator beschäftigt und auch für die Ausbildung der Azubis verantwortlich wie nun bei NETWAYS.

Ansible und Terraform: Die Hochzeit des Jahrzentes?

Ansible und Terraform sind wichtige Werkzeuge im DevOps-Werkzeugkasten und gehören genauso zusammen wie der Hammer und der Schraubendreher.

Was sind Ansible und Terraform überhaupt?

Ansible ist ein Open-Source-Tool zur Automatisierung von IT-Aufgaben wie Konfigurationsmanagement und Anwendungsbereitstellung. Über sogenannte Playbooks können Aufgaben definiert werden, die den gewünschten Zustand von Systemen beschreiben. Es nutzt SSH-Verbindungen (für Linux), um diese Zustände umzusetzen, und erfordert keine Installation von Agenten auf den Zielhosts, was die Einrichtung und Verwendung von Ansible sehr einfach macht.

Im Gegensatz dazu ist Terraform ein Open-Source-Tool, das zur Bereitstellung und Verwaltung von Infrastruktur as Code (IaC) verwendet wird. Entwickler- und Administratorenteams können mit Terraform Infrastrukturressourcen wie VMs, Netzwerkkonfigurationen und Speicherressourcen in verschiedenen Cloud- und On-Premises-Umgebungen definieren, konfigurieren und verwalten. Ähnlich wie Ansible verwendet Terraform einen deklarativen Ansatz, um den gewünschten Zustand der Umgebung zu beschreiben. Anschließend kümmert sich Terraform darum, diesen Zustand zu erstellen, indem die erforderlichen Komponenten bereitgestellt oder aktualisiert werden.

Ähnlich, aber nicht gleich

Es gibt wichtige Unterschiede zwischen den beiden Tools:

  • Ansible ist hauptsächlich ein Konfigurationsmanagement-Tool. Es automatisiert die Bereitstellung von Softwareanwendungen, Konfigurationen und Systemzuständen auf vorhandenen Infrastrukturressourcen.
  • Terraform hingegen ist spezialisiert auf die Bereitstellung und Verwaltung von Infrastrukturressourcen selbst. Es fokussiert sich darauf Cloud-Dienste zu konfigurieren und zu verwalten.

In anderen Worten: Terraform konzentriert sich auf die Bereitstellung und Verwaltung der Infrastruktur, während Ansible sich um die Konfiguration bestimmter Infrastruktur komponeten kümmert.

Da beide Tools unterschiedliche Bereiche automatisieren, die jedoch eng miteinander verbunden sind, ist es wichtig zu wissen, wie man sie optimal gemeinsam einsetzen kann. Dazu gibt es mehrere Ansätze:

Der Manuelle Weg

Ein bisschen paradox, dass ich die ganze Zeit von Automatisierung rede und jetzt einen Manuellen Weg vorstelle, nicht wahr? Deswegen dient dieser Absatz nur der Vollständigkeit und ich würde jedem raten, sich für einen der anderen Ansätze zu entscheiden.

Dennoch ist es natürlich klar, dass man Terraform und Ansible auch per Hand verheiraten kann. Das sieht dann ungefähr so aus:

  • Man schreibt ein Terraform-Skript. Hier habe ich jetzt ein kleines Beispiel (welches ich auch in den anderen Beispielen als Grundlage verwenden werde), um einen virtuellen Server bei [DigitalOcean](https://www.digitalocean.com/) (Droplet) zu erstellen:
terraform {
  required_providers {
    digitalocean = {
    source = "digitalocean/digitalocean"
    version = "~> 2.0"
    }
  }
}

resource "digitalocean_droplet" "test" {
  image = "debian-12-x64"
  name = "manual-way"
  ...
}

Ich habe hier mithilfe des Digital Ocean Providers sehr einfach meinen SSH-Key ablegen können. Die meisten Provider haben entweder ein SSH-Key-Attribut oder bieten Cloud-Init an (Das Attribut heißt dafür oft `user_data`). Es macht Sinn, den SSH-Key, mit dem man dann Ansible verwendet, direkt hier mitzugeben. So spart man sich einen manuellen Schritt. Es macht allerdings nicht so viel Sinn, darüber alle SSH-Keys zu verwalten, da das Ändern dieses Attributes oft zur Neuinstallation des Servers führt.

  • Anschließend provisioniert man die Infrastruktur mittels folgenden Terraform-Befehlen – terraform init, terraform plan, terraform apply.
  • Nun müssen wir darauf warten, dass die Infrastruktur bereitgestellt ist, Terraform, je nach Provider dauert das unterschiedlich lang.
  • Anschließend ermitteln wir die IP-Adresse des Servers. Dies kann entweder über einen Terraform-Output erfolgen oder durch Überprüfen der API oder der Oberfläche von Digital Ocean.
  • Mit dieser IP-Adresse erstellen wir nun ein Inventar. Alternativ können wir zuvor einen DNS-Eintrag für diese IP-Adresse setzen oder die IP-Adresse direkt verwenden.

Inventory.yml:

---
all:
  hosts:
    manual-ansible.netways.de:

Ich habe einen DNS-Eintrag verwendet (den kann ich bei einigen DNS-Providern auch per Terraform erstellen!).

Jetzt müssen wir das Playbook schreiben und auf das neue Inventory ausführen.

Playbook.yml:

---
- name: Lets see what we can do
  hosts: all
  tasks:
    - name: Lets run an apt update / apt upgrade task
      ansible.builtin.apt:
        upgrade: True
        update_cache: True
ansible-playbook -i inventory.yml playbook.yml

Output:

PLAY [Lets see what we can do] ****************

TASK [Gathering Facts] ****************
ok: [manual-ansible.netways.de]

TASK [Lets run an apt update / apt upgrade task] ****************
changed: [manual-ansible.netways.de]

PLAY RECAP ****************
manual-ansible.netways.de : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Das war ganz schön viel Arbeit. Aber wie geht es einfacher? Und welche Möglichkeiten gibt es, die beiden Tools zu verheiraten?

Ansible Provider und Terraform Plugin

Mithilfe des Ansible-Providers von Terraform und der cloud.terraform-Collection für Ansible kann man aus Terraform-Skripten dynamische Inventories erstellen.

Dazu erweitern wir das Terraform-Skript aus dem manuellen Beispiel:

terraform {
  required_providers {
    digitalocean = {
      source  = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
    ansible = {
      version = "~> 1.2.0"
      source  = "ansible/ansible"
    }
  }
}

resource "digitalocean_droplet" "web" {
  image  = "debian-12-x64"
  name   = "married-way"
  ...
}

resource "ansible_host" "web" {
  name = digitalocean_droplet.web.ipv4_address
  groups = ["web"]
  variables = {
    ansible_user = "root"
  }
}

Dank des Ansible Providers ist es möglich, die IP-Adresse des gerade erstellten Droplets direkt zu nutzen. Der Ansible-Provider generiert ein Inventar, das es ermöglicht, Hosts direkt Gruppen zuzuweisen und Host-Variablen festzulegen.

Wenn wir nun in die Terraform-State-Datei schauen, sehen wir folgende Resource:

"resources": [
    {
      "mode": "managed",
      "type": "ansible_host",
      "name": "web",
      "provider": "provider[\"registry.terraform.io/ansible/ansible\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "groups": [
              "web"
            ],
            "id": "10.0.0.1",
            "name": "10.0.0.1",
            "variables": {
              "ansible_user": "root"
            }
          },
          ...
        }
      ]
    },

Um das Inventory zu erstellen, müssen wir die cloud.terraform-Collection installieren:

ansible-galaxy collection install cloud.terraform

Dann können wir ein Inventory-File erstellen, das wie folgt aussieht:

---
plugin: cloud.terraform.terraform_provider
project_path: ../terraform

Jetzt können wir uns das Inventory ansehen, das Ansible verwenden würde:

$ ansible-inventory -i inventory.yml --graph --vars
@all:
  |--@ungrouped:
  |--@web:
  |  |--10.0.0.1
  |  |  |--{ansible_user = root}

Jetzt können wir unser Beispiel-Playbook wieder ausführen:

$ ansible-playbook -i inventory.yml playbook.yml 

PLAY [Let's see what we can do] ***************

TASK [Gathering Facts] ***************
ok: [10.0.0.1]

TASK [Lets run an apt update / apt upgrade task] ***************
changed: [10.0.0.1]

PLAY RECAP ***************
10.0.0.1               : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Vorteile:

  • Wir müssen das Inventory nicht manuell anpassen.
  • Wir können die Parameter aus Terraform direkt an das Inventory übergeben.

Nachteile:

  • Alle Ressourcen in Terraform müssen doppelt angelegt werden.
  • Das Inventory-Plugin unterstützt keine Remote-States, was das Arbeiten im Team erschwert.

Terraform-Modul

Mithilfe des Terraform-Moduls für Ansible kann man Terraform-Skripte ausführen. Das Terraform-Skript in diesem Beispiel ist das gleiche wie im manuellen Beispiel.

Das Playbook:

- name: Deploy a DigitalOcean Droplet
  hosts: localhost
  tasks:
    - name: Deploy
      community.general.terraform:
        project_path: ../terraform
        state: present
$ ansible-playbook playbook.yml 
PLAY [Deploy a DigitalOcean Droplet] ***************

TASK [Gathering Facts] ***************
ok: [localhost]

TASK [Deploy] ***************
changed: [localhost]

PLAY RECAP ***************
localhost                  : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Und…. jetzt?
Jetzt ist die VM da, aber wir müssen die VM bzw. den Hostnamen wieder herausfinden. Eigentlich hat dieses Plugin einen anderen Anwendungsfall. Es macht Sinn, es zu verwenden, wenn ich Cloud-Services, die keine weitere Konfiguration durch Ansible benötigen, anlegen und diese in meiner Ansible-Struktur abbilden möchte.

Ein Terraform-Destroy sieht hier übrigens so aus:

- name: Destroy a DigitalOcean Droplet
  hosts: localhost
  tasks:
    - name: Destroy
      community.general.terraform:
        project_path: ../terraform
        state: absent

Fazit

So richtig zufrieden bin ich mit den Möglichkeiten, die es bisher gibt, nicht. Ein dynamisches Inventory aus dem Terraform-State zu erstellen, ist schon mal die richtige Richtung, aber alle Ressourcen doppelt erstellen zu müssen, widerspricht ein wenig der Idee von Terraform. Außerdem sorgt es für eine hohe Korrelation zwischen den beiden Tools. Wenn man jetzt zum Beispiel Ansible durch Puppet austauscht, muss man die gesamte Terraform-Struktur anpassen.

Dennoch sollten wir nicht vergessen, wo die Stärken und Schwächen der einzelnen Tools liegen. Vielleicht hat ja jemand von euch jetzt die Idee, wie wir Ansible und Terraform am besten verheiraten können. Und wenn ihr es geschafft habt, ladet mich doch bitte zur Hochzeit ein!

Lucy Siemer
Lucy Siemer
Consultant

Lucy ist seit Mai 2023 bei NETWAYS als Consultant tätig, nachdem sie im Jahr 2022 ihre Ausbildung zur Fachinformatikerin für Systemintegration erfolgreich abgeschlossen hat. Ihre Schwerpunkte liegen auf den Bereichen Kubernetes, Infrastructure as Code und Monitoring. Neben ihrer Arbeit bei NETWAYS betreut Lucy auch privat ihre eigene Infrastruktur auf Kubernetes. Darüber hinaus ist sie leidenschaftlich daran interessiert, eigene Kleider zu nähen und individuelle Designs zu kreieren.

Kritischer Fehler in Puppet Version 7.29.0 und 8.5.0

Eine Warnung an alle Nutzer von Puppet, aber auch Foreman oder dem Icinga-Installer, die Version 7.29.0 und 8.5.0 von Puppet enthält einen kritischen Fehler, der die Erstellung eines Katalogs und somit die Anwendung der Konfiguration verhindert. Daher stellt bitte sicher diese Version nicht bei euch einzuspielen!

Was genau ist das Problem?

Durch eine Änderung in den Versionen werden Klassenparameter mit einem Integer mit negativem Minimum nicht mehr als solche erkannt und stattdessen kommt es zu dem Fehler “The parameter ‘$parameter_name’ must be a literal type, not a Puppet::Pops::Model::AccessExpression”. Da viele Module diesen Default verwenden, um den Wert “-1” nutzen zu können wenn etwas unlimitiert sein soll, ist es sehr wahrscheinlich, dass eine Umgebung davon betroffen ist.

Ein Beispiel hierfür ist das Puppet-Modul zum Management von Redis, welches auch zu dem öffentlich einsehbaren Issue “puppet 7.29.0 sinks my arithmetic battleship!” geführt hat. Tatsächlich ist auch bereits ein möglicher Fix dafür als Pull-Request “Accept UnaryMinusExpression as class parameter type” in Arbeit, so dass hoffentlich bald eine Bugfix-Version releast werden kann.

Bis zu dem Bugfix-Release sind aber nicht nur direkte Puppet-Nutzer betroffen! Auch wenn ein Installer darauf aufbaut wie dies bei Foreman oder dem Icinga-Installer der Fall ist und ein entsprechendes Modul hierbei benötigt wird, ist es wichtig diese Versionen nicht einzuspielen!

Wie verhindere ich nun am sinnvollsten, dass diese Version eingespielt wird?

In einem geeigneten Softwaremanagement wie Katello lässt sich die fehlerhafte Version herausfiltern und somit gar nicht erst den Systemen zur Verfügung zu stellen. Ohne diese Möglichkeit muss mit den Mitteln des Paketmanagers unter Linux gearbeitet werden.

Bei DNF in der Betriebssystemfamilie “Red Hat” lässt sich bei manuellen Updates --excludepkgs puppet-agent* angeben, um das Paket temporär auszuschließen. Wenn dies längerfristig benötigt wird oder gar ein automatische Update das Paket mitbringen könnte, lässt sich in der Haupt-Konfiguration oder im Puppet-Repository eine Zeile excludepkgs=puppet-agent-7.29.0*,puppet-agent-8.5.0* hinzufügen. Hierbei ist die genauere Versionsangabe wichtig, denn so kann die Konfiguration auch langfristig so verbleiben, ohne dass man daran denken muss die Zeile wieder zu entfernen. Wer noch ältere Versionen mit YUM nutzt kann dies genauso nutzen.

Auf der Betriebssystemfamilie “Debian” kann mittels apt-mark hold puppet-agent kurzfristig das Update des Paktes blockiert werden. Dieses muss dann mit apt-mark unhold puppet-agent wieder aufgehoben werden, was mittels apt-mark showhold sichtbar wird. Auch hier empfiehlt sich bei Bedarf eine Lösung über die Konfiguration. Dafür muss innerhalb der Präferenzen von APT eine Konfiguration im folgenden Format angelegt werden.

Package: puppet-agent
Pin: version 1:7.29.0*
Pin-Priority: -1

Package: puppet-agent
Pin: version 1:8.5.0*
Pin-Priority: -1

Für Zypper auf SUSE-Systemen ist mir leider keine so elegante Lösung bekannt. Hier hilft temporär auch der Parameter --exclude puppet-agent oder zypper addlock puppet-agent.

Für den oder die zentralen Puppetserver bitte auch das Paket “puppetserver” so behandeln.

Was wenn die Version schon installiert ist?

Der Agent aber auch der Puppetserver sollten sich problemlos über das Paketmanagement downgraden lassen. Zumindest hatte ich damit in der Vergangenheit keine Probleme. Also hilft hier dnf downgrade puppet-agent, apt install puppet-agent=VERSION oder zypper install --oldpackage puppet-agent=VERSION wobei man die letzte getestete Version angeben sollte.

Ich hoffe wie in solchen Fällen immer die Warnung wurde rechtzeitig gelesen und wir konnten euch damit ein paar Probleme ersparen!

Das Beitragsbild besteht aus dem Bild “Insects Collection 11” von Openclipart-User GDJ sowie dem offiziellen Puppet-Logo.

Dirk Götz
Dirk Götz
Principal Consultant

Dirk ist Red Hat Spezialist und arbeitet bei NETWAYS im Bereich Consulting für Icinga, Puppet, Ansible, Foreman und andere Systems-Management-Lösungen. Früher war er bei einem Träger der gesetzlichen Rentenversicherung als Senior Administrator beschäftigt und auch für die Ausbildung der Azubis verantwortlich wie nun bei NETWAYS.

Foreman Birthday Event 2023 – Recap

Two years ago I started my recap of the event with “Last week on Thursday we had the Foreman Birthday event and I can proudly say it was a big success.” and I can do the same for this one.

At the beginning of the year planning for the event started in the background as we discussed in which form we want it to happen. While I was excited for having an in-person event, I quickly realized that travel restrictions and budget would still be a problem for many people, so we agreed on keeping it online for another round would be the best. So keep the fingers crossed for the next time.
When we finalized the date and it was time to find some speaker, a wild hunt started as many changes of the last year had come together. Some of my usual suspects had changed position or company, environments moved from the classic IT environment managed by Foreman to a cloud native approach managed by Kubernetes and similar effects made me fear I can not provide a good program. So I was even thinking about jumping in myself and give a talk as I still do not own a kettle prod to motivate colleagues. 😉 But in the end I was happy with the four talks we got as it was a good mix.

Thanks to our events team who did so many things in the background which I would have forgotten, the managed services team who provided the servers and Christian who did the streaming setup, we had the same setup like last time. And when I started to adjust the configuration of all the buttons on the stream deck I started to finally remember everything including the mixed feeling of excitement and nervousness. Nervousness reached its top when I started the introduction and was signaled people could not hear me, just to realize one button was still showing me muted while the one I looked showed unmuted. But after this everything went smooth.

Screencapture of the Youtube Stream with Countdown at 0:00

Our first speaker was Christian Stankowic who gave a nice look into his work at many customer projects in his talk “Lessons Learned – Automated installations and hints”. The first part of his talk was about Foreman and alternatives and why people decide for or against Foreman. I like it if a talk is not free of critique and Christian had some good points here even if you do not agree with all. His tips and tricks focus on automated installation and documentation, but there are also some on infrastructure design. And with all the tips given he was so kind to provide an example repository on github, too! Thanks again Christian, I was really happy I convinced you to give this talk.

The second one was Bastian Schmidt with “Provisioning Ubuntu hosts in Foreman” who was also was very involved with implementing the topic. It was a rocky road to get this up and running after Ubuntu moved from Preseed to Autoinstall with 20.04.3/22.04.1. Bastian talk showed how rocky it was and also how good the community was in tackling it. And his talked ended with a demo showing the next improvement currently in the making. Thanks again Bastian for the talk and even more for the hard work on this feature!

Screencapture of the Youtube Stream during the Live Q&A with Bastian Schmidt

Ewoud Kohl van Wijngaarden did his talk live as he just finished it last minute, but this also worked great. In “foreman-documentation: rethinking our documentation” we heard about past, present and future of the Foreman’s documentation. If you have not heard about before the new documentation started as the documentation for Red Hat Network Satellite which was given to the Foreman Project to make this a true open source project with upstream and downstream. From this it was a huge community effort to adapt this for Foreman and Katello while creating a good base not only for the Satellite but also Orcharhino. And now the next step is to get rid of the manual and make it the one documentation. Thanks to Ewoud and all those involved in creating and improving the documentation.

And last but not least we had Samir Jha who demoed the updates from the Katello content team. As an addition Ian Ballou had added a demo focusing on the Alternate Content Source feature and Chris Roberts did send me a demo to showcase Simple Content Access. So we finished with a great look inside the latest improvements to Katello and in the live Q&A Samir also talked about future improvements. Thanks to all of you!

In parallel and afterwards we had again the social event in workadventure which I could only join after the stream ended, but this was still enough to meet some community members. All of them were happy and gave great feedback about the event. In the end I had a quite long and productive discussion with Ewoud and Maximillian about many different topics. So I am really looking forward for the next event where I can meet this great community again!

Dirk Götz
Dirk Götz
Principal Consultant

Dirk ist Red Hat Spezialist und arbeitet bei NETWAYS im Bereich Consulting für Icinga, Puppet, Ansible, Foreman und andere Systems-Management-Lösungen. Früher war er bei einem Träger der gesetzlichen Rentenversicherung als Senior Administrator beschäftigt und auch für die Ausbildung der Azubis verantwortlich wie nun bei NETWAYS.

Semaphore, Rundeck oder AWX – Welches Tool eignet sich als Ansible-GUI?

Rundeck, AWX und Ansible Semaphore sind nützliche Tools zur Arbeit mit Ansible. Als Ansible-GUI lösen lösen sie die Arbeit mit Ansible von der Konsole und geben auch Fans grafischer Optionen die Möglichkeit Ansible voll auszukosten.
In meinem ersten Blogpost für NETWAYS habe ich dir bereits Ansible Semaphore vorgestellt. Dabei sind jedoch einige Fragen offen geblieben oder mir erst bei der Arbeit am Artikel gekommen:

  • Wofür ist Semaphore es das richtige Tool?
  • Was sind die Alternativen?
  • Welches Tool eignet sich am besten als Ansible-GUI

Um diese Fragen zu beantworten, werfe ich in diesem Blogpost einen Blick auf die Semaphore Alternativen Rundeck und AWX, gehe auf (aus meiner Sicht) Vor- und Nachteile ein und gebe dir am Ende mein persönliches Fazit.

Grafische Ansible Automatisierung mit Rundeck

Was ist Rundeck?

Rundeck ist eine Open-Source-Automatisierungsplattform, die dir hilft deine Automatisierungen zu verwalten und zu planen. Rundeck kann jedoch noch viel mehr als nur das Ausführen von Ansible-Playbooks, zum Beispiel das Ausführen von Remote-Befehlen oder Skripten.

Um Rundeck zu installieren stehen dir verschiedene Möglichkeiten zur Verfügung:

  • Docker-Container
  • RPM- / DEB-Paket
  • WAR-Datei auf Windows

Bei der RPM- / DEB-Installation gibt es zudem einen weiteren Punkt der beachtet werden muss: du musst den Service als initd-Skript starten.
Neben den verschiedenen Installationsmöglichkeiten verfügt Rundeck auch über einen Terraform-Provider. Damit kannst du zusätzlich deine Projekte, Jobs, ACL-Policies und SSH-Keys verwalten.

Um Ansible-Playbooks mit Rundeck auszuführen, muss Ansible auf dem Server installiert sein. Anschließend kannst du Inventories importieren und Playbooks ausführen. Vergiss dabei aber nicht, dass die Dateien die du ausführen willst lokal auf auf dem Server liegen müssen.

Versionen von Rundeck

Rundeck ist als Community-Version, Enterprise-Version und Cloud-Version verfügbar.
Bei der Cloud-Version handelt es sich um eine gemanagte SaaS-Lösung mit allen Funktionen der Enterprise-Version. Die Rundeck Enterprise-Version bietet unter Anderem die Möglichkeit zur Verwendung der Single-Sign-On-Authentifizierung, während die kostenlose Version LDAP– und PAM-Integration bietet.
High Availability durch Cluster-Betrieb und ACL-Management über die Benutzeroberfläche ist ebenfalls nur in der Enterprise-Version verfügbar.

Was gibt es sonst noch?

Zusätzlich zu Ansible bietet Rundeck weitere sogenannte “Node Executioners“, die die Remote-Konfiguration ermöglichen, z. B. einen WinRM/Powershell Executioner, mit dem PowerShell-Skripte remote ausgeführt werden können.
Oder den AWS Elastic Container Service (ECS) Node Executor (in der Enterprise-Version), der Befehle auf Amazon ECS-Containern ausführen kann.

Die Konfiguration, um Ansible verwenden zu können, war für mich relativ aufwändig. Ich hatte Probleme mich in der Benutzeroberfläche zurechtzufinden, denn das Anlegen von Nodes ist beispielsweise relativ versteckt, während das Anlegen von Jobs einfach im Job-Tab möglich ist. Dadurch hat es mich ein wenig Zeit gekostet bis ich “Nodes” (Hosts) und “Jobs” (die auszuführenden Playbooks) anlegen konnte.

Das gesagt, kommen wir zu meinen persönlichen Vor- und Nachteilen von Rundeck:

Vorteile von Rundeck

  • Einfache Installation
  • Kann viel mehr als nur Ansible
  • Teilweise über Terraform verwaltbar

Nachteile von Rundeck

  • Unübersichtliche und unintuitive Benutzeroberfläche

Grafische Ansible Automatisierung mit AWX

Was ist AWX?

AWX ist ein Open-Source-Projekt, das ein grafisches Interface und eine REST-API bereitstellt, die auf Ansible aufbauen. Das Projekt wird von Red Hat mitfinanziert und ist eines der Upstream-Projekte für die Red Hat Ansible Automation Platform.

AWX muss in einem Kubernetes-Cluster installiert werden. Es besteht zwar die Möglichkeit, es mit Docker Compose zu installieren, dies wird jedoch nur zu Testzwecken empfohlen.

Die Konfiguration erfolgt entweder über die Benutzeroberfläche oder mithilfe der AWX Ansible Collection.

Wie AWX funktioniert

Ansible Playbooks und Inventories können aus Git-Repositories (öffentlich und privat) eingelesen oder lokal auf dem Rechner abgelegt werden. Inventories können klassisch als INI- oder YAML-Datei oder aus verschiedenen Quellen als dynamische Inventories (z. B. OpenStack, AWS EC2 usw.) importiert werden.
Dynamische Inventories, für die es Plugins gibt, die AWX jedoch noch nicht nativ unterstützt, können als normale Inventory-Dateien eingebunden werden.

Für die Authentifizierung bietet AWX folgende Methoden:

  • GitHub OAuth
  • Google OAuth 2
  • LDAP
  • SAML
  • Generic OIDC

Persönlich finde ich, dass die Benutzeroberfläche von recht intuitiv zu bedienen ist und im Gegensatz zu anderen GUIs nicht überladen wirkt. Damit kommen wir zu den Vor- und Nachteilen von AWX:

Vorteile von AWX

  • Wird größtenteils von der Ansible-Community entwickelt und ist daher sehr eng mit Ansible verbunden
  • Bietet die gängigsten Authentifizierungsmethoden
  • Relativ einfach zu bedienen
  • Ist als Code konfigurierbar

Nachteile von AWX

  • Das Betreiben von AWX in einem Kubernetes-Cluster kann überwältigend sein, wenn man noch keine Erfahrung mit Kubernetes hat

Fazit

Nun habe ich dir in meinen beiden Blogbeiträgen einen groben Überblick über Semaphore, Rundeck und AWX gegeben. Jetzt bleibt mir nur noch übrig die Fragen vom Anfang zu beantworten!

Wofür ist Ansible Semaphore das richtige Tool?
Ich würde dir Semaphore empfehlen, wenn du eine Benutzeroberfläche möchtest, auf der du regelmäßig Playbooks ausführen willst. Die Infrastruktur die du damit verwalten willst sollte jedoch noch nicht allzu groß sein, da es sonst unübersichtlich werden könnte.

Für wen eigenet sich Rundeck?
Rundeck
bietet dir zwar mehr Möglichkeiten als Ansible, ist aber relativ unübersichtlich.
Rundeck ist die richtige Plattform für dich, wenn deine zu verwaltende Infrastruktur so vielfältig ist, dass neben Playbooks auch Skripte und Befehle verwaltet und geplant werden sollen.

Und was ist mit AWX?
AWX
ist aufgrund der Nähe zu Ansible und der verbesserten Konfigurationsmöglichkeiten (Konfiguration als Code durch Ansible) die Plattform der Wahl.
Besonders wenn du größere Infrastrukturen mit Hilfe von Ansible verwalten willst oder in deiner Infrastruktur bereits ein Kubernetes im Einsatz ist.

 

Ich hoffe dass ich dir mit meinen beiden Blogposts eine kleine Entscheidungshilfe geben konnte, wenn du vor der Frage stehst, welches GUI-Tool für Ansible du nutzen willst.
Wenn du darüber hinaus Hilfe bei Themen rund um Ansible, Automatisierung oder andere spannende Open Source Themen suchst, freuen ich und meine Kolleg:innen uns auf deine Nachricht!

Lucy Siemer
Lucy Siemer
Consultant

Lucy ist seit Mai 2023 bei NETWAYS als Consultant tätig, nachdem sie im Jahr 2022 ihre Ausbildung zur Fachinformatikerin für Systemintegration erfolgreich abgeschlossen hat. Ihre Schwerpunkte liegen auf den Bereichen Kubernetes, Infrastructure as Code und Monitoring. Neben ihrer Arbeit bei NETWAYS betreut Lucy auch privat ihre eigene Infrastruktur auf Kubernetes. Darüber hinaus ist sie leidenschaftlich daran interessiert, eigene Kleider zu nähen und individuelle Designs zu kreieren.