Aggiornamenti di sistema per molti server


11

Abbiamo molti server e vogliamo ancora aggiornarli tutti. Il modo effettivo è che qualsiasi amministratore di sistema passa da un server all'altro e crea un aptitude update && aptitude upgrade- non è ancora bello.

Sto cercando una soluzione che sia ancora migliore e molto intelligente. Il burattino può fare questo lavoro? Come si fa?


sì, il burattino può farlo. cssh risolverà il tuo problema anche a breve termine.
Sirex,

Risposte:


10

È possibile utilizzare il exectipo come:

exec { "upgrade_packages":
    command => "apt-get upgrade -q=2",
    path    => "/usr/local/bin/:/bin/:/usr/bin/",
    # path  => [ "/usr/local/bin/", "/bin/" ],  # alternative syntax
}

Ad essere sincero, non l'ho provato da solo, ma penso che tu debba solo creare un nuovo modulo che includa una tale definizione exec.

Il apt-get upgradecomando è interattivo. Per farlo funzionare tranquillamente, puoi aggiungere l'opzione -q=2come mostrato sopra.


sembra molto buono! Penso di aver creato un Puppet Usecase con alcune Testmachine per provare questo. Grazie molto!
Dennis Wisnia,

3
+1 per raccomandare Puppet! Cambia la tua vita come amministratore di sistema :)
Antoine Benkemoun,

3
Tieni presente che questo dirigente verrà eseguito su ogni esecuzione di Puppet (ogni 30 minuti) che potrebbe compromettere il tuo proxy e / o il tuo mirror piuttosto difficile se hai un "sacco di server". Personalmente, consiglierei di implementare una pianificazione per il tipo exec sopra, assicurandomi che funzioni solo di notte, per esempio. Secondo me, Puppet ha lo scopo di imporre lo stato del sistema e l'esecuzione di un comando simile a upgrade_packages senza supervisione umana attraverso di esso, è sia un po 'spaventoso che un po' di abuso di Puppet. Lo strumento mColective fornito con Puppet Enterprise (o equivalente equivalente open source) potrebbe essere un'opzione migliore.
wzzrd,

7
La nostra installazione fantoccio ha un exec simile che controlla il timestamp su un file ed esegue l'aggiornamento solo se è più recente della versione sul client. Quando vogliamo aggiornare tutto, abbiamo touchquel file sul burattinaio.
Ladadadada,

@wzzrd: buon punto, ma può essere migliorato controllando alcune condizioni esterne come ha detto Ladadadada.
Khaled

7

se tutti i tuoi host sono debian, puoi provare il pacchetto degli aggiornamenti automatici.

http://packages.debian.org/sid/unattended-upgrades

Qui abbiamo usato Puppet per gestire le nostre macchine virtuali debian, con Puppet siamo in grado di abilitare e gestire configurazioni di aggiornamento non presidiate su tutti i server.

Recentemente il nostro team sta testando lo strumento mcollective per eseguire comandi su tutti i server, ma per utilizzare le competenze ruby ​​mcollective sono necessarie.

[s] Guto


5

Consiglio di scegliere Puppet, facter e mCollective.

mCollective è un framework molto carino in cui puoi eseguire comandi su una serie di host (in parallelo) usando facter come filtro.

Aggiungi a quello un proxy / cache locale e saresti ben impostato per la gestione dei server.


Sono d'accordo, Puppet non è davvero lo strumento migliore per gestire azioni amministrative come aggiornamenti di pacchetti di massa / orchestrati.
Robbyt,

3

Utilizzare uno strumento creato per eseguire un singolo comando su più server. E con ciò non intendo avere un terminale kazillion aperto con Terminator o ClusterSSH, ma avere un singolo terminale su un server di gestione che esegue uno strumento adatto al lavoro.

Consiglierei func, Salt o mCollective in questo contesto. Se hai già Puppet, scegli mCollective (si integra perfettamente in Puppet). Se non lo fai, e hai un vecchio Python sulle tue macchine, potresti divertirti con func. Se Python è nuovo, prova Salt. Tutti questi strumenti eseguono il comando specificato nella riga di comando in modo asincrono, il che è molto più divertente di un loop ssh sequenziale o addirittura esegue gli stessi comandi aptitude in umpteen finestre di Terminator su umpteen server.

Avrete sicuramente ami Salt .


2

Quindi immagino che ci siano molte cose che contribuiscono a una buona soluzione:

  • Larghezza di banda
  • Facilità di amministrazione
  • Registrazione dettagliata nel caso in cui qualcosa si rovini.

Larghezza di banda : sostanzialmente due alternative per risparmiare larghezza di banda mi vengono in mente:

  • Configurare un mirror Debian e configurare tutti i client per usare questo mirror, vedere http://www.debian.org/mirror/ per maggiori dettagli. (Lo consiglierei)
  • Configurare un proxy (apt-cacher, apt-proxy o Squid) e aumentare la cache in modo che tutti i vostri clienti possano trarre profitto da questa cache

Amministrazione : configurerei una shell parallela come PDSH , PSSH , GNU Parallel e invierei il comando su tutti i client, se avessi testato il comando in precedenza su una macchina di esempio. Quindi non è molto probabile che possa fallire su tutti gli altri. In alternativa puoi considerare un lavoro cron su tutti i client, ma potrebbe non riuscire automaticamente, quindi preferirei la prima soluzione.

Se ti preoccupi della simultaneità degli aggiornamenti, puoi programmare i tuoi comandi con at

Registrazione : Come per le shell parallele, hai la possibilità di reindirizzare l'output combinando stderr e stdout e scriverlo in un file di log.


Larghezza di banda: esistono proxy di memorizzazione nella cache specifici per i repository deb, cercare apt-cacher o apt-proxy.
S19N,

Fantastico lo integrerò nella risposta.
matematica

e software come mCollective consentiranno l'esecuzione di comandi paralleli E segnaleranno l'output / risultato.
CloudWeavers,

1

Il mio wrapper ssh parallelo: classh è un'alternativa ai vari strumenti paralleli e cluster ssh là fuori.

Potrebbe piacerti di più o potresti odiarlo. Ci sono solo tre motivi per cui lo menziono qui:

  • È estremamente semplice da installare e utilizzare: un singolo file .py senza dipendenze esterne oltre le librerie standard di Python 2.5.
  • È estremamente affidabile nei limiti. Lo uso ogni giorno lavorativo, spesso quasi 100 volte al giorno e di solito su raccolte da centinaia a qualche migliaio di obiettivi per comando. (L'ho testato su elenchi target di oltre 25 mila server alla volta). Non è mai riuscito a correre, non è riuscito a completare o mi ha dato un comportamento indeterminato. (Le uniche limitazioni relative a quelle del subprocess.communicate()metodo Python --- quindi puoi ottenere solo circa 64K di stdout e, separatamente, fino a 64K di stderr, per esempio; anche qualsiasi processo remoto che tenta di leggere dal suo stdin si fermerà semplicemente fino a quando il subporcess ssh locale viene ucciso, automaticamente dalla gestione del timeout di classh )
  • È estremamente semplice scrivere uno script personalizzato, in Python, per utilizzare classh.py come modulo. Quindi è molto facile scrivere qualcosa del tipo:

    
        !#/bin/env python
        import classh
        job = classh.SSHJobMan(cmd, targets)
        job.start()
        while not job.done():
            completed = job.poll()
            for i in completed:
                # do something with the classh.JobRecord object referenced by i
        # done

    # You can optionally do post-processing on the dictionary of JobRecords here # keyed off the target strings (hostnames) </code></pre>

Questo è tutto quello che c'è da fare. Ad esempio, nel ciclo completo nidificato è possibile raccogliere un elenco di tutti quelli che hanno restituito un determinato stato di uscita o ricercare messaggi di errore specifici e impostare processi di follow-up per gestirli. (I lavori verranno eseguiti contemporaneamente, impostazione predefinita di 100 lavori in qualsiasi momento, fino a quando ciascuno non sarà completato; quindi un semplice comando su alcune centinaia di host di solito si completa in pochi secondi e uno script di shell molto complesso in una singola lunga stringa di comando. diciamo una cinquantina di righe ... può completare più di qualche migliaio di host in circa 10 minuti ... circa 10K host all'ora nel mio ambiente, con molti di quelli situati in modo intercontinentale).

Quindi questo potrebbe essere qualcosa che puoi usare come misura ad hoc fino a quando non hai implementato la tua configurazione fantoccio e test bene ... ed è anche abbastanza utile per eseguire piccoli sondaggi ad hoc dei tuoi host per vedere quali si stanno discostando dai tuoi standard in vari piccoli modi.


Per inciso sulle pagine web di classe, su bitbucket.org c'è anche un elenco di vari altri wrapper ssh che ho esaminato prima di decidere di scrivere il mio. Qualcuno di loro potrebbe funzionare per te. Inoltre, potresti cercare Python Fabric, che è un progetto più recente con caratteristiche simili, anche se un po 'più estese e un po' più complesse.
Jim Dennis,

1

La risposta usando exec è piuttosto utile.

Tuttavia, secondo il manuale di apt-get, non è una buona idea usare -q = 2 in questo modo (anche se l'ho usato per anni senza problemi)

-q, --quiet
       Quiet; produces output suitable for logging, omitting progress indicators. More q's will produce more quiet up to a maximum of 2. You can also use -q=# to set the
       quiet level, overriding the configuration file. Note that quiet level 2 implies -y, you should never use -qq without a no-action modifier such as -d, --print-uris or
       -s as APT may decided to do something you did not expect. Configuration Item: quiet.

Ho usato uno script per anni, eseguendo apt-get nel modo seguente:

ssh example.org "apt-get update && apt-get -y upgrade && apt-get -y dist-upgrade && apt-get clean"

Cose come le marionette e altri strumenti che le persone menzionate sicuramente potrebbero funzionare, ma sembra che sia eccessivo per quello che fondamentalmente sta solo imitando alcuni comandi digitati da un essere umano. Credo nell'usare lo strumento più semplice per un lavoro specifico, in questo caso uno script bash è semplice quanto diventa senza perdere funzionalità.


Sì, penso che sia un buon modo per alcuni server. Ma se dovessi ottenere alcune altre opzioni (implementare alcune configurazioni su ciascun server, ecc.) Quindi il suo pupazzo è il modo migliore. Al momento lavoro al burattino e al suo bellissimo ..
Dennis Wisnia il

Non sono in disaccordo. Ma ai fini di ciò che il poster stava chiedendo a riguardo potrebbe essere eccessivo.
aseq,

1

Per anni ho felicemente aggiornato e installato pacchetti usando apt-dater . È uno strumento leggero ed efficace per la gestione remota dei pacchetti. Esso utilizza screen, sudoe ssh.
Per la gestione dei pacchetti apt-dater può essere una soluzione più semplice rispetto agli strumenti di gestione della configurazione.
apt-dater è utile per la gestione centralizzata dei pacchetti su diverse versioni GNU / Linux come Debian e CentOS.


1

puoi usare Fabric . Fabric è una libreria Python (2.5-2.7) e uno strumento da riga di comando per semplificare l'uso di SSH per le attività di distribuzione delle applicazioni o di amministrazione dei sistemi.


0

usa webmin ,, e usa la sua funzione cluster webmin, in cui puoi aggiungere tutti i sistemi a una console webmin ed emettere qualsiasi comando o controllarli tutti da un unico posto.

O

Usa Cluster ssh

O

PSSH


Sì, posso davvero aprire molte finestre e lavorare in parallelo. Cluster SSH è piuttosto bello ma penso che non sia abbastanza intelligente.
Dennis Wisnia,

0

Un'altra soluzione se tutti i tuoi host eseguono Debian (o derivati) è usare il pacchetto cron-apt . Ma, come suggerito dalla documentazione, è necessario prestare un po 'di attenzione.

Attualmente sto usando cron-apt su una dozzina di server per eseguire automaticamente e incustoditi tutti gli aggiornamenti di sicurezza. Per evitare eventuali aggiornamenti indesiderati, utilizzo cron-apt solo su server che eseguono la distribuzione stabile Debian e mi assicuro di configurare i miei sorgenti apt in modo da usare il nome della distribuzione, wheezy , e non il suo alias (stabile).

La configurazione cron-apt specifica che uso è riassunta in un file di azione: /etc/cron-apt/action.d/5-install

dist-upgrade -y -o APT::Get::Show-Upgraded=true -o Dir::Etc::SourceList=/etc/apt/sources.list.d/security.list -o Dir::Etc::SourceParts="/dev/null"

Qualsiasi altro aggiornamento, viene eseguito manualmente, utilizzando lo schermo o qualsiasi cosa sia più appropriata, poiché potrebbe richiedere un intervento manuale durante l'aggiornamento.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.