Automatische Paket Updates mit Rundeck

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
cgarling
Beiträge: 151
Registriert: 11.04.2007 14:29:51

Automatische Paket Updates mit Rundeck

Beitrag von cgarling » 02.05.2022 15:23:19

Hallo in die Runde!

Ich bin gerade dabei die Paket Updates mit Rundeck zu automatisieren. Ziel ist das Einspielen aller offenen Updates ohne Neustart eines Dienstes. Das passiert später mit einem eigenen Job. So kann ich erst über alle Maschinen die Updates ausrollen und dann im Wartungsfenster kontrolliert neustarten.

Meine Abfolge ist wie folgt:

Code: Alles auswählen

echo 'exit 101' | sudo tee /usr/sbin/policy-rc.d
sudo chmod -v +x /usr/sbin/policy-rc.d

sudo apt-get clean

sudo apt-get update

sleep 2

export DEBIAN_FRONTEND=noninteractive
yes '' | sudo apt-get -y -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" upgrade

sudo rm -v /usr/sbin/policy-rc.d
Laut meiner Recherche verhindert das policy-rc.d den Neustart der Dienste, sofern ein Update einen anfordern würde. Prinzipiell funktioniert das so, ich habe aber das Gefühl, dass so nicht alle Update eingespielt werden. Manuelle Tests haben ergeben, dass apt-get Pakete zurückhält "kept back" die apt aber installieren würde. Nur bei apt bekomme ich die Warnung "WARNING: apt does not have a stable CLI interface. Use with caution in scripts.", weshalb ich noch apt-get verwende.

Außerdem kommt das so nicht mit allen Konstellationen klar. Eben ist es beispielsweise beim Postfix Update hängen geblieben, als die Frage gestellt wurde wie mit der Config verfahren werden soll.

Wie kann man das optimieren um sauber und ohne Neustart von Diensten Updates einspielen zu können?

Viele Grüße, Christian

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Automatische Paket Updates mit Rundeck

Beitrag von JTH » 02.05.2022 20:01:52

cgarling hat geschrieben: ↑ zum Beitrag ↑
02.05.2022 15:23:19
Hallo in die Runde!
Moin.

cgarling hat geschrieben: ↑ zum Beitrag ↑
02.05.2022 15:23:19
Nur bei apt bekomme ich die Warnung "WARNING: apt does not have a stable CLI interface. Use with caution in scripts.", weshalb ich noch apt-get verwende.
Das „noch“ am Ende kannst du streichen. Wie dir die Warnung ja gesagt hat, ist die Benutzung von apt in Skripten nicht empfohlen. Das wird in der Manpage von apt nochmal genauer ausgeführt. apt-get, apt-cache und co. sind durch apt nicht obsolet geworden, sondern für Skripte weiter die angedachten Werkzeuge.

Erstmal als kritische Nachfrage: Warum steht dort überall sudo? – das ist in meinen Augen meist ein Anti-Pattern. Oder zeugt allgemein, ohne das ich dir hier damit zu nahe treten will, manchmal von fehlendem Verständnis von Benutzerrechten.

Wird das Skript vielleicht sowieso in Kontext des root-Benutzers ausgeführt? Dann kannst du sudo generell weglassen. Oder, falls es doch von einem unprivilegierten Benutzer gestartet wird, würde ich anregen, das ganze Skript als sudo upgrade-without-restarts oder so aufzurufen.

Als nächstes:
Wenn ich mich nicht völlig täusche, ist

Code: Alles auswählen

yes | apt-get -y
redundant. Das yes am Anfang kannst du dir sparen. Zweimal ja ist immer noch „nur“ ja ;)

cgarling hat geschrieben: ↑ zum Beitrag ↑
02.05.2022 15:23:19
Manuelle Tests haben ergeben, dass apt-get Pakete zurückhält "kept back" die apt aber installieren würde.
Das darf eigentlich nicht sein. Abgesehen von der Benutzerschnittstelle – apt hat bunte Fortschrittsbalken – müssen sich beide identisch verhalten. Hast du sie exakt gleich aufgerufen? Oder einmal vielleicht full-upgrade benutzt?

cgarling hat geschrieben: ↑ zum Beitrag ↑
02.05.2022 15:23:19
Laut meiner Recherche verhindert das policy-rc.d den Neustart der Dienste, sofern ein Update einen anfordern würde.
Ja, das soll anscheinend auch mit systemd weiterhin so funktionieren (siehe man deb-systemd-invoke). Das setzt voraus, dass die Maintainerskripte der Pakete entsprechend geschrieben sind und deb-systemd-invoke benutzen. Die aus dem Debian-Repo sind das wohl – benutzt du evtl. (selbstgeschriebene) Fremdpakete?

cgarling hat geschrieben: ↑ zum Beitrag ↑
02.05.2022 15:23:19

Code: Alles auswählen

export DEBIAN_FRONTEND=noninteractive
yes '' | sudo apt-get -y -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" upgrade
Ich kenne mich mit sudo recht wenig aus. Aber da es eine explizite Option --preserve-env hat, nehme ich mal an, dass das hier dein Problem ist: Du exportierst zwar DEBIAN_FRONTEND. In die wegen sudo saubere Environment von apt-get wird die Variable aber nicht übernommen. Also: Siehe mein Einwand oben zum wild verteilten sudo. Oder --preserve-env ergänzen.
Manchmal bekannt als Just (another) Terminal Hacker.

cgarling
Beiträge: 151
Registriert: 11.04.2007 14:29:51

Re: Automatische Paket Updates mit Rundeck

Beitrag von cgarling » 03.05.2022 08:54:53

Guten Morgen!

Gut zu wissen, dann bleibt es bei apt-get und Co. für die Verwendung in Skripten.

Das sudo muss verwendet werden, weil es kein einzelenes Skript ist, sondern einzelne Schritte in Rundeck, die als rundeck User auf dem entsprechenden System ausgeführt werden. Siehe https://resources.rundeck.com/learning/ ... f-rundeck/.

An der Stelle "yes | apt-get -y" müsste ich nochmal genau prüfen, wofür es tatsächlich gilt. Meinem Verständnis nach bezog sich das auf die beiden force-Optionen für die das -y nicht ausreicht bzw. gilt.

Den Unterschied zwischen apt und apt-get hatte ich jeweils bei einem einfach upgrade festgestellt. In dem Beispiel wurden postgresql Pakete von apt-get zurückgehalten die apt aber installiert hätte. Das muss ich nochmal explizit prüfen, damit ich auch ein konkretes Beispiel vorbringen kann.

Wir benutzen zusätzliche Repos für Bareos, Icinga2 und PostgreSQL, das sind aber jeweils die Originalen.

Bzgl. des Setzen der export Variable hatte ich das seinerzeit auch auf dem Schirm und wenn ich mich richtig erinnere auch geprüft, dass die Variable durchkommt. Das sehe ich mir auch nochmal genauer an.

Viele Grüße, Christian

cgarling
Beiträge: 151
Registriert: 11.04.2007 14:29:51

Re: Automatische Paket Updates mit Rundeck

Beitrag von cgarling » 03.05.2022 11:38:18

Hier der Vergleich von apt und apt-get upgrade:

Code: Alles auswählen

# apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following package was automatically installed and is no longer required:
  libfastlz
Use 'apt autoremove' to remove it.
The following packages have been kept back:
  postgresql-client-common postgresql-common
The following packages will be upgraded:
  base-files ca-certificates-java dbus gettext-base grub-common grub-pc grub-pc-bin grub2-common icinga2 icinga2-bin icinga2-common icinga2-doc java-common laptop-detect libdbus-1-3 libestr0 libglib2.0-0 libglib2.0-data libidn11 libnfnetlink0 libperl5.24 libpq5 libxau6
  libxslt1.1 openjdk-11-jre-headless openssh-client openssh-server openssh-sftp-server perl perl-base perl-modules-5.24 postfix postfix-sqlite postgresql-9.6 postgresql-client-9.6 postgresql-contrib-9.6 puppet-agent rake unzip usbutils
40 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.
Need to get 97.2 MB of archives.
After this operation, 2,994 kB of additional disk space will be used.
Do you want to continue? [Y/n] n
Abort.

Code: Alles auswählen

# apt upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following package was automatically installed and is no longer required:
  libfastlz
Use 'apt autoremove' to remove it.
The following NEW packages will be installed:
  libcommon-sense-perl libjson-perl libjson-xs-perl libtypes-serialiser-perl pgdg-keyring
The following packages will be upgraded:
  base-files ca-certificates-java dbus gettext-base grub-common grub-pc grub-pc-bin grub2-common icinga2 icinga2-bin icinga2-common icinga2-doc java-common laptop-detect libdbus-1-3 libestr0 libglib2.0-0 libglib2.0-data libidn11 libnfnetlink0 libperl5.24 libpq5 libxau6
  libxslt1.1 openjdk-11-jre-headless openssh-client openssh-server openssh-sftp-server perl perl-base perl-modules-5.24 postfix postfix-sqlite postgresql-9.6 postgresql-client-9.6 postgresql-client-common postgresql-common postgresql-contrib-9.6 puppet-agent rake unzip
  usbutils
42 upgraded, 5 newly installed, 0 to remove and 0 not upgraded.
Need to get 97.8 MB of archives.
After this operation, 3,667 kB of additional disk space will be used.
Do you want to continue? [Y/n] n
Abort.
Ich hab etwas recherchiert, die Pakete werden zurückgehalten, weil sie neue Pakete installieren würden, was erstmal nicht erlaubt ist. Ich habe daher die Zeilen nun wie folgt definiert:

Code: Alles auswählen

export DEBIAN_FRONTEND=noninteractive
sudo --preserve-env apt-get upgrade -y -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold" --with-new-pkgs
Das yes vorneweg war wahrscheinlich wirklich überflüssig. Zusätzlich erlaube ich die Installation abhängiger neuer Pakete.

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: Automatische Paket Updates mit Rundeck

Beitrag von eggy » 03.05.2022 11:45:53

Nimm "apt-get dist-upgrade", Details siehe "man apt-get"

cgarling
Beiträge: 151
Registriert: 11.04.2007 14:29:51

Re: Automatische Paket Updates mit Rundeck

Beitrag von cgarling » 03.05.2022 11:52:48

Das yes vorneweg hatte doch seinen Sinn, und zwar um die Ausgabe des needrestart Hooks zu bestätigen und weiter zu machen. Final ist es also:

Code: Alles auswählen

export DEBIAN_FRONTEND=noninteractive
yes '' | sudo --preserve-env apt-get dist-upgrade -y -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold"

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Automatische Paket Updates mit Rundeck

Beitrag von JTH » 03.05.2022 13:30:48

cgarling hat geschrieben: ↑ zum Beitrag ↑
03.05.2022 08:54:53
Bzgl. des Setzen der export Variable hatte ich das seinerzeit auch auf dem Schirm und wenn ich mich richtig erinnere auch geprüft, dass die Variable durchkommt. Das sehe ich mir auch nochmal genauer an.
Hab auch mal kurz drauf geschaut. In der Debian-Standardkonfiguration für sudo werden Umgebungsvariablen nicht generell durchgereicht.

Wenn du es noch expliziter machen möchtest, welche Variable für apt-get gesetzt ist und damit potentielle, ungewollte Interferenz mit anderen Variablen vermeidest: Man kann explizit einzelne Variablen übergeben:

Code: Alles auswählen

sudo DEBIAN_FRONTEND=noninteractive apt-get foobar …
--preserve-env würde ja (fast) alles durchreichen, wenn du Pech hast, verbirgt sich da mal was ungewolltest drunter.

cgarling hat geschrieben: ↑ zum Beitrag ↑
03.05.2022 11:52:48
Das yes vorneweg hatte doch seinen Sinn, und zwar um die Ausgabe des needrestart Hooks zu bestätigen und weiter zu machen.
Laut man needrestart beachtet needrestart auch DEBIAN_FRONTEND. Und sollte dann, nehm ich an, keine interaktive Fragen stellen. Vielleicht scheiterte das bisher einfach an der nicht richtig gesetzten Variablen?

Alternativ kennt needrestart die Umgebungsvariablen NEEDRESTART_MODE und NEEDRESTART_SUSPEND. Mit denen kann man gezielter drangehen, als mit dem Totschlaghammer

Code: Alles auswählen

yes | …

cgarling hat geschrieben: ↑ zum Beitrag ↑
03.05.2022 11:38:18
Ich hab etwas recherchiert, die Pakete werden zurückgehalten, weil sie neue Pakete installieren würden, was erstmal nicht erlaubt ist. Ich habe daher die Zeilen nun wie folgt definiert:

Code: Alles auswählen

[…] apt-get upgrade […] --with-new-pkgs
Ah, Tatsache, apt verhält sich standardmäßig so, als ob --with-new-pkgs übergeben wurde:

Code: Alles auswählen

$ apt-config shell Upgrade-Allow-New Binary::apt::APT::Get::Upgrade-Allow-New
Upgrade-Allow-New='1'
apt-get tut das nicht. Gut zu wissen :)
Manchmal bekannt als Just (another) Terminal Hacker.

cgarling
Beiträge: 151
Registriert: 11.04.2007 14:29:51

Re: Automatische Paket Updates mit Rundeck

Beitrag von cgarling » 03.05.2022 15:46:52

Danke, also final ist das von der Zeile übrig geblieben:

Code: Alles auswählen

sudo DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y -o DPkg::options::="--force-confdef" -o DPkg::options::="--force-confold"
Im Test wurden so alle Updates mitgenommen.

Antworten