¿Cómo gestiona e implementa los puertos de FreeBSD en un entorno grande?

19

Tengo curiosidad por saber cómo la gente está implementando los puertos de FreeBSD en su entorno. Supongo que la mayoría de las personas que usan FreeBSD están utilizando puertos (y a menudo portupgrade para actualizar con binarios). Sin embargo, estoy interesado en cómo tienes esta configuración, ya que no estoy satisfecho con cómo funcionan las cosas en las versiones recientes. Ahora estoy ejecutando FreeBSD 9.0 y tengo problemas.

He configurado las cosas de la siguiente manera:

  • / usr / ports se comparte a través de NFS desde un nodo (con la 'actualización de búsqueda de portsnap').
  • Cada nodo monta / usr / ports con lectura-escritura
  • He configurado "WRKDIRPREFIX = / usr / tmp" en /etc/make.conf en todos los nodos
  • He configurado el Portsnap para usar un índice local agregando lo siguiente a /usr/local/etc/pkgtools.conf:

ENV['LOCALINDICES'] ||= '/var/db'

ENV['PORTS_INDEX'] ||= ENV['LOCALINDICES'] + '/INDEX.local'

Puedo ejecutar portupgrade -p packagecon éxito para construir un paquete y luego portupgrade -P packageinstalar el binario en los otros nodos.

Sin embargo, en algún momento recibo el siguiente problema: /var/db/INDEX.local:23265:dbm_store failed

No puedo pensar en ninguna otra optimización que pueda hacer al sistema, ya que el índice ahora reside localmente, y lo único que realmente se exporta es el árbol de puertos y nunca se escribe nada desde los nodos.

vpetersson
fuente
Una opción sería tener un árbol de puertos local completo en cada nodo (y tal vez simplemente montar 'distfiles' y 'paquetes'), pero esto se siente como una pérdida masiva de espacio (y sin mencionar muchas actualizaciones innecesarias).
vpetersson
vpeterson: Esta es una pregunta que debe hacerse (estoy bloqueado en este momento. Y +5 votos y 3 estrellas sugiere que no estamos solos). Quizás limpie esta pregunta y mencione algunos problemas específicos que está tratando de resolver. (FWIW, alguien votó para cerrar su pregunta. Personalmente, me gustaría mucho ver esta o una pregunta similar guardada).
Stefan Lasiewski
No estoy seguro de cómo aclarar la pregunta. Tampoco creo que @ voretaq7 realmente responda las preguntas, sino que sugiere un método alternativo. La pregunta es realmente sobre lo que sugiere el tema: cómo están desplegando los puertos de FreeBSD en un entorno de múltiples nodos.
vpetersson

Respuestas:

13

Nunca estuve completamente satisfecho con el sistema de puertos en un entorno grande: siempre parece que necesita aplicar alguna administración externa para que funcione bien.

Mis mejores consejos (en orden de preferencia ascendente, "peor" solución a "mejor" solución):


Si está construyendo en cada host, no lo haga .
Si debe hacerlo, no lo haga a través de NFS con montajes de lectura y escritura como describe: por lo general, puede confiar en que los puertos hagan lo correcto y no pisotear el árbol de puertos si proporciona directorios de trabajo alternativos, pero siempre es mejor esté seguro que lo siento: ejecute un espejo CVS / csup local y csup todos sus hosts desde ese cuadro, luego construya localmente como lo haría si fueran máquinas individuales.
Sí, sé que esto significa tener más espacio en disco en los hosts y un paso adicional. También es casi seguro que no tendrá problemas.
Consideración: Probablemente desee sincronizar los archivos de configuración del paquete (rsync o similar) desde un "host de configuración" designado para garantizar la coherencia en cada máquina (incluso puede rsync el árbol de puertos completo si lo desea, en lugar de usar csup en cada nodo).


Use un Host de compilación, cree paquetes e instálelos.
Una solución mucho mejor que construir en cada máquina individual: use un host de compilación para crear paquetes y apunte sus herramientas a esos paquetes.
Esto significa mantener un host de compilación para cada arquitectura que ejecute (o compilación cruzada), pero en última instancia es más agradable para sus máquinas de destino (no hay trabajos de compilación grandes, una garantía de coherencia)


Use una herramienta de configuración / administración del sistema.
Esta es la solución con la que terminé: construyo una imagen de servidor estándar y la implemento en mi entorno usando radmind. Puedes hacer cosas similares con Puppet o Chef . Esto tiene todas las ventajas de usar un host de compilación (consistencia, menos carga en los servidores individuales) y agrega el beneficio de la administración de la configuración.

Advertencia: esto solo funciona realmente bien si sus máquinas son "idénticas". Es decir, puede instalar el mismo conjunto de puertos en todas ellas. Se puede trabajar si tienen diferentes conjuntos de puertos, sino que aumenta sustancialmente la carga administrativa.

Descargo de responsabilidad: soy el encargado del mantenimiento del puerto sysutils/radmind. Sí, me gusta tanto que lo adopté.


Todo esto se basa en mi experiencia en la gestión de entornos FreeBSD de varios tamaños (que van desde 1-2 máquinas hasta más de 100). Las herramientas de configuración / administración del sistema que impulsan y mantienen una imagen estandarizada son realmente la mejor manera de manejar esto en mi experiencia.

voretaq7
fuente
Buenos punteros. He jugado con Puppet un poco en el pasado, y me encanta en Ubuntu. Sin embargo, no estoy seguro de qué tan bien juega con FreeBSD. Todavía tengo que probar eso. De todos modos, incluso con Puppet, creo que llama a Portupgrade, lo que nos lleva de vuelta al punto de partida. No veo otra forma de que funcione, ya que necesitaría hacer pkg_delete / pkg_add o 'pkg_add -f', lo que no sería una buena idea. En lo que respecta al hardware, todos son idénticos ya que se ejecutan en una nube pública (KVM / Qemu).
vpetersson
Si sus configuraciones de hardware y software de línea de base son idénticas, sugeriría algo como radmind, administrar la imagen completa del sistema. Puppet y Chef son excelentes herramientas, sin embargo, como usted señaló, llaman a los binarios subyacentes del sistema operativo, lo que lo deja de nuevo en el uso de un host de compilación y la distribución de paquetes. radmind evita esto al hacerse cargo de la administración a nivel del sistema de archivos ("Si no es lo que se supone que debe estar aquí, reemplácelo o retíralo") en lugar de tratar de ser un administrador del sistema sustituto ("Ejecutar estos comandos / cambiar estos archivos para que configure el caja").
voretaq7
Bueno, los sistemas tienen hardware idéntico, pero no configuraciones idénticas. Tendré que investigar Radmind, pero no estoy seguro de si ese es el mejor enfoque. El uso de las herramientas integradas debería funcionar en mi humilde opinión, por eso me estoy acercando a la comunidad para ver si me he perdido algo obvio. Apenas puedo ser el único que intenta hacer esto.
vpetersson
El built-in herramientas definitivamente DO trabajo, que sólo requieren una gran cantidad de ayuda (servidores construcción, la distribución local de paquetes, etc.) - Ellos realmente están orientados hacia el manejo de una máquina, y no cambian de escala, así como pudieron. Tenga en cuenta que omití la opción de implementar su propio servidor de actualización freebsd : nunca he intentado esto para algo más que el sistema base, pero es teóricamente posible. Me limité a las cosas que sé que funciona :)
voretaq7
Sí, esa es una idea interesante en realidad. No estoy seguro de si funcionaría con la distribución de paquetes de puertos sin muchas modificaciones. Tengo mucha curiosidad por saber cómo los administradores de sistemas grandes manejan esto, ya que hay muchas implementaciones grandes de FreeBSD. ¿Todos ellos lanzan su propia solución? Si es así, eso se siente bastante extraño y no muy de código abierto.
vpetersson
6

Es extraño que nadie mencione ports-mgmt / tinderbox :

Tinderbox es un sistema de construcción de paquetes para puertos FreeBSD, basado en los scripts oficiales de Portbuild utilizados en el punto de agrupación de construcción. Tinderbox fue escrito por Joe Marcus Clarke.

Puede definir múltiples cárceles (versiones de sistema base) y múltiples portstrees. La combinación de cárcel y portstree se llama construcción. Una cárcel de Tinderbox no es lo que se entiende como una cárcel en FreeBSD, de hecho es un mundo dado en un chroot. Tinderbox admite el seguimiento automático de dependencias y solo reconstruye paquetes que han cambiado desde la última ejecución. Tinderbox tiene soporte para notificaciones por correo electrónico de compilaciones fallidas. Tinderbox también se integra bien con ccache.

Tinderbox está diseñado para proporcionar fácilmente conjuntos de paquetes de puertos que necesita, para las plataformas y arquitecturas que necesita. Tinderbox también es una herramienta excelente para probar nuevos puertos y actualizaciones de puertos, especialmente para probar dependencias y listas de empaque. También es útil para probar puertos en varias versiones de FreeBSD, ya que puede ejecutar FreeBSD 6.X world como una cárcel en el host FreeBSD 7.X / 8.X.

También cambiar a pkgng simplifica enormemente las implementaciones de paquetes.
Compruébalo en github: https://github.com/pkgng/pkgng

SaveTheRbtz
fuente
1
Si bien eso podría ser útil para construir los paquetes reales en un entorno diverso (múltiples versiones, arquitecturas, etc.), en realidad no resuelve el problema de la implementación de los paquetes.
vpetersson
Tinderbox hace que los paquetes estén disponibles a través de HTTP, por lo que puede combinar esto con los comentarios en la respuesta de voretaq7 para obtener su solución de implementación (por ejemplo, configurar PACKAGEROOT/ PACKAGESITEy usar radmind o Puppet / Chef).
James O'Gorman
Sí, pero construir y distribuir paquetes no es el problema. Puedo usar portupgrade (-p) para construir el paquete y distribuirlos a través de NFS (con o sin un árbol de puertos). El problema es que este modelo todavía requiere a) un árbol de puertos completo localmente, o b) un árbol de puertos exportado a través de NFS, lo que nos lleva de vuelta al problema en cuestión.
vpetersson
2
Portupgrade hará exactamente lo que tendría que hacer si estuviera compilando desde la fuente o utilizando paquetes binarios: pkg_deleteprimero debe ejecutarse y luego instalar la nueva versión. OpenBSD ha manejado esto mejor al incluir una opción de actualización en pkg_add. No estoy seguro acerca de Portupgrade, pero portmaster puede funcionar simplemente usando INDEX y no un árbol de puertos completo.
James O'Gorman
1
Correcto, pero pkg_delete no es un enfoque razonable. Supongamos que desea actualizar Ruby, Python o cualquier otro paquete que sea un requisito previo para una gran cantidad de otros paquetes. pkg_delete requeriría que elimine todas las dependencias, lo cual no es una opción para un sistema de producción. Portupgrade hace un trabajo mucho mejor con esto, pero nuevamente, no parece escalar.
vpetersson
3

He administrado más de 100 servidores de FreeBSD simplemente compartiendo / usr de solo lectura sobre NFS bien ajustado, moviendo las bases de datos de paquetes de / var a / usr y haciendo enlaces simbólicos con ellos (no es estrictamente necesario pero habilita pkg_info y tal). Es posible que haya habido uno o dos archivos más que debían moverse en una dirección u otra y vincularse entre sí, pero toda la configuración me llevó alrededor de una hora para descubrirlo. Funcionó muy, muy bien. Si me hubiera topado con problemas de escala, habría agregado servidores NFS adicionales y dividido la carga de trabajo, pero nunca apareció. El rendimiento nunca fue un problema para mí (de hecho, fue genial), pero supongo que podría poner el servidor NFS / usr (o una copia del mismo) en un md.

pelusa
fuente
Compartir los archivos de paquetes integrados a través de NFS (que es de lo que parece que estás hablando) es sin duda otro enfoque razonable: puedes usar algo como títeres (o incluso scripts de SSH y shell) para instalar / actualizar paquetes del recurso compartido NFS.
voretaq7
1

Parece que desafortunadamente nadie obtuvo una buena solución para esto. Lo más probable es que esto se deba a limitaciones en las herramientas subyacentes.

Esto es lo que se me ocurrió: descarté la idea de exportar todo el árbol de puertos. En cambio, cedí y puse un árbol de puertos completo en cada nodo. Luego monté 'paquetes' sobre NFS (para permitir la distribución de paquetes).

También tengo la intención de utilizar un proxy de almacenamiento en caché (probablemente Squid) para acelerar el proceso de portnap. Escribí una breve publicación sobre cómo configurar esto en mi blog.

Referencias

vpetersson
fuente