Actualizaciones del sistema para muchos servidores.

11

Tenemos muchos servidores y todavía queremos actualizarlos todos. La forma real es que cualquiera de los administradores de sistemas va de servidor a servidor y crea un aptitude update && aptitude upgrade- todavía no es genial.

Ahora estoy buscando una solución que sea aún mejor y muy inteligente. ¿Puede la marioneta hacer este trabajo? ¿Cómo lo haces?

Dennis Wisnia
fuente
Sí, la marioneta puede hacer esto. cssh también solucionaría su problema a corto plazo.
Sirex

Respuestas:

10

Puede usar el exectipo como:

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

Para ser honesto, no lo intenté yo mismo, pero creo que solo necesita crear un nuevo módulo que incluya una definición ejecutiva de este tipo.

El apt-get upgradecomando es interactivo. Para que funcione silenciosamente, puede agregar la opción -q=2como se muestra arriba.

Khaled
fuente
¡se ve muy bien! Creo que creo un Caso de uso de marionetas con algunas Testmachines para probar esto. ¡Muchas gracias!
Dennis Wisnia
3
+1 por recomendar Puppet! Cambia tu vida como administrador de sistemas :)
Antoine Benkemoun
3
Tenga en cuenta que este ejecutivo se ejecutará en cada ejecución de Puppet (cada 30 minutos), lo que podría dañar su proxy y / o su espejo bastante duro si tiene una "gran cantidad de servidores". Personalmente, recomendaría implementar un horario para el tipo de ejecutivo anterior, asegurándome de que solo se ejecute de noche, por ejemplo. Sin embargo, en mi opinión, Puppet está destinado a hacer cumplir el estado del sistema, y ​​ejecutar un comando de tipo upgrade_packages sin supervisión humana a través de él, es a la vez un poco aterrador y un poco de abuso de Puppet. La herramienta mColective que viene con Puppet Enterprise (o su equivalente de código abierto) podría ser una mejor opción.
wzzrd
77
Nuestra instalación de títeres tiene un ejecutivo similar que verifica la marca de tiempo en un archivo y solo ejecuta la actualización si es más nueva que la versión en el cliente. Cuando queremos actualizar todo, tenemos touchese archivo en el titiritero.
Ladadadada
@wzzrd: Buen punto, pero puede mejorarse verificando alguna condición externa como dijo Ladadadada.
Khaled
7

si todos sus hosts son debian, puede probar el paquete de actualizaciones desatendidas.

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

Aquí hemos estado usando Puppet para administrar nuestras máquinas virtuales Debian, con Puppet podemos habilitar y administrar configuraciones de actualización no atendidas en todos los servidores.

Recientemente, nuestro equipo está probando la herramienta mcollective para ejecutar comandos en todos los servidores, pero para usar las habilidades de mcollective ruby ​​son necesarias.

[s] Guto

gutocarvalho
fuente
5

Recomendaría ir a Puppet, facter y mCollective.

mCollective es un marco muy agradable en el que puede ejecutar comandos en una serie de hosts (en paralelo) usando facter como filtro.

Agregue a eso un proxy / caché local y estará bien configurado para la administración de servidores.

CloudWeavers
fuente
Estoy de acuerdo, Puppet no es realmente la mejor herramienta para administrar acciones administrativas como actualizaciones masivas / orquestadas de paquetes.
robbyt
3

Use una herramienta diseñada para ejecutar un solo comando en varios servidores. Y con eso no me refiero a tener un kazillion de terminales abiertos con Terminator o ClusterSSH, sino tener un solo terminal para un servidor de administración que ejecute una herramienta adecuada para el trabajo.

Recomendaría func, Salt o mCollective en este contexto. Si ya tiene Puppet, elija mCollective (se integra muy bien en Puppet). Si no lo hace, y tiene un viejo Python en sus máquinas, puede disfrutar de func. Si tienes Python nuevo, prueba Salt. Todas estas herramientas ejecutan el comando especificado en la línea de comando de forma asíncrona, lo cual es mucho más divertido que un bucle ssh secuencial o incluso hacer los mismos comandos de aptitud en innumerables ventanas Terminator a innumerables servidores.

Definitivamente amarás Salt .

wzzrd
fuente
2

Así que supongo que hay muchas cosas que contribuyen a una buena solución:

  • Banda ancha
  • Facilidad de administración
  • Registro detallado en caso de que algo se arruine.

Ancho de banda : Básicamente, me vienen a la mente dos alternativas para ahorrar ancho de banda:

  • Para configurar un espejo de Debian y configurar todos sus clientes para usar este espejo, consulte http://www.debian.org/mirror/ para más detalles. (Yo recomendaría esto)
  • Configurar un proxy (apt-cacher, apt-proxy o Squid) y aumentar el caché para que todos sus clientes puedan beneficiarse de este caché

Administración : configuraría un shell paralelo como PDSH , PSSH , GNU Parallel y emitiría el comando en todos los clientes, si probé el comando anteriormente en una máquina de ejemplo. Entonces no es muy probable que pueda fallar en todos los demás. Alternativamente, puede considerar un trabajo cron en todos los clientes, pero luego puede fallar automáticamente, por lo que preferiría la primera solución.

Si le preocupa la simultaneidad de las actualizaciones, puede programar sus comandos con at

Registro : Al igual que con los shells paralelos, tiene la posibilidad de redirigir la salida. Combinaría stderr y stdout y lo escribiría en un archivo de registro.

matemáticas
fuente
Ancho de banda: existen servidores proxy de almacenamiento en caché específicos para repositorios de Deb, busque apt-cacher o apt-proxy.
S19N
Genial, lo integraré en la respuesta.
matemáticas el
y software como mCollective permitirá la ejecución de comandos paralelos e informará la salida / resultado.
CloudWeavers
1

Mi propio contenedor ssh paralelo: classh es una alternativa a las diversas herramientas ssh paralelas y de clúster que existen.

Puede que te guste más o que lo odies. Solo hay tres razones por las que lo menciono aquí:

  • Es extremadamente simple de instalar y usar: un único archivo .py sin dependencias externas más allá de las bibliotecas estándar de Python 2.5.
  • Es extremadamente confiable dentro de sus límites. Lo uso todos los días hábiles, a menudo casi 100 veces por día y generalmente en colecciones de cientos a unos pocos miles de objetivos por comando. (Lo he probado en listas de destino de más de 25 mil servidores a la vez). Nunca falló en ejecutarse, no pudo completarse o me dio un comportamiento indeterminado. (Las únicas limitaciones relacionadas con las del subprocess.communicate()método Python --- por lo que solo puede capturar aproximadamente 64K de stdout y, por separado, hasta 64K de stderr, por ejemplo; también cualquier proceso remoto que intente leer desde su stdin simplemente se detendrá hasta que se elimine el subproceso ssh local, automáticamente por el manejo del tiempo de espera de classh )
  • Es extremadamente simple escribir un script personalizado, en Python, para usar classh.py como módulo. Entonces es muy fácil escribir algo como:

    
        !#/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>

Eso es todo al respecto. Por ejemplo, en el ciclo completado anidado, puede recopilar una lista de todos aquellos que devolvieron un estado de salida particular o para buscar mensajes de error específicos y configurar trabajos de seguimiento para manejarlos. (Los trabajos se ejecutarán simultáneamente, con un valor predeterminado de 100 trabajos en cualquier momento, hasta que se complete cada uno; por lo tanto, un comando simple en unos pocos cientos de hosts generalmente se completa en unos segundos y un script de shell muy complejo en una sola cadena de comando larga ... Digamos que cincuenta líneas más o menos ... pueden completar más de unos pocos miles de hosts en aproximadamente 10 minutos ... aproximadamente 10K hosts por hora en mi entorno, con muchos de ellos ubicados intercontinentalmente.

Entonces, esto podría ser algo que puede usar como una medida ad hoc hasta que haya implementado la configuración de su títere y se haya probado bien ... y también es bastante útil para realizar pequeñas encuestas ad hoc de sus hosts para ver cuáles se están desviando de sus estándares en Varias pequeñas formas.

Jim Dennis
fuente
Por cierto, en las páginas web de classh, en bitbucket.org también hay una lista de los otros envoltorios ssh que encuesté antes de decidir escribir el mío. Cualquiera de ellos podría funcionar para ti. Además, puede buscar Python Fabric, que es un proyecto más nuevo con características similares, aunque algo más extensas y un poco más complejas.
Jim Dennis
1

La respuesta usando exec es bastante útil.

Sin embargo, de acuerdo con el manual apt-get, no es una buena idea usar -q = 2 de esta manera (aunque lo he usado durante años sin problemas)

-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.

Yo mismo he usado un script durante años, ejecutando apt-get de la siguiente manera:

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

Cosas como títeres y otras herramientas que la gente mencionó seguramente pueden funcionar, pero parece que es excesivo para lo que básicamente es simplemente imitar algunos comandos escritos por un humano. Creo en el uso de la herramienta más simple para un trabajo específico, en este caso, un script bash es tan simple como es posible sin perder funcionalidad.

aseq
fuente
Sí, creo que es una buena manera para algunos servidores. Pero si debo obtener algunas opciones más (implementar algunas configuraciones en cada servidor, etc.), entonces su títere es la mejor manera. En este momento trabajo en títeres y su belleza ..
Dennis Wisnia
No estoy en desacuerdo Pero para el propósito de lo que el cartel preguntaba sobre esto puede ser excesivo.
aseq
1

Durante años he estado felizmente actualizando e instalando paquetes usando apt-dater . Es una herramienta ligera y efectiva para la gestión remota de paquetes. Utiliza screen, sudoy ssh.
Para la administración de paquetes, apt-dater puede ser una solución más fácil que las herramientas de administración de configuración.
apt-dater es útil para la gestión centralizada de paquetes en diferentes versiones de GNU / Linux, como Debian y CentOS.

Solo trabajo
fuente
1

Puedes usar tela . Fabric es una biblioteca de Python (2.5-2.7) y una herramienta de línea de comandos para racionalizar el uso de SSH para la implementación de aplicaciones o tareas de administración de sistemas.

hombre libre
fuente
0

use webmin ,,, y use su función de clúster webmin, en la que puede agregar todos los sistemas a una consola webmin y emitirles cualquier comando o controlarlos todos desde un solo lugar.

O

Usar clúster ssh

O

PSSH

Farhan
fuente
Sí, realmente puedo abrir muchas ventanas y puedo trabajar en paralelo. Cluster SSH es bastante bueno, pero creo que no es lo suficientemente inteligente.
Dennis Wisnia
0

Otra solución si todos sus hosts están ejecutando Debian (o derivados) es usar el paquete cron-apt . Pero, como se sugiere en la documentación, se debe tener un poco de cuidado.

Actualmente estoy usando cron-apt en una docena de servidores para realizar todas las actualizaciones de seguridad de forma automática y desatendida. Para evitar actualizaciones no deseadas, solo uso cron-apt en servidores que ejecutan la distribución estable de Debian y me aseguro de configurar mis fuentes apt, así que use el nombre de distribución, wheezy , y no su alias (estable).

La configuración específica de cron-apt que uso se resume en un archivo de acción: /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"

Cualquier otra actualización, se realiza manualmente, usando la pantalla o lo que sea más apropiado, ya que puede requerir intervención manual durante la actualización.

Tonin
fuente