Puesta en producción

Migasfree en producción

El valor del producto se halla en la producción.

—Albert Einstein

Si te has decidido a instalar en producción el servidor migasfree, debes cambiar las contraseñas a los usuarios que vienen por defecto, y preparar un backup de la base de datos y de la carpeta /var/migasfree.

Recomendamos siempre instalar el servidor migasfree sobre un S.O. Debian, pero si eres un aventurero, puedes atreverte a emplear otro. Eso sí, igual tienes que generar los paquetes tú mismo. En Empaquetando migasfree tienes instrucciones de cómo obtenerlos.

Instalación

# wget -O - http://migasfree.org/pub/install-server | bash

Configuración del servidor

Crea el fichero /etc/migasfree-server/settings.py con el siguiente contenido (no te olvides de sustituir la password por la del usuario migasfree de Postgresql):

MIGASFREE_ORGANIZATION="My Organization"
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.postgresql_psycopg2",
        "NAME": "migasfree",
        "USER": "migasfree",
        "PASSWORD": "mipassword",
        "HOST": "",
        "PORT": "",
   }
}

Por motivos de seguridad, dale permisos de sólo lectura al usuario www-data:

# chmod 400 /etc/migasfree-server/settings.py
# chown www-data:www-data /etc/migasfree-server/settings.py

Este es el fichero de configuración del servidor migasfree. Hay diversas variables que se pueden configurar aquí para modificar el comportamiento de migasfree.

Si necesitas cambiar la password del usuario migasfree en postgresql, haz esto:

# su postgres
$ psql -c "ALTER USER migasfree WITH PASSWORD 'mipassword';"
$ exit

Nota

Para una personalización más avanzada, mira los Ajustes del servidor migasfree.

Cambiando las contraseñas

  • Accede a Configuracion-Usuarios y verás los perfiles de usuarios.
  • Edita el usuario admin. Cámbiale la contraseña y guárdalo.
  • Edíta el resto de perfiles de usuario y deshabilítalos o cámbiales la contraseña.

La explicación de los usuarios y sus grupos lo has visto ya en La configuración del sistema migasfree

Servicio de caché de paquetes

Montar un caché de paquetes para disminuir el tráfico de Internet es habitual. Su funcionamiento es muy sencillo. Cuando un equipo necesita descargar un paquete de Internet, lo solicita al caché. Si el servicio de caché no lo tiene ya almacenado, lo descargará de Internet, lo almacenará y se lo ofrecerá al equipo. Si otro equipo necesita ese mismo paquete, como ya está en la caché ya no se producirá tráfico Internet, sino que el servicio de caché lo ofrecerá directamente al equipo.

Servicio de caché de paquetes.

Puedes instalar el servicio de caché de paquetes en el equipo donde has instalado el servidor migasfree, o en otro servidor.

Por ejemplo puedes instalar apt-cacher-ng.

# apt-get install apt-cacher-ng

Configura el usuario para la administración del servicio.

# nano /etc/apt-cacher-ng/security.conf

Descomenta la línea que empieza por AdminAuth y modifica el usuario y la contraseña:

AdminAuth: <usuario>:<contraseña>

Reinicia el servicio.

#service apt-cacher-ng restart

Por defecto el puerto del servicio apt-cacher-ng es el 3142. Accede a la página http:<miservidor>:3142 para la administración del servicio de caché.

Hasta aquí hemos instalado y configurado el caché en el servidor.

Para la configuración de los clientes, debes crear el fichero /etc/apt/apt.conf.d/02proxy con el siguiente contenido:

Acquire::http { Proxy "http://<miservidor>:3142"; };

Para hacerlo correctamente, modifica el paquete acme-migasfree-client añadiéndo este fichero al paquete.

Otra manera de configurar los clientes es haciendo uso del ajuste Package_Proxy_Cache de los Ajustes del cliente migasfree. La diferencia entre éste método y el anterior es que el primero hará uso del servicio del caché de paquetes tanto cuando ejecutes el comando migasfree en los clientes, como cuando ejecutes el gestor de paquetes (apt-get). En cambio, en el segundo método sólo usará el servicio de caché al ejecutar el comando migasfree.

Puede consultar el manual de apt-cacher-ng para una configuración más avanzada del servicio de caché.

Backups

A continuación, te sugiero un manera de hacer los backups.

Dump de la base de datos

Para hacer el dump de la base de datos, crea el fichero /var/migasfree/dump/migasfree-dump.sh (deberás modificar “mipassword” por la del usuario migasfree en posgresql):

#!/bin/bash
export PGPASSWORD=mipassword
pg_dump migasfree -U migasfree > /var/migasfree/dump/migasfree.sql

Crea también el fichero /var/migasfree/dump/migasfree-restore.sh para el caso que tengas que restaurar un dump de la base de datos:

#!/bin/bash

if [ ! "$UID" = "0" ] ; then
  echo "debes ejecutar como root"
fi

/etc/init.d/apache2 stop

echo "borrando BD..."
echo "DROP DATABASE migasfree;" | su postgres -c psql -

echo "creando BD migasfree..."
su postgres -c "createdb -W -E utf8 -O migasfree migasfree" -

echo "restore dump..."
su postgres -c "psql -U migasfree -f /var/migasfree/dump/migasfree.sql" -

/etc/init.d/apache2 start

Finalmente, ponemos permisos de ejecución a los scripts:

chmod 700 /var/migasfree/dump/migasfree-dump.sh
chmod 700 /var/migasfree/dump/migasfree-restore.sh

Tarea periódica

Para programar una tarea que se ejecute periódicamente realizando el dump de la base de datos y la copia de los ficheros de los repositorios, crea el fichero /var/migasfree/dump/migasfree-backup.sh con el siguiente contenido:

# DUMP de la BD postgresql de migasfree
/var/migasfree/dump/migasfree-dump.sh

# BACKUP FICHEROS
# (aquí se debe programar el backup de /var/migasfree con rsync p.e.)

Cámbiale los permisos:

chmod 700 /var/migasfree/dump/migasfree-backup.sh

Edita como root crontab:

crontab -e

y programa la tarea para que se ejecute diariamente a las 23:30 p.e. añadiendo la siguiente línea a crontab:

30 23 * * * /var/migasfree/dump/migasfree-backup.sh

Etiquetando los clientes

Para facilitar la atención a los usuarios cuando tengan un problema, es conveniente imprimir y pegar físicamente la etiqueta que identifica inequívocamente a cada equipo, ejecutando desde el cliente el comando:

migasfree-label

Consulta el ajuste MIGASFREE_HELP_DESK de los Ajustes del servidor migasfree

Nota

También puedes imprimir la Etiqueta desplegando el menú del ordenador en el servidor.

Creando tu propia Distro

No tratéis de guiar al que pretende elegir por sí su propio camino.

—William Shakespeare

Una Distro no es más que un conjunto de software seleccionado y preparado para instalarse fácilmente.

Existen herramientas que te permiten personalizar una Distribución Linux fácilmente sin grandes complicaciones, y también puedes crear tu Linux desde cero, eso sí, armándote de paciencia.

Pero como te decía, para crear tu Distribución personalizada debes:

  • Seleccionar el software que incluirás en ella.
  • Preparar un sistema sencillo para instalar todo ese software.

En este capítulo te describo diferentes opciones que he utilizado para realizar estas dos tareas.

La selección de paquetes

La idea principal al trabajar con migasfree es que todo debe ser empaquetado, incluida la personalización del software. Así que debes elegir qué software incluirá tu Distribución y crear los paquetes que la personalicen.

El método que te expongo a continuación es muy versátil, y es el de utilizar migasfree para especificar esta selección de paquetes.

Se trata de usar los campos del Repositorio:

  • default preinclude packages. Lista de paquetes que configuran repositorios externos.
  • default include packages: Lista de paquetes a instalar.
  • default exclude packages: Lista de paquetes a desinstalar.

y asignar al Repositorio el Atributo SET-ALL SYSTEMS

No tienes por qué indicar todos los paquetes. Como vamos a partir de una Distribución generalista como Debian, Ubuntu, RedHat, etc. indicamos sólo los paquetes que queremos añadir o eliminar a la Distro.

También puedes hacer una selección de los paquetes que compondrían unos “sabores”, y en vez de usar el Atributo SET-ALL SYSTEMS, crear una Etiqueta por sabor y asignarla en diferentes Repositorios

La creación de etiquetas la viste en La configuración del sistema migasfree

La instalación de tu Distribución

Ahora que has elegido y creado uno o varios Repositorios en migasfree con los paquetes que debe llevar tu Distribución, es el momento de ver varios métodos para instalar tu Distribución personalizada y controlada desde un servidor migasfree.

El método de “andar por casa”

Recomendado si no quieres complicarte la vida y tienes pocos equipos en los que instalar tu Distro:

  1. Instala la Distribución generalista en el equipo.
  2. Instala y configura el cliente migasfree. Si es preciso registra el ordenador mediante migasfree --register.
  3. Ejecuta migasfree-tags --set.

Generando un Live/CD

Es el método recomendado si la instalación la puede realizar cualquier persona. Se trata de hacer básicamente lo mismo que en el método anterior pero sustituyendo el primer paso por el empleo de un Live/CD en un entorno “chroot”.

  1. Prepara un entorno chroot con el Live/CD de partida.
  2. Instala y configura el cliente migasfree en el entorno chroot. Si es preciso registra el ordenador mediante migasfree --register.
  3. Ejecuta migasfree-tags --set dentro del entorno.
  4. Finalmente genera una imagen ISO del entorno

Puedes ver un ejemplo de cómo se hace en vitalinux con vx-create-iso.

Clonación de imagen

Es el método que usamos en AZLinux y está recomendado si tienes muchos equipos y eres tú quien hace las instalaciones.

  1. Instala la Distribución generalista en un equipo que hará de “master”.
  2. Instala y configura el cliente migasfree. Si es preciso registra el ordenador mediante migasfree --register.
  3. Ejecuta migasfree-tags --set.
  4. Prepara el equipo para clonar y crea una imagen para su clonación.
  5. Clona la imagen en los equipos.

Reinstalando la selección de paquetes

Una vez instalada tu Distro, en cualquier momento podrás cambiar de sabor ejecutando otra vez migasfree-tags --set. Observa que has podido decidir cambiar la selección de paquetes en migasfree entre tanto, esto te permite ir probando tu Distro fácilmente mientras aún la estás definiendo.

FAQ

Uno reconoce a las personas inteligentes por sus respuestas. A los sabios se los reconoce por sus preguntas.

—Naguib Mahfuz

Sobre el servidor migasfree

Cuando accedo al servidor web me aparece: Server error (500)

Causa

Este error puede estar motivado por múltiples causas. La más probable es que la contraseña del usuario migasfree en Posgresql no sea la misma que la que está configurada en el servidor.

Solución

Comprueba la contraseña que tienes en /etc/migasfree-server/settings.py es la misma que la del usuario migasfree en Postgresql. Si no existe este fichero, la contraseña por defecto es migasfree.

Si necesitas cambiarla, haz esto:

# su postgres
# psql
# ALTER USER migasfree WITH PASSWORD 'mipassword';

¿Cómo hago una propiedad para obtener el contexto LDAP de un usuario?

Necesitas que los clientes tengan instalado el paquete python-ldap. En el servidor tendrás que crear una nueva propiedad:

Prefijo: CTX

Nombre: CONTEXTO LDAP

Lenguaje: python

Clase: Agrega por la derecha

Código:

import sys
import ldap
import migasfree_client.utils

LDAP_SERVER = 'ldap.miservidor.es'
LDAP_BASE = ''
LDAP_SCOPE = ldap.SCOPE_SUBTREE

def get_ldap_property(filter_str, property_str, base = LDAP_BASE, scope = LDAP_SCOPE):
    global global_ldap_object

    try:
        _result = global_ldap_object.search_s(base, scope, filter_str, [property_str])
    except ldap.LDAPError, e:
        print e
        sys.exit(errno.ENOMSG) # no result

    if _result == None or not _result:
        print 'No result in LDAP search'
        sys.exit(errno.ENOMSG) # no result

    if property_str == 'dn': # special case: dn is getted in other field
        return _result[0][0]

    try:
        _ret = _result[0][1][property_str]
        if len(_ret) == 1: # only one result?
            return _ret[0]
    except KeyError:
        return '' # empty value

    return _ret

def get_dn(user):
    # cn=oXXXXx,ou=XXXX,o=XXXXXX
    return get_ldap_property('(cn=%s)' % user, 'dn')

def get_context(user):
    result = get_dn(user).split(',')

    ret = ''
    for item in result[:]:
        tmp = item.split('=')
        if tmp[0] == 'ou' or tmp[0] == 'o':
            ret = '%s%s.' % (ret, tmp[1])

    return ret[:-1] # remove trailing '.'

def run():
    global global_ldap_object
    global_ldap_object = ldap.initialize('ldap://%s:389' % LDAP_SERVER)

    user=migasfree_client.utils.get_current_user().split("~")[0]
    print get_context(user)

if __name__ == '__main__':
    run()

¿Cómo hago una propiedad para obtener los grupos LDAP de un usuario?

Necesitas que los clientes tengan instalado el paquete python-ldap. En el servidor tendrás que crear una nueva propiedad:

Prefijo: GRP

Nombre: GRUPOS LDAP

Lenguaje: python

Clase: Lista

Código:

import sys
import ldap
import migasfree_client.utils
LDAP_SERVER = 'ldap.miservidor.es'
LDAP_BASE = ''
LDAP_SCOPE = ldap.SCOPE_SUBTREE

def get_ldap_property(filter_str, property_str, base = LDAP_BASE, scope = LDAP_SCOPE):
    global global_ldap_object

    try:
        _result = global_ldap_object.search_s(base, scope, filter_str, [property_str])
    except ldap.LDAPError, e:
        print e
        sys.exit(errno.ENOMSG) # no result

    if _result == None or not _result:
        print 'No result in LDAP search'
        sys.exit(errno.ENOMSG) # no result

    if property_str == 'dn': # special case: dn is getted in other field
        return _result[0][0]

    try:
        _ret = _result[0][1][property_str]
        if len(_ret) == 1: # only one result?
            return _ret[0]
    except KeyError:
        return '' # empty value

    return _ret

def get_groups(user):
    # TODO only groups of organization or all of them?
    _result = get_ldap_property('(cn=%s)' % user, 'groupMembership')
    if not _result:
        return '' # no groups found

    # only one result?
    if type(_result) is str:
        _result = [_result]

    _ret = ''
    for _item in _result:
        _t = _item.split(',')
        if '=' in _t[0]:
            _ret = '%s%s, ' % (_ret, _t[0].split('=')[1])

    return _ret[:-2] # remove trailing ',

def run():
    global global_ldap_object
    global_ldap_object = ldap.initialize('ldap://%s:389' % LDAP_SERVER)

    user=migasfree_client.utils.get_current_user().split("~")[0]
    print get_groups(user),

if __name__ == '__main__':
    run()

Sobre el cliente migasfree

El cliente migasfree devuelve el mensaje: “firma no válida”

Causa

Las claves almacenadas en el cliente no coinciden con la versión indicada en /etc/migasfree.conf.

Solución

Borra las claves del equipo cliente.

Para la versión de migasfree-client 4.6 ó inferior usa:

# rm /root/.migasfree-keys/*

Para la versión de migasfree-client 4.7 ó superior usa:

# rm -rf /var/migasfree-client/keys/[server]/*

Nota

Si es necesario, vuelve a registrar el cliente ejecutando: migasfree --register.

Imposible obtener /PKGS/binary-amd64/Packages 404 Not Found

Causa

Por defecto los repositorios en el servidor se generan para la arquitectura i386.

Solución

Accede a Configuracion - p.m.s. - apt-get y modifica el campo crear repositorio de esta manera:

cd %PATH%
mkdir -p %REPONAME%/PKGS/binary-i386/
mkdir -p %REPONAME%/PKGS/binary-amd64/
mkdir -p %REPONAME%/PKGS/sources/
cd ..
dpkg-scanpackages -m dists/%REPONAME%/PKGS /dev/null | gzip -9c > dists/%REPONAME%/PKGS/binary-i386/Packages.gz
dpkg-scanpackages -m dists/%REPONAME%/PKGS /dev/null | gzip -9c > dists/%REPONAME%/PKGS/binary-amd64/Packages.gz
dpkg-scansources dists/%REPONAME%/PKGS /dev/null | gzip -9c > dists/%REPONAME%/PKGS/sources/Sources.gz

No se consige ejecutar el cliente de migasfree en un cron.

Causa

Las variables de entorno no están disponibles.

Solución

En vez de programar el cron así:

00 07 * * * root /usr/bin/migasfree --update

debemos forzar el entorno de usuario de esta forma:

00 07 * * * root su -c 'migasfree --update' --login

Resolución de problemas

Un problema deja de serlo si no tiene solución.

—Eduardo Mendoza

A menudo, puede ocurrir que migasfree no esté funcionando como se espera. Para obtener más información y averiguar qué te puede estar ocurriendo, puedes poner tanto al cliente como al servidor en modo DEBUG.

Cliente en modo DEBUG

Simplemente debes poner el ajuste Debug a True en los Ajustes del cliente migasfree.

Cuando ejecutes migasfree --update en este modo desde una consola, verás en la salida estándar más información de la habitual.

También puede serte útil consultar la información que se va generando en /var/tmp/migasfree.log.

Servidor en modo DEBUG

Al estar el servidor realizado con Django, puedes usar el ajuste DEBUG a True. Este ajuste del servidor debes ponerlo en el fichero /etc/migasfree-server/settings.py y después reiniciar el servidor web.

Al hacer esto, la página del servidor migasfree que te está fallando te mostrará, en vez de una página de error escueta, otra página de error con información muy extensa y que te permitirá ver qué está ocurriendo.

Nota

Nunca dejes el modo DEBUG en un entorno de producción por seguridad.

Activar el sistema de logging en el servidor

El servidor utiliza el módulo de logging de Python.

Para activar el sistema de logging en el servidor de migasfree añade el ajuste LOGGING en /etc/migasfree-server/settings.py:

LOGGING = {
    'version': 1,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d
%(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'file': {
            'level': 'DEBUG',
            'class': 'logging.FileHandler',
            'filename': '/tmp/migasfree.log',
            'formatter': 'verbose',
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'migasfree': {
            'handlers': ['console', 'file'],
            'level': 'DEBUG',
        }
    }
}

Esto hará que en el fichero indicado (/tmp/migasfree.log) se almacenen los logs.