Algo de Linux: noviembre 2012

jueves, 29 de noviembre de 2012

Modificado el módulo puppet para instalar iceweasel desde Backports

He modificado el módulo puppet para solucionar un problema reportado por Carlos Magro, por el que no se instalaba el paquete con la nueva key del repositorio, debido a que antes había que hacer un update del repositorio:

https://www.box.com/s/tmsi7clsaxbvnpannksw

Por cierto, este módulo instala los paquetes desde un mirror de backports montado en el servidor ldap. Si queréis utilizarlo, podéis hacer dos cosas: 
  • Cambiar los repositorios por los oficiales en el propio módulo.
  • Crear el mirror en vuestro servidor ldap.

Crear un árbol de directorios con un solo comando

Muchas veces necesitamos crear una estructura de directorios de una sola vez; por ejemplo, cuando vamos a crear un módulo puppet. Si ejecutamos:

# mkdir -p /etc/puppet/modules/{files,manifests,facts}
crearemos de una sola vez la siguiente estructura de directorios:

/etc/puppet/modules/
|-- facts
|-- files
`-- manifests

miércoles, 28 de noviembre de 2012

Montar un servidor de clonación con DRBL

Instalar un servidor de clonación con DRBL es relativamente sencillo cuando tenemos control sobre el DHCP de nuestra red y podemos instalar DRBL en la misma máquina donde se encuentra instalado DHCP. 

Lo que no es tan sencillo es instalar un servidor DRBL en una red donde ya tenemos un servidor de DHCP cuya configuración no podemos tocar. Para solucionar este problema podemos ocurrir a varias soluciones, como:
  • Configurar el servidor DHCP de DRBL para que escuche en otro puerto distinto del estándar.
  • O sustituir el servidor DHCP de DRBL (isc-dhcp-server) por dnsmasq, un servidor dhcp que podemos configurar como proxyDHCP.
A continuación podéis ver un documento en el que he elegido la segunda opción para resolver el problema:

viernes, 23 de noviembre de 2012

Nueva corrección del módulo instala-java-1_7

He vuelto a subir el módulo instala-java-1_7 después de corregir un bug que no creaba bien los enlaces alternativos /etc/alternatives/iceweasel-javaplugin.so y /etc/alternatives/mozilla-javaplugin.so si utilizábamos el módulo en un equipo de 64 bits.

miércoles, 21 de noviembre de 2012

Modificado el módulo instala-java-1_7

He modificado el módulo de puppet instala-java-1_7 para corregir un pequeño bug por el que no se realizaba la instalación del paquete hasta la segunda ejecución de puppet.

Podéis descargarlo desde el siguiente enlace:
https://www.box.com/s/b5aynghswl8gtk3oac2v

Gracias, Paco.

domingo, 18 de noviembre de 2012

resolvconf: Gestionando /etc/resolv.conf

El archivo /etc/resolv.conf es el archivo de configuración del resolver. Se usa para que un cliente pueda acceder a DNS y, en él se proporcionan los servidores de DNS que se van a utilizar.

Antiguamente el archivo /etc/resolv.conf era estático, pero hoy en día hay muchas aplicaciones que lo manejan de forma dinámica.

resolvconf es un framework que mantiene la información del archivo /etc/resolv.conf y que muchas veces nos encontraremos instalado. 

Los ficheros de configuración de resolvconf se encuentran en: /etc/resolvconf

Dentro del directorio /etc/resolvconf encontraremos un archivo: 
/etc/resolvconf/interface-order, donde se establece el orden (por interfaces) en el que los scripts de actualización de resolvconf procesarán los registros de servidores de nombres.

# cat /etc/resolvconf/interface-order

# interface-order(5)
lo.inet*
lo.dnsmasq
lo.pdnsd
lo.!(pdns|pdns-recursor)
lo
tun*
tap*
hso*
eth*
ath*
wlan*
ppp*
*

Dentro del directorio /etc/resolvconf encontraremos otro directorio: resolvconf.d en el que tenemos tres archivos:
  • /etc/resolvconf/resolvconf.d/head
  • /etc/resolvconf/resolvconf.d/base
  • /etc/resolvconf/resolvconf.d/tail
En el archivo /etc/resolvconf/resolvconf.d/base se almacena la información básica para el resolver. Dentro de él guardaremos la información básica de dns que queramos tener en la máquina. Por ejemplo:

nameserver 127.0.0.1

nameserver 8.8.8.8
search midominio.es


En el archivo /etc/resolvconf/resolvconf.d/head se almacena la información que queremos que se añada al comienzo del archivo resolv.conf generado. Por defecto, tan sólo contiene el comentario de cabecera que vemos al editar el archivo resolv.conf:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN

En el archivo /etc/resolvconf/resolvconf.d/tail se almacena la información que queremos que se añada al final del archivo resolv.conf generado. Por defecto, se encuentra vacío.

Cuando modifiquemos  estos archivos, para actualizar el archivo /etc/resolv.conf ejecutaremos el comando:
# resolvconf -u

Para más información:
  • man resolvconf
  • http://anonscm.debian.org/gitweb/?p=resolvconf/resolvconf.git;a=blob;f=README;hb=HEAD

jueves, 15 de noviembre de 2012

Forzar el desmontaje de una partición o dispositivo

A veces nos es imposible desmontar un dispositivo o partición con el comando umount. Cuando esto suceda, podemos probar lo siguiente:

1) Tratar de desmontar el recurso usando la opción -l de umount si estamos trabajando con un recurso local:

# umount -l punto-de-montaje

2) Tratar de desmontar el recurso usando la opción -f de umount, si estamos trabajando con un recurso nfs:

# umount -f punto-de-montaje

Puppet: Clase clase-especifica-squeeze

Aquí tenéis mi clase-especifica-squeeze, tal y como la tengo definida ahora mismo en el centro para tener todo un poco más organizado.

Como podéis ver, tengo cinco posibles clasos:
  • Tareas que van dirigidas a todos los servidores de terminales  
  • Tareas para servidores de terminales en aulas de portátiles.
  • Tareas para sevidores de terminales en aulas con thinclients.
  • Tareas para el servidor freeradius.
  • Tareas para un equipo de pruebas.


# Cualquier regla debe estar comprendida entre las llaves
# Para poner reglas a los servidores de aula con squeeze de los IES con la imagen de junio de 2012
# class clase-especifica-squeeze { }, nunca fuera.

class clase-especifica-squeeze {
   file {"/tmp/fichero.test12_ltsp":
          ensure  => present, owner => root, group  => root
   }

   include "add-repositorio-local"
   include "instala-iceweasel-backports"
   include "instala-iceweasel-backports-chroot"
   include "instala-java-1_7"
   include "gnome-mandatory-squeeze"
   include "adm_avisos"
   include "administracion2"
   include "add-opciones-arranque-terminal"

   case $hostname  {
      a01-pro,a02-pro,a03-pro,a08-pro,a09-pro: { include "tareas-aulas-portatiles" }
      a04-pro,a05-pro,a06-pro,a07-pro,a10-pro,a11-pro,a12-pro,a13-pro,a14-pro,a15-pro,a16-pro,a17-pro,a18-pro,a19-pro,a20-pro,a21-pro: { include "tareas-aulas-terminales" }
      a22-pro: { include "tareas-servidor-freeradius" }
     
      default: { }
   }

   if $hostname == "a01-pro" {
      # include "tarea-en-pruebas" 
   }
}

Las tareas para aulas de portátiles las incluimos dentro de un fichero .pp:

# cat /etc/puppet/manifests/classes/tareas-aulas-portatiles.pp

class tareas-aulas-portatiles {
   # include "tarea-para-aulas-de-terminales"
} 


Las tareas para aulas de thinclients las incluimos dentro de un fichero .pp:

# cat /etc/puppet/manifests/classes/tareas-aulas-terminales.pp

class tareas-aulas-terminales {
   # include "tarea-para-aulas-de-terminales"
}

Las tareas para el servidor freeradius las incluimos dentro de un fichero .pp:

# cat /etc/puppet/manifests/classes/tareas-servidor-freeradius.pp

class tareas-servidor-freeradius {
   # include "tarea-para-servidor-freeradius"
}

Las tareas para el servidor de terminales de pruebas las coloco directamente dentro del if:

if $hostname == "a01-pro" {
   # include "tarea-en-pruebas" 
}

Polkit: Modificar políticas para permitir al usuario apagar o reiniciar desde gnome

Algún compañero comentó que en los equipos workstation con Debian Squeeze el usuario no podía reiniciar o apagar el sistema porque el botón de apagado de la barra de tareas le aparecía desactivado. 

Lo mejor para solucionar este problema es crear un fichero dentro de  /etc/polkit-1/localauthority/50-local.d/  en el que definamos las políticas a  aplicar. Por ejemplo, yo he creado un fichero llamado 50-consolekit.pkla dentro de dicho directorio con el siguiente contenido para permitir reiniciar o apagar el sistema desde Gnome a usuarios del grupo profesor: 

# cat /etc/polkit-1/localauthority/50-local.d/50-consolekit.pkla


[Restart]
Identity=unix-group:teachers
Action=org.freedesktop.consolekit.system.restart
ResultAny=no
ResultInactive=yes
ResultActive=yes

[Shutdown]
Identity=unix-group:teachers
Action=org.freedesktop.consolekit.system.stop
ResultAny=no
ResultInactive=yes
ResultActive=yes

Si queremos que cualquier usuario pueda apagar y reiniciar el sistema, no tendríamos más que cambiar:
Identity=unix-group:teachers por Identity=unix-user:*

# cat /etc/polkit-1/localauthority/50-local.d/50-consolekit.pkla


[Restart]
Identity=unix-user:*
Action=org.freedesktop.consolekit.system.restart
ResultAny=no
ResultInactive=yes
ResultActive=yes

[Shutdown]
Identity=unix-user:*
Action=org.freedesktop.consolekit.system.stop
ResultAny=no
ResultInactive=yes
ResultActive=yes


Es recomendable hacerlo así, en lugar de editar el fichero /usr/share/polkit-1/actions/org.freedesktop.consolekit.policy, para evitar que al actualizarse polkit se pierdan nuestros ajustes.

miércoles, 14 de noviembre de 2012

Puppet: Clase especifica-miniportatil-2011

Algunos compañeros me han preguntado cómo tenía definida la clase específica de puppet para portátiles para distinguir entre portátiles de alumnos y portátiles de profesores. Bien, pues lo muestro a continuación:


# Cualquier regla debe estar comprendida entre las llaves 
# para poner reglas a los miniportatiles entregados en 2011 en los IES (apd)
# class especifica-miniportatil-2011 { }, nunca fuera.
 
class especifica-miniportatil-2011 {
   file {"/tmp/fichero.test11":
          ensure  => present, owner => root, group  => root
   }

   # aquí las reglas

   include "politicas-networkmanager"
   include "disable-warning-puppetmasterd"
   include "instala-flash"
   include "instala-firefox"
   include "instala-java-1_7"
   include "cambia-root-password"
   include "add-repositorio-local"

   case $use {
        "portatil-profesor-2011": { 
            include "backupHomeUser"
            include "instala-dropbox"
         }
        "portatil-alumno-2011": {
            # include "tarea-especifica-alumnos"
        }
        default: { }
   } 

   if $hostname == "cobaya" { 
      # include "tareas-en-pruebas" 
      # include "apt"
   }
} 

Como se puede ver, de este modo, dependiendo de donde coloque una nueva regla, se aplicará:
  • A todos los portátiles, si coloco el include "tarea" justo antes de la sentencia case.
  • A portátiles de profesores, si coloco el include en el caso de que la variable facter $use = "portatil-profesor-2011".
  • A portátiles de alumnos, si coloco el include en el caso de que la variable facter $use = "portatil-alumno-2011"
 Decir que en mi centro, tengo todos los portátiles clonados con la misma imagen, por lo que tan sólo tengo que definir tareas para portátiles en la clase "especifica-miniportatil-2011"

rsync para hacer una copia de ext3 a fat32

Normalmente uso rsync entre sistemas de archivos ext3 o ext4 con las opciones -av ( -av es lo mismo que -rlptgoD):
  • -r: recursivo.
  • -l: copiar enlaces simbólicos como enlaces simbólicos.
  • -p: preservar permisos.
  • -t: preservar tiempos (fechas/horas).
  • -g: preservar grupos.
  • -o: preservar el propietario.
  • -D: dispositivos.
Para hacer un rsync entre un directorio de un sistema de archivos ext3 y un sistema de archivos fat32, podemos utilizar las siguientes opciones:

# rsync -rtv /directorio/original   /directorio/destino

  • -r: recursivo.
  • -t: preservar tiempos (fechas/horas).
  • -v: modo verbose.

domingo, 11 de noviembre de 2012

Generar archivo de fuentes sources.list para Ubuntu

Al igual que podemos crear el contenido del sources.list para una distribución Debian (http://repogen.simplylinux.ch/index.php), también podemos generar un sources.list para Ubuntu, recorriendo a Ubuntu Sources List Generator (http://repogen.simplylinux.ch/index.php):

Si entramos en la web de Ubuntu Sources List Generator, veremos que podemos añadir una gran cantidad de repositorios. Lo que se muestra en pantalla es tan sólo una captura de una parte.

Generar archivo de fuentes sources.list para Debian

A veces es complicado recordar cuál es la lista de repositorios que tenemos que añadir una Debian que estamos instalando. En este caso podemos recurrir a Debian Sources List Generator (http://debgen.simplylinux.ch/), una aplicación web que nos generará la lista de repositorios que seleccionemos:



Además de los repositorios oficiales de Debian, podremos añadir otra serie de repositorios extra que en este sitio tienen en lista.

Montar BackTrack en un dispositivo usb formateado en FAT32

BackTrack es una distribución linux live que nos va a permitir testear la seguridad de nuestros sistemas. Dispone de un instalador, por lo que podemos probarla desde CD y, si nos gusta, instalarla en disco duro.

No obstante, hoy en día, dado que el precio de los pendrives es reducido, nos merece también la pena montar backtrack en un usb para lograr una mayor agilidad en la ejecución y poder llevar con nosotros la distribución en un bolsillo, lista para utilizar en otra máquina que no sea la que usamos habitualmente.

El modo más sencillo de instalar BackTrack en un pendrive es mediante UnetBootIn. Y esto es lo que vamos a ver a continuación.

Si no tenemos instalado UnetBootIn en nuestro Debian, lo instalamos:

# apt-get update && apt-get install unetbootin

A continuación, descargamos la iso desde la web oficial: http://www.backtrack-linux.org/

Una vez descargada, introducimos el pendrive que tenemos formateado en FAT32 en nuestro equipo y arrancamos unetbootin.

Puede que nos pida la contraseña de administrador:


Si es así, la introducimos.

Nos aparecerá una ventana como la siguiente:


Marcamos la opción DiscoImagen, dejamos seleccionado "ISO" y pulsamos en el botón con los puntos suspensivos que hay a continuación para seleccionar la iso de BackTrack:



En la parte inferior, dejamos seleccionado "Unidad USB"  y, en "Unidad:" elegimos la unidad USB donde queremos instalar BackTrack. Tened cuidado si tenéis conectado otro dispositivo USB, más que nada para no instalarlo en el dispositivo que no queramos.

Tardará un poquito. Una vez que termine el proceso, unetbootin nos preguntará si queremos reiniciar o salir. Elegimos salir, puesto que estamos instalando en el pendrive y no necesitamos reiniciar.

Es importante recordar que el proceso de instalación no borra nada de lo que tengamos guardado en el pendrive, y que, la ventaja de este método es que, al estar formateado en FAT32, podemos seguir utilizando el pendrive para almacenar nuestros archivos y poder disponer de ellos tanto en linux como en windows.

sábado, 10 de noviembre de 2012

Modificados los módulos puppet instala-firefox, instala-java-1_7 e instala-flash

He modificado los módulos puppet instala-firefox, instala-java-1_7 e instala-flash. Los encontraréis en el directorio tareas_puppet (https://www.box.com/s/lj0r9zhs4n4ckl5rxila) de mi cuenta de box.net.

Es importante que los descarguéis de nuevo, si los estáis utilizando en aulas de portátiles con conexión wifi. En aulas con clientes cableados no he detectado ningún problema.

La versión anterior tenía el inconveniente de que no limitaba el consumo de ancho de banda en la descarga de archivos de wget. Como consecuencia, cuando varios portátiles ejecutaban alguna de estas tareas a la vez y comenzaban a descargarse los archivos, algunos de ellos no se descargaban completamente y alguna de las tareas fallaba.

viernes, 9 de noviembre de 2012

Crear un mirror local con apt-mirror

En los centros ya tenemos un mirror de debian squeeze creado con una herramienta llamada debmirror. 

apt-mirror es otra excelente herramienta para crear mirrors de repositorios.

Aprovechando que acabo de crear un mirror de ubuntu para los ciclos de informática, vamos a ver cómo hacerlo usando apt-mirror.

apt-mirror maneja los siguientes ficheros de configuración y directorios:
  •  /etc/apt/mirror.list: Es el principal fichero de configuración.
  • /etc/cron.d/apt-mirror: Es una plantilla de configuración de cron para lanzar apt-mirror de forma programada
  • /var/spool/apt-mirror/mirror: Es el directorio donde se guardará el mirror.
  • /var/spool/apt-mirror/skel: Es un directorio para almacenar temporalmente los índices descargados.
  • /var/spool/apt-mirror/var: Es un directorio donde se guardan los logs, urls y hashes md5.
Primero instalamos apache2 (si no lo tenemos instalado ya) para servir los paquetes del mirror:

# apt-get install apache2

A continuación instalamos el paquete apt-mirror:

# apt-get install apt-mirror

Una vez instalados los paquetes, hacemos una copia del fichero de configuración principal, para recurrir a él, si fuera necesario:

# cp /etc/apt/mirror.list /etc/apt/mirror.list.orig

Y editamos el fichero:

# nano /etc/apt/mirror.list


###################### config ######################
#
# set base_path    /var/spool/apt-mirror
#
# set mirror_path  $base_path/mirror
# set skel_path    $base_path/skel
# set var_path     $base_path/var
# set cleanscript $var_path/clean.sh
# set defaultarch 
# set postmirror_script $var_path/postmirror.sh
# set run_postmirror 0
set nthreads     20
set _tilde 0
################### end config ######################


############## Repositorios amd64 #####################

###### Ubuntu Main Repos
deb-amd64 http://es.archive.ubuntu.com/ubuntu/ quantal main restricted universe multiverse

###### Ubuntu Update Repos
deb-amd64 http://es.archive.ubuntu.com/ubuntu/ quantal-security main restricted universe multiverse
deb-amd64 http://es.archive.ubuntu.com/ubuntu/ quantal-updates main restricted universe multiverse

###### Ubuntu Proposed Repos
deb-amd64 http://es.archive.ubuntu.com/ubuntu/ quantal-proposed main restricted universe multiverse

###### Ubuntu Backports Repos
deb-amd64 http://es.archive.ubuntu.com/ubuntu/ quantal-backports main restricted universe multiverse

############### Repositorios i386 ##################### 


###### Ubuntu Main Repos
deb-i386 http://es.archive.ubuntu.com/ubuntu/ quantal main restricted universe multiverse

###### Ubuntu Update Repos
deb-i386 http://es.archive.ubuntu.com/ubuntu/ quantal-security main restricted universe multiverse
deb-i386 http://es.archive.ubuntu.com/ubuntu/ quantal-updates main restricted universe multiverse

###### Ubuntu Proposed Repos
deb-i386 http://es.archive.ubuntu.com/ubuntu/ quantal-proposed main restricted universe multiverse

###### Ubuntu Backports Repos
deb-i386 http://es.archive.ubuntu.com/ubuntu/ quantal-backports main restricted universe multiverse



clean http://es.archive.ubuntu.com/ubuntu/


Como podéis ver, en la sección de configuración, todos los parámetros de ubicación de ficheros están comentados. No los he "descomentado" porque quiero que se almacenen en la ubicación por defecto.

Tampoco he tocado la opción set defaultarch que nos permite indicar la arquitectura de paquetes por defecto. Por ejemplo:

# set defaultarch amd64

En cambio, como se puede apreciar en el fichero de configuración, estoy creando específicamente el repositorio con:
  • paquetes de 64 bits: deb-amd64  
  • y paquetes de 32 bits: deb-i386
Por último, en el fichero de configuración veréis la siguiente línea:

clean http://es.archive.ubuntu.com/ubuntu/

Esta línea le dice a apt-mirror en qué directorios del disco duro local debería chequear para ver si se puede liberar espacio en disco.

Con ésto, como se puede ver en el archivo de configuración, voy a crear los siguientes mirrors:
  • quantal
  • quantal-backports
  • quantal-proposed
  • quantal-security
  • quantal-updates
 Y aquí es donde quedarán almacenados los archivos:

/var/spool/apt-mirror/mirror/
 └── es.archive.ubuntu.com
        └── ubuntu
                 ├── dists
                 │     ├── quantal
                 │     ├── quantal-backports
                 │     ├── quantal-proposed
                 │     ├── quantal-security
                 │     ├── quantal-updates
                 │    
                 ├── pool
                 │     ├── main
                 │     ├── restricted
                 │     ├── universe
                 │     ├── multiverse

Bien, pues una vez que ya tenemos los repositorios en /var/spool/apt-mirror/mirror, vamos a crear un enlace en /var/www para que los paquetes del repositorio sean servidos por apache:

# cd /var/www
# ln -s /var/spool/apt-mirror/mirror/es.archive.ubuntu.com/ubuntu/  ubuntu

Una vez que tengamos el enlace creado, el siguiente paso será editar el fichero /etc/cron.d/apt-mirror y modificar la hora de puesta en marcha de la creación del mirror:

# /etc/cron.d/apt-mirror
# Regular cron jobs for the apt-mirror package
#
30 21    * * *    apt-mirror    /usr/bin/apt-mirror > /var/spool/apt-mirror/var/cron.log


Por otra parte, crearemos un fichero cron para matar la tarea anterior a cierta hora:

# /etc/cron.d/apt-mirror-die
# Kill the apt-mirror
#
45 7    * * *    apt-mirror    killall -9 apt-mirror


Y eso es todo. Cuando lleguen las 21:20 comenzará la creación del mirror y terminará a las 7:45 de la mañana del día siguiente.

Por último, tan sólo me queda mencionar cómo usar los repositorios en el fichero /etc/apt/sources.list:

deb http://mirror-ubuntu/ubuntu quantal main restricted universe multiverse
deb http://mirror-ubuntu/ubuntu quantal-backports main restricted universe multiverse
deb http://mirror-ubuntu/ubuntu quantal-proposed main restricted universe multiverse
deb http://mirror-ubuntu/ubuntu quantal-security main restricted universe multiverse
deb http://mirror-ubuntu/ubuntu quantal-updates main restricted universe multiverse

lunes, 5 de noviembre de 2012

Módulo puppet para configurar puppet kick en los clientes

Aquí dejo una tarea que configura puppet kick en los clientes puppet:

https://www.box.com/s/1q62rnsb35q4racc7e6w

Módulo puppet para agregar el repositorio deb-multimedia a los clientes

Aquí dejo un módulo que añade el repositorio deb-multimedia a los clientes:

https://www.box.com/s/3ueeasvkef61fjsr65kk

El módulo añade el repositorio junto con la clave pública del mismo.

Este repositorio lo conocíamos antes como debian-multimedia. Tuvieron que cambiarlo de nombre a deb-multimedia a petición de Debian.