jueves, 6 de noviembre de 2014

Impresoras en red en el centro

Hoy en un correo preguntaban el modo de añadir impresoras en red en el centro, y me va a servir de escusa para documentarlo.

Preparar la impresora.

Si queremos que la impresora sea accesible por red desde todo el centro tenemos que conocer su ip.
Por otra parte es interesante que nosotros decidamos que ip queremos que tenga para que no esté dentro del rango de dhcp y además sea fija y no cambie por caprichos del servidor dhcp.
Tenemos al menos dos formas para hacerlo:

  • 1. Ponerle la ip fija directamente a la impresora mediante su interface web o mediante los menús de la propia impresora ( si tiene display y esa opción). Si queremos acceder por la interface web, debemos de saber que ip coge. Para ello lo primero, lógicamente es conectarla a la red del centro e imprimir un informe de la impresora. Allí figurará tanto ip cogida como mac. Si accedemos via web, sólo tendremos que cambiar la ip a la que queramos en el apartado correspondiente. Normalmente hay que iniciar sesión y entrar dentro de configuración y apartado tcp/ip o ipv4.


  • La otra opción, que es perfectamente compatible con ésta, es crearle dentro de nuestro ldap un objeto con su nombre y asignarle una ip fija a su mac. En este caso, lógicamente también tenemos que haber enganchado el cable de red y saber cual es su mac desde el informe de la impresora. 
Entramos dentro de la base de datos ldap y creamos un objeto printer-host dentro de la rama Netgroup.  
Aquí podemos ver el mio.

Si no tenemos ese objeto es fácil crearlo, entramos en otro, por ejemplo all-host y le damos a copiar objeto cuando nos pida el nuevo nombre en DN destino, cambiamos all-host por printer-host y le damos al botón de copiar. Ya se habrá creado.
Luego sólo tenemos que añadir las impresoras a ldap. Para ello uso un script realizado por los compañeros  que se llama addprinter.sh. Lo ejecutamos en ldap de la forma:

sh addprinter.sh NombreImpresora ip mac

Éste es el contenido:

#!/bin/bash

#Añade un switch al directorio LDAP

if [ $# -ne 3 ]; then
echo "Uso: $0 printername ip mac"
exit
fi


dominio=`hostname -d`
host=$1
ip=$2
ip1=`echo $2 | cut -d"." -f1`
ip2=`echo $2 | cut -d"." -f2`
ip3=`echo $2 | cut -d"." -f3`
ip4=`echo $2 | cut -d"." -f4`
mac=`echo $3 |tr '[:lower:]' '[:upper:]'`
echo dominio: $dominio
echo printer: $host
echo dominio: $ip
echo dominio: $dominio
echo pulsa enter
read
FICHERO=$host.$dominio.ldif
if [ -e $FICHERO ]; then
rm $FICHERO
fi

echo "
dn: dc=$ip4,dc=$ip3,dc=$ip2,dc=$ip1,dc=in-addr,dc=arpa,ou=hosts,dc=instituto,dc=extremadura,dc=es
changetype: add
objectclass: dNSDomain2
objectclass: domainRelatedObject
dc: $ip4
associateddomain: $ip4.$ip3.$ip2.$ip1.in-addr.arpa
PTRRecord: $host.$dominio

dn: dc=$host,dc=$dominio,ou=hosts,dc=instituto,dc=extremadura,dc=es
changetype: add
objectclass: dnsdomain2
objectclass: domainrelatedobject
dc: $host
associateddomain: $host.$dominio
ARecord: $ip

dn: cn=$host,cn=group1,cn=INTERNAL,cn=DHCP Config,dc=instituto,dc=extremadura,dc=es
changetype: add
cn: $host
objectClass: top
objectClass: dhcpHost
dhcpHWAddress: ethernet $mac
dhcpStatements: fixed-address $host

dn: cn=printer-hosts,ou=Netgroup,dc=instituto,dc=extremadura,dc=es
changetype: delete

dn: cn=printer-hosts,ou=Netgroup,dc=instituto,dc=extremadura,dc=es
changetype: add
cn: printer-hosts
objectClass: top
objectClass: nisNetgroup" >> $FICHERO
#echo "dn: cn=printer-hosts,ou=Netgroup,dc=instituto,dc=extremadura,dc=es
#changetype: modify" >> $FICHERO
ldapsearch -xLLL -h ldap -b ou=Netgroup,dc=instituto,dc=extremadura,dc=es "(cn=printer-hosts)" | grep nisNetgr
(1)oupTriple | while read triple
do
echo $triple >> $FICHERO
done

grep "nisNetgroupTriple.*$host" $FICHERO > /dev/null
if [ $? -ne 0 ]; then
echo "nisNetgroupTriple: ($host,-,-)" >> $FICHERO
fi


echo "Añadiendo $host.$dominio a ldap con ip=$ip y mac=$mac"
more $FICHERO
ldapadd -c -x -h ldap -W -D "cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es" -f $FICHERO

(1) Ojo linea cortada

Este script nos crea objetos con el nombre de la impresora en las ramas: DHCPConfig, Hosts/dominiodelcentro, hosts/arpa/subip1/subip2/subip3/ip4 además de añadirnos la impresora al NisNetgroupTriple de la rama Netgroup/printer-host que hemos creado.Hay otro procedimiento más sencillo que es añadir la impresora desde la utilidad controlies y añadirla como un workstation normal. No obstante creo que así es mejor ya que están todas las impresoras agrupadas y localizadas.Después del reinicio de impresora ya tendremos la impresora con la ip que hemos decidido.

Añadir la impresora a los equipos.

Antes de añadir la impresora a los equipos, tenemos que descargar el archivo .ppd (para linux) y en su caso si queremos ponerla en equipos windows, los drivers de dicha impresora desde la página del fabricante.
Para añadir la impresora también tenemos varios métodos.
  • El más intuitivo es desde la interface web de cups. Abrimos una pestaña en el navegador web y ponemos en la barra de dirección localhost:631
Desde la pestaña Administración tenemos el botón de Impresoras/Añadir impresora.
Nos mostrará las impresoras encontradas por el sistema. Pinchamos en la que queremos añadir y botón siguiente.


Nos pedirá que pongamos nombre, descripción y ubicación, y botón siguiente.

Y por último le tenemos que indicar el driver. Podemos elegir de la lista, él nos indica el aconsejado, o en Seleccionar archivo le podemos decir que nos coja el que hemos descargado, que es lo que haremos.

Y ya la última ventana nos permitirá que cambiemos las opciones predeterminadas: color o blanco y negro, doble cara, etc....
  • Un segundo método es añadirla desde un terminal con el comando lpadmin, que tendría más  o menos la siguiente forma:
/usr/sbin/lpadmin -p ConserjeriaB-N -L Conserjeria  -P /etc/cups/ppd/RicohB-N.ppd -v socket://172.17.164.8
 lpadmin -p ConserjeriaB-N -E

donde le indicamos en el siguiente orden: NombreImpresora, Localización(opcional), ubicación del archivo .ppd, ip. La última línea -E es para habilitarla. 
Con -o también podemos indicarle opciones y con la -u opciones sobre usuarios.
Todo esto lo podemos ver en la documentación del comando lpadmin.

Estos dos primeros métodos tienen el inconveniente de que hay que ejecutarlos cada equipo individualmente. Si lo que queremos es añadir la impresora en varios equipos, lo ideal es hacer una tarea con puppet para que se añadan en aquellos que queramos.

Automatización con puppet.

Para ello creamos una tarea donde le indicamos la o las impresoras a añadir.
Yo al principio cree una tarea de la forma:




class comunes-poner-impresoras{



exec { "pone-impresora-Color":
command => "/usr/bin/wget http://repositorioiesburguillos/Drivers/LinEx/RicohColor.ppd;/usr/sbin/lpadmin
 (1)-p ConserjeriaColor -L Conserjeria  -P /etc/cups/ppd/RicohColor.ppd -v socket://172.17.164.7 &&   (1)lpadmin -p ConserjeriaColor -E",
       path => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
cwd => "/etc/cups/ppd/",
       unless => "cat /etc/cups/printers.conf|grep \"Printer ConserjeriaColor\"",

}
exec { "pone-impresora-SalaProfes":
command => "/usr/bin/wget http://repositorioiesburguillos/Drivers/LinEx/KyoceraFS4020.ppd  ;  (1)/usr/sbin/lpadmin -p Sala-Profesores -L Conserjeria  -P /etc/cups/ppd/KyoceraFS4020.ppd  -v  (1)socket://172.17.164.6 && lpadmin -p Sala-Profesores -E",
       path => "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
cwd => "/etc/cups/ppd/",
       unless => "cat /etc/cups/printers.conf|grep \"Printer Sala-Profesores\"",

}
    
}
(1) Ojo linea cortada
Donde vemos que mediante un exec por impresora, descargamos el archivo .ppd  del servidor repositorioiesburguillos donde está colocado y luego mediante lpadmin añadimos la impresora.

Luego he creado un define llamado anadirImpresora.pp (se coloca en /etc/puppet/defines con este contenido:

define anadirImpresora( 
$impresora,
$localizacion,
$puerto,
$archivoPpd,
$opciones='printer-error-policy=abort-job  printer-is-shared=true',
$usuariosPermitido='all',   # usuario o @grupo o usuario,usuario
$usuariosProhibidos='none' # usuario o @grupo o usuario,usuario 
 )
# inicializamos las variables
 {
  exec { "ponerimpresora":
command => "/usr/sbin/lpadmin -p $impresora -L $localizacion  -P $archivoPpd  -v $puerto -o $opciones;   (1)/usr/sbin/lpadmin -p $impresora -u allow:$usuariosPermitidos -u deny:$usuarios Prohibidos;   (1)/usr/sbin/lpadmin -p $impresora -E; /etc/init.d/cups restart",
unless => "/bin/cat /etc/cups/printers.conf|/bin/grep \"\<Printer $impresora\"\> 1>/dev/null",
       }
}

(1) Ojo linea cortada
Lo que hace es definir un recurso llamado anadirImpresora que luego podremos utilizarlo en nuestras tareas.
Vemos que he implementado también opciones que se pueden establecer. Por defecto para que aborte el trabajo si hay un error y para que la impresora no se comprata.
Por otra parte también se puede establecer política de usuacios, por defecto permitidos todos. Podemos cambiar para prohibir a @students, etc...

Así la nueva clase quedaría algo así:


import "/etc/puppet/defines/*.pp"

class comunes-poner-impresoras{
anadirImpresora{ "prueba":
impresora => "prueba",
puerto => "socket://172.17.164.7",
archivoPpd => "/etc/cups/ppd/RicohColor.ppd",
localizacion => "prueba",
      }  
}

Como vemos importa la definición del recurso y le pasa los datos de la impresora añadir. Ya el recurso se encarga de habilitarla.

No hay comentarios:

Publicar un comentario