Las mejores prácticas para actualizaciones automatizadas de Linux

11

Estamos trabajando en una forma de realizar actualizaciones automáticas para nuestros servidores basados ​​en RHEL / RHEL.

Idea inicial: usando Puppet, deshabilitamos los repositorios predeterminados y señalamos los nuestros. Luego, usamos ensure => latestlos paquetes que queremos actualizar automáticamente.

Problema: Estamos viendo que algunos servicios se reinician después de una actualización (duh).

Pregunta: ¿Alguien tiene algún consejo sobre cómo automatizar mejor las actualizaciones de Linux y las estrategias para mitigar el reinicio automático de los servicios? Preferiríamos una solución que incluye Puppet pero, si necesitamos usar otro servicio, eso no es un factor decisivo.

Editar

Posible solución: envié una solución que implementa muchas de las sugerencias de @ voretaq7 y @ewwhite. Parece que esta es la ruta que voy por el momento. Si tiene otras sugerencias, comente o envíe una respuesta.

Belmin Fernandez
fuente

Respuestas:

14

Su estrategia de actualización general es sólida: tiene un repositorio local (que supongo que prueba en un entorno de desarrollo), y actualiza todo basado en ese repositorio (supongo que se sabe que es bueno).

El reinicio del servicio es inevitable: si el código subyacente ha cambiado, debe reiniciar el servicio para que ese cambio surta efecto. No hacerlo puede tener peores consecuencias (ejecutar el código fuera de sincronización con una biblioteca compartida y provocar un bloqueo de la aplicación).
En mi entorno, considero que las ventanas de parche trimestrales son trimestrales "¡REINICIE TODAS LAS COSAS!" Ventanas también. La ventaja de dicha política es que sabe que sus servidores volverán a funcionar después de un reinicio, y sabe que funcionarán correctamente (porque los prueba regularmente).


Mi mejor consejo para usted es que programe los lanzamientos de software (tal vez esto significa que tendrá que activarlos "manualmente" con títeres) y que informe a sus usuarios sobre el mantenimiento / tiempo de inactividad planificado.
Alternativamente (o como parte de esto) puede configurar la redundancia en su entorno de modo que pueda reiniciar algunas máquinas o servicios y aún así brindar servicio a los usuarios finales. Es posible que esto no elimine por completo las interrupciones, pero puede ayudar a minimizarlas.

La redundancia adicional también lo protege en caso de fallas de hardware, que son inevitables en una escala de tiempo lo suficientemente larga.

voretaq7
fuente
44
+1 para reiniciar todas las cosas.
Tom O'Connor
2
@ TomO'Connor He aprendido por las malas. Me siento muy cómodo hasta aproximadamente 3 meses entre reinicios, después de eso empiezo a preguntarme qué hice para que desaparezca. Último reinicio que realmente perdido un túnel VPN (El túnel era modificable y se acercó, pero no se añadió la ruta por ella, por lo que ... sí.)
voretaq7
Publicó una posible solución inspirada en usted @ voretaq7
Belmin Fernandez
@ BeamingMel-Bin Debería publicar eso como respuesta, parece un enfoque razonable.
voretaq7
Gracias. Lo publiqué junto con algunas modificaciones en el flujo de trabajo según algunas ideas que hice en el viaje a casa.
Belmin Fernández el
5

¿Hay necesariamente un problema al reiniciar un servicio después de una actualización del paquete? Pruebe a pequeña escala antes de implementar para ver si hay algún problema. Recientemente tuve un problema feo con el paquete rpmforge de DenyHosts . En realidad, cambió la ubicación de su configuración y directorios de trabajo entre revisiones de una actualización de yum. Ese es un comportamiento totalmente indeseable. Por lo general, dentro de la misma revisión de RHEL, no hay demasiados problemas, pero nunca puedes estar seguro sin probar y observar de cerca los efectos.

Otra opción es actualizar selectivamente los servicios. ¿Siempre necesita los últimos paquetes, por ejemplo? Esto vuelve a comprender sus razones para ejecutar actualizaciones. ¿Cuál es el objetivo real?

La ventaja de ejecutar su propio repositorio es que puede organizar lanzamientos o lanzamientos y administrar el cronograma. ¿Qué sucede si tiene un proveedor de periféricos de hardware o software que requiere RHEL 5.6 y se rompería por debajo de 5.7? Ese es uno de los beneficios de administrar sus propios paquetes.

ewwhite
fuente
Diría que si el conjunto de actualizaciones desencadena un reinicio del servicio, definitivamente querrá hacerlo. Por supuesto, si NO NECESITA hacer esa actualización (no le compra una característica, mejora de seguridad u otra cosa que necesite), no lo haría, o esperaría hasta poder programar la interrupción para Ser conveniente para mí y para mis usuarios.
voretaq7
2

@Beaming Mel-Bin

La simplificación eliminará la necesidad de usar ssh para herramientas de bucle, para iniciar / detener la marioneta.

En primer lugar, deberá cambiar sus manifiestos para incluir una variable llamada "noop" cuyo valor se obtiene de la ENC.

Entonces tendrías algo como esto en una clase:

noop => $noop_status

Dónde noop_statusestá configurado en su ENC. Cuando establece el valor de noop_statusa true, el manifiesto se ejecutará solo en modo noop.

Si tiene 100s o 1000s de hosts, puede usar una ENC como Dashboard o Foreman que le permite cambiar parámetros en masa para muchos hosts, al heredarlos en el nivel "Hostgroup" o "Domain". Luego puede establecer el valor en "falso" para un pequeño número de hosts de prueba, anulando el valor del Grupo de host.

Con esto, cualquier cambio se aplica solo a los hosts seleccionados.

Cambiar un parámetro en una ubicación central puede afectar a cualquier número de hosts, sin la necesidad de encender / apagar la marioneta con ssh para herramientas de bucle. Puede dividir sus hosts en múltiples grupos para seguridad / administración.

También tenga en cuenta que en lugar de codificar los números de versión del paquete en manifiestos, puede ponerlos en la ENC. Y al igual que arriba, puede aplicar cambios selectivamente y administrar implementaciones.

Si desea más granularidad (y complejidad), incluso puede tener parámetros por clase, como, noop_status_apacheClassetc.

Esto puede ser más difícil de manejar si includeclasifica en otras clases.

Ahora no
fuente
1

Posible solución basada en la respuesta de @ voretaq7:

  1. Números de versión de código duro de paquetes en los puppetmanifiestos y mantener los paquetes en nuestro propio repositorio.

  2. Cuando requerimos que una nueva versión de un paquete haga algo que ofrece (por ejemplo, mejoras de seguridad, características requeridas por nuestros clientes, etc.), descargamos el paquete al repositorio.

  3. Pruebe el paquete actualizado en un servidor de prueba.

  4. Una vez que se pruebe la actualización, use algo como funco psshpara cerrar el puppetagente en los nodos afectados.

  5. Actualice los puppetmanifiestos para asegurarse de que la nueva versión del paquete esté instalada en los nodos afectados.

  6. Finalmente, ejecute puppet agent --onetime && rebooten el servidor usando funcopssh

Comente y avíseme si detecta alguna deficiencia en esta solución o cualquier cosa que pueda simplificarse.

Belmin Fernandez
fuente
1
Es posible simplificar esto usando una ENC y parámetros. Esto requerirá una nueva disposición de los manifiestos, que puede no ser posible para todos.
No ahora
Elabore @NotNow y publique una respuesta. Intrigado por saber.
Belmin Fernández