"Después del juego es antes del juego"
Sepp Herberger

martes, 13 de enero de 2015

Tarea puppet para dar de alta impresoras

Una vez tenemos nuestros equipos manejados por puppet, no viene nada mal incluir tareas puppet para la creación de impresoras automáticamente. Esta posibilidad no la ofrece puppet por defecto, aunque a dia de hoy existe este recurso, en su día me vi en la necesidad de crear impresoras antes de que apareciese y esta es la solución que encontré y sigo usando.

El módulo puppet se llama "crea_impresora", y tiene la siguiente estructura:

crea_impresora/
├── files
│    ├── crea-impresora.sh
│    ├── Ricoh-Aficio_3035-pxlmono-Ricoh.ppd
│    └── vgim-conserjeria
└── manifests
     └── init.pp

El init.pp es:

#Crea la impresora a partir del fichero de configuracion
#indicado en el parámetro. Ver files/crea-impresora.sh para
#saber la sintaxis.
#El fichero de configuracion se guarda en files, junto con el script

class script_impresora {

  file {"/root/scripts":
     ensure => directory,
     before => File["/root/scripts/crea-impresora.sh"]
  }

  file {"/root/scripts/crea-impresora.sh":
    owner=>root, group=>root, mode=>755,
    source=>"puppet:///crea_impresora/crea-impresora.sh",
  }
}

define crea_impresora($configuracion) {

  include "script_impresora"

  Class['script_impresora'] -> crea_impresora["$title"]

  file {"/root/scripts/$configuracion":
    owner=>root, group=>root, mode=>755,
    source=>"puppet:///crea_impresora/$configuracion",
    notify => Exec["instala-$configuracion"],
    }

  exec {"instala-$configuracion":
    command => "/root/scripts/crea-impresora.sh $configuracion",
    subscribe => File["/root/scripts/$configuracion"],
    refreshonly => true,
       }
}

El script crea_impresora.sh es:

#!/bin/bash

#Crea o modifica una impresora ya existente de acuerdo con las variables definidas
#en el fichero dado como único parametro.
#Parametros:
#           $name: es el nombre a dar a la impresora en cups
#           $descripcion: el texto con la descripción larga que aparecerá a los usuarios
#           $opciones: son las opciones de configuración de la impresora. Van en formato "-o = -o <opcion=valor> ......"
#           $uri: es la ruta de la impresora (http, socket, usb, etc). Si no sabemos cual es podemos dar de alta la impresora a mano desde el interface
#                 web de cups y luego mirar como queda en /etc/cups/printers.conf
#           $tipo: tipo de driver  "ppd", "model" o "foomatic", segun vayamos a darla de alta con un fichero ppd externo, por el modelo o con un driver
#                  de foomatic.
#           $tea4cups (opcional): vale "yes" si además queremos poner el filtro tea4cups a la impresora.
#           $denegar (opcional): usuario o grupo de usuarios a los que denegamos al acceso.
#Parámetros dependientes:
#           $ppd: si el tipo de alta es "ppd" aqui vendrá el nombre del fichero con el ppd. Este fichero deberá estar en http://servidor/files/
#           $modelo: si el tipo de alta es "model" aqui vendrá el modelo de la impresora. Se usa cuando el ppd ya viene de serie con la distribucion Linux
#                    Para sacar el driver usado con su nombre correcto lo mejor es dar de alta la impresora a mano desde el interface web de cups, mirar
#                    el driver que hay en /etc/cups/printers.conf y hacer un lpstat -m buscando el nombre correcto del driver a poner
#           $modelo, $driver: se usan si el tipo es "foomatic". Para averiguar el nombre correcto, lo mejor es dar de alta la impresora  a mano desde el
#                             interfaz web de cups, mirar en /etc/cups/printers.conf la linea MakeModel para hacernos una idea, y por ultimo, extraer
#                             del nombre de Modelo y Driver haciendo foomatic-configure -Q que muestra un XML donde está el nombre correcto de Modelo y Driver.
#                             Esta en la instalación mas complicada, ya que los drivers foomatic son díficiles de automatizar.

if [ $# -ne 1 ]
then
  echo "Uso: $0 "
  exit
fi

directorio=$(dirname $0)
#Ejecuta el fichero externo donde se definen las variables para crear/configurar la impresora.
source "$directorio/$1"

case "$tipo"  in
   "ppd")
      #Descarga el driver
      wget -nc -O $directorio/$ppd http://servidor/files/$ppd
      /usr/sbin/lpadmin -p $name -D "$descripcion" -v "$uri" -P "$directorio/$ppd" -E $opciones
      /etc/init.d/cups restart
      ;;
   "model")
      /usr/sbin/lpadmin -p $name -D "$descripcion" -v "$uri" -m "$modelo" -E $opciones;
      /etc/init.d/cups restart
      ;;
   "foomatic")
      /usr/bin/foomatic-configure -s cups -p "$modelo" -n $name -N "$descripcion" -c "$uri" -d $driver; /usr/sbin/lpadmin -p $name $opciones
      /etc/init.d/cups restart
      ;;
esac

if [ "$tea4cups" == "yes" ]
then
   #modificar el uri para añadir tea4cups en cups.printers.conf
   sed -i "s#DeviceURI $uri#DeviceURI tea4cups://$uri#g" /etc/cups/printers.conf
   /etc/init.d/cups restart

fi

if [ "$denegar" != "" ]
then
   /usr/sbin/lpadmin -p $name -u deny:$denegar
   /etc/init.d/cups restart
else
   /usr/sbin/lpadmin -p $name -u deny:none
   /etc/init.d/cups restart
fi

Está bastante comentado, pero cuento como funciona: tiene como parámetro de entrada un fichero donde se definen los parámetros de la impresora a crear. Ese fichero se ejecuta mediante:

source "$directorio/$1"

Luego se procesa el contenido de esas variables para crear la impresora. Lo mas destacable es que hay tres formas de crear una impresora, en función del valor de la variable $tipo:

  • Dando el fichero ppd con el driver directamente, la forma mas usual. Se usa además la variable $ppd para indicar el nombre del fichero. El fichero .ppd podemos haberlo bajado de Internet o bien sacado del directorio /etc/cups/ppd de una máquina donde esté instalada la impresora previamente.
  • Seleccionando el modelo de la impresora por su nombre desde los drivers instalados en el sistema. Esto se puede sacar con lpstat -m. Se usará además la variable $modelo.
  • Mediante foomatic, para impresoras cuyos drivers vienen en los paquetes de foomatic y se instalan de una manera especial. Se usarán además las variables $marca y $modelo.

En los comentarios del fichero vienen detallada la forma de encontrar los valores adecuados para $ppd, $marca y $modelo.

El resto de parámetros del fichero son:

  • El nombre y descripción de la impresora.
  • La URI de acceso a la impresora.
  • Las opciones de por defecto.
  • Si se incluye el filtro tea4cups, para cual debemos tener instalado tea4cups en el sistema.
  • Si se deniega el acceso a determinados usuarios o grupos. Muy útil para impedir que los alumnos impriman.

Si desconocemos alguno de estos parámetros, la mejor solución es dar de alta la impresora a mano mediante cups, probar que funciona y luego mirar en /etc/cups/printers.conf su configuración.

Por último, un ejemplo para una impresora de red, una Ricoh Aficio 3035. Necesitamos 2 ficheros que pondremos en el directorio files de nuestra tarea:

  • Ricoh-Aficio_3035-pxlmono-Ricoh.ppd, que hemos descargado de la página web de OpenPrinting.
  • El fichero vgim-conserjeria, con los parámetros para la configuración:
#Impresora fotocopiadora de red de conserjeria, con tea4cups
#Compartida mediante cups desde
172.21.117.2 descripcion="Impresora Fotocopiadora Conserjeria" ppd="Ricoh-Aficio_3035-pxlmono-Ricoh.ppd" uri="http://172.21.117.2:631/printers/VGIM_CONSERJERIA" opciones="-o printer-is-shared=false -o PageSize=A4" name="VGIM_CONSERJERIA" tipo="ppd" tea4cups="yes" denegar="@students,pepe"

Para instalar la impresora en una máquina concreta simplemente tenemos que añadir en la clase puppet de esa máquina:

crea_impresora {"VGIM_CONSERJERIA":
                           configuracion => "vgim-conserjeria",
}

El cliente puppet de la máquina hará lo siguiente al ejecutarse:

  • Crear el directorio /root/scripts en la máquina.
  • Copiar dentro los ficheros crea-impresora.sh, el .ppd y vgim-conserjeria.
  • Ejecutar "./crea-impresora.sh vgim-conserjeria".

Y con eso se creará. En el momento en que cambiemos algún parámetro modificando vgim-conserjeria en el módulo, el script se ejecutará de nuevo borrando la impresora y creándola con la nueva configuración.

NOTA: hay ciertas impresoras, en mi caso la Samsung 1640 o la Lexmark Z602, que necesitan además la instalación de varios paquetes .deb y una instalación interactiva mediante un software instalador. En ese caso la cosa es bastante compleja de automatizar y normalmente no podremos encajarlo en una tarea puppet a no ser que podamos replicar todos los pasos de la instalación mediante un script.

No hay comentarios:

Publicar un comentario