viele LXC-Container (Ubuntu 18.04 LTS) - Wie aktualisiert ihr sie ohne viel manuellen Aufwand?

tony blue

Member
Dec 26, 2017
52
1
13
48
Hallo,

Proxmox ist eine super Sache. Ich habe zwischenzeitlich für verschiedenste Aufgaben (Web, Mail, File, Game, ...) rund 15 LXC-Container laufen. Alle sind auf Basis Ubuntu 18.04 LTS installiert.

Nachdem es nun Ubuntu 20.04 LTS gibt, frage ich mich, ob ich jetzt für jeden LXC-Container ein manuelles dist-upgrade ausführen muss. Das dauert ca. 45 - 60 Minuten pro LXC-Container.

Gibt es hierfür keine einfachere Lösung mit der ich das irgendwie zentral für alle einstellen kann? Ersparen möchte ich mir das manuelle davorsitzen während des upgrades, bei dem ich immer wieder um Zustimmung oder Ablehnung zum Überschreiben der Config-Dateien gefragt werde.

Super wäre auch eine Web-Oberfläche, auf der ich die Software-Stände der einzelnen LXC-Container sehen könnte.

Vielen Dank!

Tony
 

gmed

Well-Known Member
Dec 20, 2013
414
49
48
Schau mal, ob Ubuntu dieses Paket hat "upgrade-system".
Das könnte deine Lösung sein.
 

loomes

Member
May 22, 2018
74
15
13
40
Ich habe mir für sowas ein einfaches Bash Script erstellt welches ich auf einem LXC ausführe. Es loggt sich per SSH ein in jeden LXC und führt die gewünschten Befehle aus, fertig. Einfach und simpel.
 

tony blue

Member
Dec 26, 2017
52
1
13
48
Ich habe mir für sowas ein einfaches Bash Script erstellt welches ich auf einem LXC ausführe. Es loggt sich per SSH ein in jeden LXC und führt die gewünschten Befehle aus, fertig. Einfach und simpel.

Hallo loomes,

vielen Dank für die Information. Könntest Du mir ein Beispielscript senden? Interessieren würde mich vor allem, wie Du mit den Rückfragen von apt (alte oder neue config-Datei) umgehst.

Vielen Dank!

Tony
 

loomes

Member
May 22, 2018
74
15
13
40
Ich brauchte damals nur was schnelles um meine LXC's zu updaten. Daher habe ich mir nur fix was zusammengeschrieben und nutze es so, es gibt bessere/andere Wege (puppet z.B.), mir reicht es so. Ich habe auf jedem LXC mein Upgrade Script abgelegt welches dann gestartet wird von einem weiteren Script was in Schleife per SSH jeweils das Script startet. Natürlich kann man es auch local direkt starten auf einem LXC.

Bash:
#!/bin/bash
export TERM=linux
export DEBIAN_FRONTEND=noninteractive

##########################################
APTCACHERNGIP="192.168.1.165"
APTCACHERNGPORT="3142"
APTCACHEFILE="/etc/apt/apt.conf.d/proxy"
RUNAUTOREMOVE="1"
##########################################

# Use apt-cacher-ng when ping is OK
if [ "$APTCACHERNGIP" != "" ]; then
   if ping -c 1 $APTCACHERNGIP &> /dev/null; then
      echo "Acquire::http { Proxy \"http://$APTCACHERNGIP:$APTCACHERNGPORT\"; }" > $APTCACHEFILE
   else
      if [ -e "$APTCACHEFILE" ]; then
         rm $APTCACHEFILE
      fi
   fi
else
   if [ -e "$APTCACHEFILE" ]; then
      rm $APTCACHEFILE
   fi
fi
##

HANDLER="apt"
if [ ! -e "/usr/bin/apt" ]; then
   HANDLER="apt-get"
fi

REMOTE="0"
HOSTNAME=""
if [ "$1" == "remote" ]; then
   HANDLER="apt-get"
   HOSTNAME="\033[33m`hostname`: "
   REMOTE="1"
fi

echo ""
echo -e "\033[1m$HOSTNAME\033[36mRunning '$HANDLER update' ...\033[0m"
$HANDLER update

if [ `apt-get -u upgrade --assume-no | wc -l` -le "5" ]; then
   echo ""
   echo -e "\033[1m$HOSTNAME\033[36mAll Packages are up2date ...\033[0m"
   exit 0
fi

if [ "$REMOTE" == "0" ]; then
   if [ "$HANDLER" == "apt" ]; then
      $HANDLER list --upgradable
      echo ""
   fi
   echo -e "\033[1m$HOSTNAME\033[32mDist-Upgrade startet in 10 Sekunden...\033[0m"
   read -t 10 -p "Sofort(Enter) Abbruch(n):" response
   if [ "$response" == "n" ]; then
      exit 1
   fi
fi

echo ""
echo -e "\033[1m$HOSTNAME\033[36mRunning '$HANDLER dist-upgrade' ...\033[0m"
$HANDLER -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade -y

if [ "$RUNAUTOREMOVE" == "1" ]; then
   echo ""
   echo -e "\033[1m$HOSTNAME\033[36mRunning '$HANDLER autoremove' ...\033[0m"
   $HANDLER autoremove -y
fi

echo ""
echo -e "\033[1m$HOSTNAME\033[36mRunning '$HANDLER clean' ...\033[0m"
$HANDLER clean

exit 0

Aufrufen z.B. (ist nur ein Auschnitt aus dem Script):
Bash:
#!/bin/bash

## Get SSH-Agent Key
if [ -e "$HOME/.keychain/$HOSTNAME-sh" ]; then source $HOME/.keychain/$HOSTNAME-sh; fi
## Get PGP-Agent Key
if [ `pidof gpg-agent` ]; then export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket); fi

IPRANGE="192.168.1"
LXCIPS="131 132 133 134 135 136 151 152 153 154 155 156 157 158 159 161 162 163 164 166 167 168 165" # unused ips: 160
LXCSKIPU="133 161"
SSHPORT="xxx"
UPGRADE="0"
UPDATE="1"

for IP in $LXCIPS; do
    if ping -c 1 $IPRANGE.$IP &> /dev/null; then

        HOSTNAME=`ssh -p $SSHPORT root@$IPRANGE.$IP hostname`
        echo ""
        echo -e "\033[1m\033[32mStarting Service from LXC '$HOSTNAME' with IP: $IPRANGE.$IP ...\033[0m"
        echo ""

        ############## Start dist-upgrade ########################################
        if [ "$UPGRADE" == "1" ]; then
           echo -e "\033[1m\033[33m$HOSTNAME: \033[36mInstall 'upgrade' ...\033[0m"
           scp -q -P $SSHPORT $SCRIPTS/upgrade root@$IPRANGE.$IP:/usr/bin/
           ssh -p $SSHPORT root@$IPRANGE.$IP chmod 755 /usr/bin/upgrade
        fi
        if [ "$UPDATE" == "1" ]; then
            SKIPU="0"
            for IPU in $LXCSKIPU; do
               if [ "$IPU" == "$IP" ]; then
                  SKIPU="1"
               fi
            done
            if [ "$SKIPU" == "1" ]; then
               echo -e "\033[1m\033[33m$HOSTNAME: \033[36mSkip Dist Upgrade ...\033[0m"
            else
               ssh -p $SSHPORT root@$IPRANGE.$IP upgrade remote
            fi
        fi
    else
        echo ""
        echo -e "\033[1m\033[91mLXC with IP: $IPRANGE.$IP is Offline!\033[0m"
    fi
done

exit 0

Das ganze läuft über die internen IP's, es können natürlich auch Proxmox eigene Tools wie pct usw verwendet werden, ich wollte aber etwas was auch ausserhalb von Proxmox benutzbar ist.
 

fireon

Famous Member
Oct 25, 2010
3,551
266
103
38
Austria/Graz
iteas.at
Wir haben auch Puppet mit vielen Hundert Servern im Einsatz. Aber die Ubuntu Updates lassen wir Ubuntu machen :) Sprich einfach ubuntu unattended-upgrades installieren, nach deinen Vorstellungen konfigurieren und fertig. Wir arbeiten so seit Jahren und es läuft einfach.
 
  • Like
Reactions: Leon Gaultier

tony blue

Member
Dec 26, 2017
52
1
13
48
Vielen Dank für die Hinweise.

Dazu noch eine Verständnisfrage: unattended-upgrades kann aber nur das laufende apt-get update + apt-get dist-upgrade ersetzen? Das "do-release-upgrade" macht unattended-upgrades aber nicht - oder?

Mir ging es insbesondere darum, den Zeitaufwand für das Upgrade von Ubuntu 18.04 LTS auf 20.04 LTS von 45 - 60 Minuten pro LTS-Container zu reduzieren.

Vielen Dank!


Tony
 

Steffenprox

Member
Feb 22, 2020
33
5
8
31
Hallo, ich habe ein apt-Cache Server erstellt über die die VMs Updates beziehen. Die VMs aktualisiere ich dann über Ansible.
 

LnxBil

Famous Member
Feb 21, 2015
5,482
596
133
Germany
Dazu noch eine Verständnisfrage: unattended-upgrades kann aber nur das laufende apt-get update + apt-get dist-upgrade ersetzen? Das "do-release-upgrade" macht unattended-upgrades aber nicht - oder?

Ein vollautomatisches dist-upgrade? Du bist echt mutig. Innerhalb der Distribution kann man das ohne Probleme verwenden, aber um ein OS-Update durchzuführen, das ist schwierig und würde ich nie voll-automatisieren. Nach dem Upgrade läuft bei uns auch immer noch ein deborphaner um unnötige Pakete zu entfernen, dann gibt es mal ein Update z.B. damals von Apache 2.2 auf Apache 2.4 und dann klappt keine Konfig mehr usw. Also soooo einfach ist es dann doch nicht. Aber das musst du selbst entscheiden, wieviel Arbeit du morgens haben möchtest, wenn sich deine Container in der Nacht selbst zerlegt haben.

Innerhalb der Distribution läuft es aber ohne Probleme und er kann auch Neustarts machen (wobei das ohne Kernel im LXC eigentlich nicht mehr vorkommen sollte), wenn das benötigt wird. Es kann dir aber halt auch passieren, dass dies z.B. über Cron-gesteuert deine Maschine kaputt macht, das muss man immer bedenken, wenn man das z.B. mit kritischer Infrastruktur macht.

Hallo, ich habe ein apt-Cache Server erstellt über die die VMs Updates beziehen.

Das ist auch schlau. Wir haben für einige Linux-Distributionen gleich den kompletten Mirror lokal.
 

Leon Gaultier

Active Member
Mar 14, 2019
570
59
28
42
Einen lokalen Debian Mirror habe ich auch. Da ich eh nur Debian verwende passt das. Dazu dann halt so Konfigurationen wie testing und production und somit bekommen alle Tage die testing ein update und Sonntag nur die produktion.


Grüße
 

fireon

Famous Member
Oct 25, 2010
3,551
266
103
38
Austria/Graz
iteas.at
Das ist auch schlau. Wir haben für einige Linux-Distributionen gleich den kompletten Mirror lokal.
Oja, Mirror ist Mega. Möchte man nicht mehr missen. Sehr zu empfehlen Aptly. Damit kann man komplette Repos verschiedener Distris und Versionen Managen inkl. Snapshot. Wir können so bequem Versionen kontrollieren. Und ja, wir testen tatsächlich Updates bevor sie zum Kunden gehen ca. 2-3 Wochenlang im produktivem Betrieb :cool:
 

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE and Proxmox Mail Gateway. We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get your own in 60 seconds.

Buy now!