[PYTHON] Détecte les mises à jour des packages Linux (yum / apt)

Chose que tu veux faire

Il y a une prémisse que "les paramètres sont toujours légèrement différents". Par exemple, même si vous avez 1000 unités, si vous avez la même configuration, le nombre de packages de mise à jour sera le même et vous devriez pouvoir configurer un serveur de distribution, vous ne devriez donc pas avoir besoin d'un tel outil. Il n'a pas beaucoup de distorsion avec l'infrastructure Docker dont on parle beaucoup, et cela n'a rien à voir avec le lancement temporaire de vagrant.

J'en ai environ 5 moi-même, mais je les utilise quand j'ai un environnement différent pour Debian / Ubuntu / CentOS.

Je ne pouvais tout simplement pas penser à un logiciel qui gère de telles vérifications à travers les systèmes d'exploitation.

Ce que j'ai fait

https://github.com/dmiyakawa/check_linux_updates

check_updates.py: observez l'autre côté de votre terminal

Il s'agit d'une implémentation qui permet de voir les mises à jour pour chaque hôte via Fabric (ssh). Par défaut, il va vérifier en parallèle.

Exemple(La partie snip était en fait équivalente à FQDN):
$ check_updates.py
hansode.(snip)     :   0(0) (REBOOT-REQUIRED)
gobusode.(snip)    :  40(0)
shichibusode.(snip):   1(0)
mowa-net.jp        :   3(2)
centos64.(snip)    :   2(?) (REBOOT_REQUIRED)

gobusode est un Sid Debian. Ce sera comme ça dès qu'il sera laissé sans surveillance. Cependant, un peu plus important est mowa-net.jp, qui a deux mises à jour de sécurité (entre parenthèses), donc cela devrait être mis à jour. Bien sûr, Debian a un mécanisme pour appliquer automatiquement les mises à jour de sécurité, c'est donc une punition pour ne pas l'utiliser.

$ check_updates.py --upgrade mowa-net

Sera mis à jour. Dans ce cas, il sera exécuté en série sur un hôte, il est donc normal de demander le mot de passe.

J'ai changé le nom d'hôte de différentes manières, mais cela fonctionne généralement comme ça. Il peut être mélangé avec CentOS (centos64 ci-dessus est un exemple), mais j'ignore l'implémentation et je n'ai vu aucune mise à jour de sécurité sur CentOS. Donc c'est "?". (Je le vois avec les outils décrits plus tard. Cela)

L'implémentation de mon côté autour de Paramiko (connexion ssh) est trop appropriée, et lors de l'exécution en parallèle, si vous n'entrez pas avec l'authentification par clé publique, elle échouera à l'invite du mot de passe. sudo Je meurs toujours à l'invite du mot de passe quand j'en ai besoin.

Vous pouvez définir un groupe tel que "propre groupe de serveurs". L'exemple suivant parcourt les hôtes du groupe de mines et prend des décisions de mise à jour et de redémarrage interactives. (Fabric n'autorise pas le Oui / Non interactif lors de l'exécution en parallèle)

$ check_updates.py --serial --ask-upgrade mine

On suppose que le côté exécution est Python 2.7.

$ check_updates.py -h
usage: check_updates.py [-h] [-s] [-q] [-n] [-v] [--ask-upgrade]
                        [--auto-upgrade] [--dist-upgrade]
                        [--auto-upgrade-restart] [--refresh] [--show-packages]
                        [--sanity-check]
                        [HOST [HOST ...]]

Checks if remote hosts need update or not.

positional arguments:
  HOST                  Host names or host groups. If not specified, default
                        hosts configuration will be used. This may allow
                        special command "all" "list", "groups" (=
                        "list_groups").

optional arguments:
  -h, --help            show this help message and exit
  -s, --serial          Executes check in serial manner
  -q, --quiet           Suppress unnecessary output.
  -n, --nonregistered   Allow host names that are not registered
  -v, --verbose         Show verbose outputs, including Fabric ones.
  --ask-upgrade         Asks if upgrade should be done when appropriate. Only
                        effective when --serial (-s) option is set
  --auto-upgrade        Requests hosts to upgrade itself when necessary.
  --dist-upgrade        Use "dist-upgrade" instead of "upgrade". Only
                        effective with debian-like systems. Meaningless on
                        redhat-like systems.
  --auto-upgrade-restart
                        Requests hosts to upgrade itself and restart when
                        upgrade is finished. With this option restart will be
                        executed regardless of necessity (with/without
                        "Reboot-Required" status). This will execute "dist-
                        upgrade" on debian(-like) OSes, not "upgrade.
  --refresh             Run "apt-get update" on debian-like systems.
  --show-packages       This will show names of packages to be upgraded.
  --sanity-check        First executes sanity check toward each host serially
                        (not in parallel). If some hosts show prompt in the
                        check phase, this command will abort itself
                        immediately. Might be useful for "debugging" new
                        hosts. If you are considering --serial option, This
                        "check" would be meaningless.

check_update_local.py: Exécuter de l'autre côté

Avec le script ci-dessus, vous devez établir une connexion ssh, et le processus d'authentification / autorisation est délicat. Il existe de nombreux inconvénients lors de la surveillance avec Zabbix.

Créons quelque chose qui peut être surveillé à partir de Zabbix Agent même si un script (Python) est placé sur chaque hôte.

$ check_update_local.py -h
usage: check_update_local.py [-h] [--log LOG] [-d] [-s] [-r] [-q]

Check if update is available. Returns num of updates

optional arguments:
  -h, --help            show this help message and exit
  --log LOG             Set Python log level. e.g. DEBUG, INFO, WARN
  -d, --debug           Shortcut for --log DEBUG
  -s, --security-updates
                        Instead of showing num of updates, show num of
                        security updates.
  -r, --reboot_required
                        Instead of showing num of updates, return 1 if reboot
                        is required
  -q, --quiet           Logging will be disabled entirely.
$ check_update_local.py 
0
$ check_update_local.py -s
0
$ check_update_local.py -r
1

Debian a besoin du paquet update-notifier-common pour utiliser la commande apt-check. Certes, il semble qu'il soit inclus dès le début s'il s'agit d'un système Ubuntu, mais les détails sont inconnus.

C'était relativement facile jusqu'à présent, Si vous ne faites pas attention et essayez de rendre ce script compatible avec CentOS 6 Le Python par défaut pour CentOS 6 a flippé à 2.6 (plutôt que 2.7). J'ai fait beaucoup de hacks étranges, et si je suis entré dans argparse avec pip, je suis arrivé à un niveau où cela fonctionne, mais Je voudrais m'attendre à une méthode plus propre.

Malheureusement, la prise en charge de Python 3 n'est pas incluse. 14.04 Ce n'est peut-être pas de type LTS.

L'utilisation avec Zabbix est décrite dans README.md. Les deux apt-check et yum sont vraiment difficiles à frapper de la part de l'agent, donc c'est mal à l'aise. Lorsqu'il est utilisé avec de nombreux objets surveillés, le processus côté serveur qui atteint l'agent peut devenir plein. Je l'ai fait plus tôt, donc je ne peux pas le vérifier.

ce que je veux

Meilleur outil que ça

Postscript

Recommended Posts

Détecte les mises à jour des packages Linux (yum / apt)
Comment empêcher les mises à jour de paquets avec apt
[Linux] Mettez à jour le package hors ligne
Système de gestion de paquet principal Linux