En el proyecto Mageia el equipo sysadmin es responsable de la configuración y mantenimiento de toda la infraestructura de Mageia, para usuarios y contribuidores por igual. Para ayudar a entender lo que hace este equipo y compartir algunas ideas con otros administradores de sistemas, publicaremos una serie de artículos para explicar las cosas que hacemos.
Nuestras tareas principales son :
- Instalación de servidores en el centro de datos
- Instalación y configuración de software en los servidores de Mageia
- Varias tareas administrativas como actualizar permisos de usuario, eliminar paquetes, mover paquetes entre repositorios, etc.
- Desarrollo y mantenimiento de varias herramientas, como los componentes del sistema de construcción
Este primer articulo hablara sobre la instalación y configuración del software en los servidores de Mageia, explicara algunas de las cosas que hacemos, y el por que podría querer usar un proceso similar cuando administre sus propios servidores.
Un resumen del proceso utilizado para configurar software en los servidores de Mageia sería:
- Todo software se instala usando paquetes
- Todos los paquetes son creados en nuestro sistema de construcción
- Todos los paquetes son instalados y configurados usando puppet
Los motivos para hacer esto puede ser obvio para muchos de los empaquetadores de Mageia. Este articulo intentara explicarlo para todos aunque no sean empaquetadores.
Construyendo e instalando el software
Una de las tareas mas comunes del administrador de sistemas es la instalación o actualización de software. Es fácil cuando su distribución Linux proporciona paquetes para el software que quiere usar; el paquete puede instalarse usando el administrador de paquetes.
Sin embargo, en muchos casos el software que necesita no está disponible en la distribución que está usando o no es la versión que requiere.
Compilando manualmente
Mucha gente piensa que la solución más fácil en este caso es descargar el código fuente del software, seguir las instrucciones de compilación y ejecutar el script de instalación o Makefile proporcionado. Sin embargo hay muchos problemas al hacer esto:
- Instalar dependencias para compilar:
Necesita tener todas las dependencias para compilar instaladas en su sistema. En muchos casos querrá compilar el software en un servidor dedicado para evitar instalar demasiadas dependencias en su equipo, y posteriormente copiar los binarios resultantes a sus equipos. - Administrando dependencias:
Si está usando tarballs o un servidor NFS para distribuir su software binario a otros equipos, necesitara encontrar e instalar las dependencias requeridas en cada equipo en el que el software sera usado. Querrá escribir la lista de dependencias en algún lugar para saber lo que se necesita instalar cuando necesita usar ese software en un equipo nuevo. - Actualizar software:
Cuando compila software, es frecuente establecer opciones especificas al script configure o en un archivo de configuración. Algún software puede ser difícil de compilar o requiere de complejas operaciones o configuraciones para poder hacerlo. Al actualizar el software a una nueva versión, probablemente quiera mantener la misma configuración para evitar introducir cambios innecesarios que podrían causar fallos. Todo esto es difícil de recordar y a menos que lo haga diario probablemente lo olvidara. Por lo que deseara guardar las instrucciones de compilación para poder reutilizarlas la próxima vez que actualice este software. - Parchar el software:
A veces el software requiere algunas pequeñas modificaciones para compilarlo o ejecutarlo, o quiere alguna nueva característica. Puede aplicar los cambios antes de iniciar el proceso de compilación. Sin embargo esos cambios se perderán la siguiente ocasión en que extraiga las fuentes de un nuevo tarball para actualizar el software.
Para poder aplicar los mismos cambios en la nuevas versiones, deberá guardar esos cambios como un parche en algún lugar. - Llevar un registro:
Es fácil olvidar por que hizo algún cambio o actualizo una pieza de software en particular. Especialmente si no está solo y trabaja dentro de un equipo, deberá llevar un registro de los cambios que realice en el software que compila e instala. - Saber que versión de su software está instalada, desinstalar o actualizar software:
Es muy útil saber la versión actualmente instalada de un software. También es muy útil poder desinstalar software, o instalar una versión diferente para evaluar , depurar o revertir a una versión previa si hay algún problema. Si utiliza el proceso estándar de instalación, mucho software instalara archivos en varios lugares distintos en el sistema. Saber que archivos y en donde son instalados, y que versión está en uso es difícil si no imposible. Cuando instala una nueva versión de software, los script de instalación sobreescribirán los viejos archivos, pero no eliminaran los obsoletos, lo que puede causar confusión o problemas. Algunos evitan estos problemas instalando cada software en su propio directorio, incluyendo el numero de versión en el nombre de directorio. Sin embargo, esto puede crear otros problemas: mucho software no está preparado para instalarse de está forma y requiere de complejos trucos para funcionar. Y la selección de la versión que sera usada necesita de complejos enlaces simbólicos o actualizaciones de la variable de entorno PATH. Esto se hace aun más complicado cuando instala varias aplicaciones con dependencias entre ellas. Para evitar este tipo de problemas la mejor solución es usar algunas herramientas que rastree el lugar y la versión de los archivos instalados.
Usando paquetes
Para resolver todos esos problemas deberá usar herramientas especificas. Tal vez quiera comenzar a escribir sus propias herramientas y scripts para manejar ese tipo de cosas. Tiene más sentido usar las herramienta ya disponibles que usar las suyas propias. Las mejores herramientas para solucionar este tipo de problemas son los administradores de paquetes.
Si anteriormente no ha creado paquetes, necesitara invertir algo de tiempo en aprender a hacerlo. Sin embargo esto le puede ahorrar un montón de tiempo posteriormente. Usar paquetes para compilar e instalar software tiene muchas ventajas:
- Instalar dependencias de compilación:
Los paquetes le permiten compilar su software en una maquina dedicada, producir paquetes que serán instalados en el equipo requerido sin tener que instalar ninguna de las dependencias de compilación.
El paquete fuente también le permite definir la lista de dependencias de compilación, así podrá instalarlas automáticamente en su equipo cuando quiera compilar un paquete y tal vez quitarlas posteriormente. - Manejo manual de dependencias:
El seguimiento de dependencias consume tiempo y no siempre es fácil. Afortunadamente muchos de las sistemas de empaquetado analizaran los archivos incluidos en el paquete y detectaran automáticamente las dependencias del software. Las librerías de perl, python, ruby, PHP, C/C++ usualmente se detectan automáticamente durante la construcción del paquete. Para las dependencias que no puedan ser detectadas automáticamente es posible definirlas explícitamente en el paquete. Entonces todas esas dependencias podrán ser automáticamente instaladas por el administrador de paquetes al instalar el software. - Actualizar el software:
El paquete fuente contiene las instrucciones de compilación. El proceso para compilar el software a veces cambia un poco, pero la mayoría de las veces sera el mismo para todas las versiones del software. En ese caso actualizar un paquete es tan simple como actualizar el numero de versión en el paquete fuente y ejecutar el comando para construir el paquete. Recompilar el software con una opción diferente también puede hacerse fácilmente. - Parchar el software:
Los paquetes fuente le permiten incluir parches que serán aplicados durante la construcción del paquete. Esto hará más fácil el seguimiento de los cambios que aplique al software. Cuando actualice el software a una nueva versión los mismos cambios pueden aplicarse fácilmente. - Mantener un registro:
Los paquetes incluyen un registro que puede usar para explicar las razones de sus cambios, así usted u otro miembro podrán saber el por que realizo un cambio hace 6 meses. Si utiliza una herramienta de control de fuentes como git o subversion para administrar sus paquetes (lo recomendamos), puede usar el registro de envíos para este fin. - Saber que versión de su software está instalada, desinstalar o actualizar software:
Los paquetes le permiten rastrear la versión del software instalado en su sistema. También le permite facilitar la instalación, eliminación o actualización del software, o encontrar que paquete proporciona un archivo.
Construir paquetes en un ambiente limpio e implementar sus paquetes
Por que debería usar un sistema de construcción
El administrador de paquetes es una herramienta hermosa para administrar la construcción e instalación de software. Sin embargo, esto no es suficiente. El administrador de paquetes compilara el software utilizando las herramientas y librerías disponibles en el sistema, tras instalar la lista de dependencias de compilación.
Hay algunos problemas con esto :
- Soporte multi distribución:
Algunas veces su infraestructura constara de diferentes distribuciones, o diferentes versiones de la misma distribución. Un paquete construido en una distribución no necesariamente funcionara en otra, debido a que las versiones de algunos componentes son diferentes o incompatibles. Para evitar este tipo de problemas, los paquetes deben construirse en la misma distribución en la que serán usados. - Limpiar el entorno:
Los paquetes fuente incluyen una lista de dependencias de compilación que deberán instalarse para construir el paquete. Sin embargo cuando construya el paquete en su sistema o en un servidor de construcción especifico, usualmente hay otros paquetes instalados que podrían utilizarse durante la construcción del paquete. Por lo tanto es muy fácil olvidar que instalo algún paquete,olvidar incluirlo en la lista de dependencias de compilación y no notar el problema por que a usted le funciona. Su sistema también puede tener algunas configuraciones personalizadas o actualizaciones que olvido que había instalado, eso también puede impactar en la construcción del paquete. El problema no se notara hasta que alguien necesite reconstruir el paquete en otro sistema. Si quiere incrementar las oportunidades de poder reproducir la construcción de un paquete, debe utilizar un entrono limpio para construir paquetes. Usualmente esto se hace creando un entorno chroot mínimo para la distribución seleccionada.
Una vez que su paquete se ha construido, es necesario copiarlo a las maquinas en las que sera instalado.
Las distribuciones usualmente proporcionan herramientas para hacer esto (apt-get en Debian, urpmi en Mageia, yum en Fedora, etc.). Estas herramientas automáticamente descargaran e instalaran un paquete y sus dependencias desde un servidor que comparta un repositorio de paquetes. Para poder usar estas herramientas, es necesario que configure un repositorio de paquetes, que es un directorio que contiene todos los paquetes disponibles y algunos meta datos.
Todo esto puede administrarse manualmente,sin embargo es mejor configurar un sistema de construcción de paquetes que haga todo esto automáticamente. Usar un sistema de construcción de paquetes tiene muchas ventajas :
- Menos propenso a errores:
Construir los paquetes en un entorno chroot, copiar los archivos resultantes al repositorio correcto y regenerar los metadatos del repositorio no es muy difícil, pero requiere tiempo y es propenso a errores si se hace manualmente. Usar un sistema automático de construcción de paquetes le ahorrara tiempo y le evitara muchos errores. - Simplificando:
Si construir paquetes e instalarlos en el repositorio son tareas difíciles y tardadas, usted o los miembros de su equipo estarán tentados a evitarlas y a usar otra solución para realizarlas. - Herramientas de control de revisión y rastreabilidad:
Se recomienda usar herramientas de control de revisión como git o subversion para administrar los cambios en los paquetes fuente. Un SCM anclado al sistema de construcción se asegura que cualquier paquete disponible en los repositorios también se encuentre en el repositorio de control de fuentes, dando rastreabilidad a sus paquetes. - Vigilar las políticas de empaquetado:
Existen algunas herramientas para vigilar algunas políticas de empaquetado (rpmlint para rpm, lintian para deb). Tener políticas de empaquetado es útil para tener paquetes consistentes. El sistema de construcción de paquetes puede ser configurado para ejecutar automáticamente algunas pruebas y rechazar la subida de paquetes que no cumplan las políticas. - Monitorear:
El sistema de construcción permite monitorear las ultimas compilaciones. Una interfaz web proporciona una vista de las ultimas compilaciones y registros de compilación. Se puede utilizar una lista de correo para recibir notificaciones sobre las compilaciones. Cuando se trabaja en equipo, esto permite a los miembros del equipo seguir los últimos cambios. - Automatización:
Algunos paquetes pueden requerir hacer tareas adicionales al ser actualizarlos. Enviar un correo electrónico, extraer algunos archivos para actualizar un sitio web u otras tareas, pueden realizarse mediante scripts y por lo tanto realizarse automáticamente cuando se actualizan esos paquetes. Esto es lo que se hace cuando se extraen los archivos del instalador de Mageia en el servidor, al momento de actualizar el paquete.
Como instalar el Sistema de Construcción de Mageia
Esto sera tema de otro articulo.
Configurar el software
Instalar el software usualmente solo es la primer parte del trabajo hecho por los administradores de sistemas. La segunda parte es la configuración de ese software. El paquete hará la primer parte de la configuración inicial, sin embargo, usualmente se requiere de configuración adicional.
Hay varias formas de hacerlo :
- Editar manualmente la configuración directamente en cualquiera de sus servidores
- o hacer que una herramienta de manejo de configuraciones como Cfengine, Puppet o Ansible lo haga por usted.
Cuando utiliza una herramienta de manejo de configuraciones, no se actualiza directamente la configuración en sus servidores, se escriben algunas reglas en su repositorio de manejo de configuraciones, las cuales serán aplicadas automáticamente por su herramienta de manejo de configuraciones. Esto no es tan rápido como editar directamente la configuración en su servidor, pero tiene muchas ventajas:
- Administrar su infraestructura como un proyecto de software:
Las herramientas de configuración le permiten administrar su infraestructura de forma similar a cualquier otro proyecto de software. Muchas de las herramientas disponibles para los desarrolladores de software pueden utilizarse : control de revisiones, envió de parches, vista del código, pruebas automáticas, etc. - Trabajo en equipo:
Si trabaja en un equipo, puede almacenar las reglas de configuración de su servidor en un repositorio de control de revisiones común, haciendo posible seguir y revisar todos los cambios hechos por los miembros del equipo en todos los servidores. - Documentación:
Tener alguna documentación sobre que software está instalado en sus servidores y como está configurado, es muy útil, especialmente cuando más de una persona está trabajando en ellos. Sin embargo un problema muy común con la documentación es que alguien la escribe inicialmente, pero nadie la mantiene y rápidamente queda anticuada. Es muy fácil hacer un cambio y olvidar documentarlo, o olvidar que la documentación existe y necesita ser actualizada. Pero tener una documentación precisa es importante, y en ocasiones tener documentación anticuada que proporciona información falsa puede ser peor que no tener documentación. El repositorio de manejo de configuraciones puede usarse como un tipo de documentación de su infraestructura, y sobre lo que realmente se usa para configurar su infraestructura, donde es más importante que la documentación sea precisa. En el desarrollo de software, tener código auto documentado que puede entenderse sin documentación es en general mejor que tener que mantener separadamente la documentación, y es igual en la administración de sistemas. - Probar el entorno y reproducibilidad:
Utilizar una herramienta de configuración le permite reproducir fácilmente la configuración de un servidor en otro servidor. Esto es util cuando tiene que reemplazar o añadir un servidor, o si necesita configurar un entorno de prueba. - Mantener una configuración correcta:
La herramienta de manejo de configuraciones se ejecutara a intervalos regulares para revisar que la configuración está correcta y aplicara cualquier cambio necesario. - Reusabilidad:
Como en el desarrollo de software, el uso de herramientas de manejo de configuración le permite reutilizar componentes que ha creado. Usualmente es posible crear módulos con parámetros que cambien el entorno del modulo. A veces puede encontrar módulos preparados en el internet, pero desafortunadamente muchos de ellos requerirán de importantes modificaciones para adaptarlos para su uso. Versiones anteriores de puppet carecían de características importantes como clases parametrizadas, así que crear componentes reutilizables era difícil, pero eso ha cambiado.
¿Que herramienta de manejo de configuración usar?
Cuando comenzamos a configurar los servidores del proyecto Mageia, decidimos tras mirar las diferentes herramientas disponibles, usar puppet. Puppet parecía la más interesante herramienta de manejo de configuración en ese momento. En pocos años las cosas han evolucionado un montón en está área, y hay otras alternativas que tal vez quiera revisar antes de decidir cual quiere usar :
Los módulos puppet de Mageia
Los módulos puppet que usamos para configurar los servidores de Mageia están disponibles en un repositorio svn.
Lo que necesita mejorarse
El proceso actual es bueno, pero aún hay cosas que pueden mejorarse. Si quiere contribuir pero ignora que podría ser de utilidad, aquí hay algunas ideas.
- Generación automática de paquetes:
Algunos lenguajes como Perl, Python o Ruby proporcionan su propio sistema de empaquetamiento para sus librerías. A muchas personas les gusta usar esos paquetes en lugar de paquetes RPM debido a que no siempre hay paquetes disponibles en la distribución o no están actualizados. La ventaja de de esos paquetes es que son hechos por el desarrollador y están disponibles inmediatamente. El problema es que usualmente no se integran muy bien en el resto del sistema y requieren utilizar dos diferentes sistemas de paquetes, lo que podría complicar más las cosas. En muchos casos, las personas no son empaquetadores experimentados, por lo que simplemente utilizan los paquetes del lenguaje, por que piensan que empaquetar es muy complicado o no tienen tiempo de hacerlo. Si convertir esos paquetes a RPM fuera más simple, las personas se beneficiaran de una buena disponibilidad de paquetes bien integrados con el resto del sistema.Afortunadamente los paquetes de esos lenguajes usualmente contienen toda la información necesaria para empaquetarlos en RPM (descripciones, licencia, dependencias, etc.), así que crear un paquete RPM es usualmente una simple conversión de esa información al formato RPM fy puede automatizarse. Gracias al trabajo de Jérôme Quelin en cpan2dist es posible generar paquetes RPM para Mageia desde los módulos CPAN automáticamente. Esto es lo que nos permite tener disponibles 3300 paquetes de Perl en la distribución.
Necesitamos herramientas similares para python, ruby y otros lenguajes. - Configuración del Sistema de Construcción:
Estamos usando un sistema de construcción para nuestros paquetes por que ya teníamos disponible un sistema para construir la distribución, así que no es mucho trabajo configurarlo para también tener nuestro propio repositorio. Sin embargo instalar el sistema de construcción de Mageia no es una tarea fácil y las personas que no hagan una distribución completa no querrán gastar demasiado tiempo configurando un sistema de construcción. Así que necesitamos mejorar el proceso de configuración del sistema de construcción para hacerlo mas sencillo. Actualmente falta alguna documentación que explique como hacerlo utilizando nuestro modulo puppet. Un futuro articulo del blog explicara como hacerlo. - Soporte de OBS:
Otra alternativa es utilizar OBS (Open Build Service), que es un buen sistema de construcción con soporte para varias distribuciones. Sin embargo aun no tiene soporte para Mageia. Necesitamos corregir eso para que sea posible administrar los repositorios de Mageia mediante OBS. - Soporte a Mageia en Ansible y Salt Stack:
Ansible y Salt Stack son interesantes herramientas de manejo de configuración. Sin embargo aun carecen de soporte a urpmi para la instalación de paquetes.
Actualización: Philippe Makowski ha estado trabajando en un modulo de urpmi para Ansible, pero aun no se integra oficialmente, y las contribuciones son bien recibidas.
Este si que es un articulo muy interesante, a pesar que no soy ni programador, ni empaquetador. Estaré pendiente al segundo artículo.
Solo me queda felicitarles y espero que más personas con experiencia se unan y que de otras distribuciones también formen parte para así estandarizar y mejorar procedimientos. Después de todo es por el bien del movimiento del software libre y de GNU/Linux.