distribuicion de .deb con configuraciones internas

Aldrin Martoq amartoq en dcc.uchile.cl
Lun Ene 28 23:12:01 CLST 2008


2008/1/28 Victor Hugo dos Santos <listas.vhs en gmail.com>:
> On Jan 24, 2008 3:05 PM, Aldrin Martoq <amartoq en dcc.uchile.cl> wrote:
> > On Jan 24, 2008 1:58 PM, Victor Hugo dos Santos <listas.vhs en gmail.com> wrote:
> [...]
> > Sin embargo, crear un paquete no es dificil; lo que es dificil es
> > mantenerlo. Te sugiero si son pocas las aplicaciones que necesitas (y
> > debieran serlo! salvo que sea una estacion de trabajo o grafica), te
> > guies mas por un script simple. Es mas facil de escribir "apt-get
> > install ldap apache mysql" que irse con toda la parafernalia de un
> > .deb .
> mmmm.. no seria tan difícil de mantener.. ya que los archivos que
> pienso incluir en el paquete.. son archivos que se modifican una sola
> vez (generalmente en la instalación)... o sea, solamente debería de
> lanzar la versión mipaquete_1.0.2 cuando fuera aplicar algún cambio en
> uno de los archivos que están dentro del paquete, ponerlos en el
> repositorio y esperar hasta que todos los equipos se actualizen.
> parece perfecto, no ?? :-/

Separemos los objetivos. Estoy hablando de las dependencias (que era
uno de tus objetivos), y que para manejar dependencias es muy poco
productivo crear un paquete. Basta que corras en una linea todos los
paquetes que necesitas. IMHO.

Manejar la configuracion mediante paquetes no es la manera debianita
de hacerlo, ya que los archivos de configuracion son tratados de
manera especial. Se espera que las modificaciones no se toquen. Se
espera que el sistema no te pregunte a cada rato si deseas modificar
un archivo (sobre todo en un dist-upgrade, te imaginas preguntarte por
cada archivo de configuracion en una actualizacion?). Aun asi, crear
paquetes para solucionar el objetivo de copiar configuraciones te crea
el problema adicional de que tendras que *mantenerlos*, y eso es lo
dificil: requiere mucho tiempo. Si aparece un problema de seguridad,
deberas relanzar un nuevo paquete y deberas monitorear los nuevos
release de los paquetes que has modificado. Te das cuenta?

[...]

> > Si decides irte por una solucion "home-made", te sugiero mantener un
> > diff y aplicarlo con patch, independiente del problema 1. La gracia de
> > aplicar un patch, es que la salida de diff contiene el contexto de
> > donde se realizo; si el archivo que pretende cambiar es distinto a lo
> > esperado patch gritara y tendras la chance de ver que sucede.
> perdon.. esta parte no la entendí !!!
> alguna documentacion que recomiendes ??

Que lo puedes hacer tu mismo con dos herramientas: diff y patch. Un
ejemplo que me ha llevado un buen rato hacer. Imaginemos que quiero
configurar slapd:

amartoq en dell:~$ DEBIAN_FRONTEND=noninteractive sudo apt-get -y
--force-yes install slapd
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
  ldap-utils
The following NEW packages will be installed:
  slapd
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0B/1216kB of archives.
After unpacking 3289kB of additional disk space will be used.
WARNING: The following packages cannot be authenticated!
  slapd
Preconfiguring packages ...
Selecting previously deselected package slapd.
(Reading database ... 207517 files and directories currently installed.)
Unpacking slapd (from .../slapd_2.3.35-1ubuntu0.1_i386.deb) ...
Setting up slapd (2.3.35-1ubuntu0.1) ...
  Moving old database directory to /var/backups:
  - directory unknown... done.
  Creating initial slapd configuration... done.
  Creating initial LDAP directory... done.
Starting OpenLDAP: slapd.


Ahora, modificamos la configuracion (2 archivos):
amartoq en dell:~$ sudo cp -r /etc/ldap /tmp/ldap.orig
amartoq en dell:~$ sudo vi /etc/ldap/slapd.conf
amartoq en dell:~$ sudo vi /etc/ldap/ldap.conf

Una vez realizada la modificacion, generamos un diff, es decir, un
archivo que contiene solo las diferencias:
amartoq en dell:~$ sudo diff -ur /tmp/ldap.orig/ /etc/ldap > slapd.conf.patch

Ahora, repliquemos el paso.
amartoq en dell:~$ sudo apt-get -y --purge remove slapd
[..]
amartoq en dell:~$ DEBIAN_FRONTEND=noninteractive sudo apt-get -y
--force-yes install slapd
[..]
amartoq en dell:~$ cat slapd.conf.patch | (cd / ; sudo patch -p0)
patching file /etc/ldap/ldap.conf
patching file /etc/ldap/slapd.conf

Debieras terminar en /etc/ldap con los mismos archivos.

Ahora, lo interesante es que puedes dejar todo esto en un solo script!

----- instalar-ldap.sh --------
#!/bin/bash

DEBIAN_FRONTEND=noninteractive sudo apt-get -y --force-yes install slapd

cd /
patch -p0 <<EOF
diff -ur /tmp/ldap.orig/ldap.conf /etc/ldap/ldap.conf
--- /tmp/ldap.orig/ldap.conf    2008-01-28 22:34:43.000000000 -0300
+++ /etc/ldap/ldap.conf 2008-01-28 22:34:34.000000000 -0300
@@ -8,6 +8,7 @@

 #BASE  dc=example, dc=com
 #URI   ldap://ldap.example.com ldap://ldap-master.example.com:666
+URI    ldap://10.20.30.40

 #SIZELIMIT     12
 #TIMELIMIT     15
diff -ur /tmp/ldap.orig/slapd.conf /etc/ldap/slapd.conf
--- /tmp/ldap.orig/slapd.conf   2008-01-28 22:34:01.000000000 -0300
+++ /etc/ldap/slapd.conf        2008-01-28 22:34:24.000000000 -0300
@@ -54,7 +54,7 @@
 database        bdb

 # The base of your directory in database #1
-suffix          "dc=nodomain"
+suffix          "dc=martoq,dc=cl"

 # rootdn directive for specifying a superuser on the database. This is needed
 # for syncrepl.
@@ -93,7 +93,7 @@
 # admin entry below
 # These access lines apply to database #1 only
 access to attrs=userPassword,shadowLastChange
-        by dn="cn=admin,dc=nodomain" write
+        by dn="cn=admin,dc=martoq,dc=cl" write
         by anonymous auth
         by self write
         by * none
@@ -112,7 +112,7 @@
 # The admin dn has full write access, everyone else
 # can read everything.
 access to *
-        by dn="cn=admin,dc=nodomain" write
+        by dn="cn=admin,dc=martoq,dc=cl" write
         by * read

 # For Netscape Roaming support, each user gets a roaming
EOF
----- instalar-ldap.sh --------

y ejecutar ese script en el sitio remoto. La otra gracia es que si
necesitas cambiar la IP, basta que cambies este script (que tiene el
diff embedido). Ya no necesitas correr el diff de nuevo (salvo que
tengas que modificar otra variable).





Hay mas detalles respecto a la configuracion en debian. Por ejemplo,
en este caso de slapd el archivo de configuracion *no viene en el
paquete* ni es referenciado como un archivo de configuracion!!!. Es
creado automaticamente por los scripts del maintainer:

amartoq en dell:~$ dpkg -S /etc/ldap/slapd.conf /etc/ldap/ldap.conf
dpkg: /etc/ldap/slapd.conf not found.
libldap2: /etc/ldap/ldap.conf

En vez de esto, utiliza la configuracion que entregas interactivamente
(debconf) y los scripts {pre,post}{inst,rm}. Las respuestas que
entregaste las puedes obtener con debconf-show(1) y tambien puedes
utilizarlas en un script, si creas una base de datos temporal.
Ejemplo:

amartoq en dell:~$ for db in configdb passwords; do sudo debconf-copydb
$db tmp.db --owner-pattern slapd -c Name:tmp.db -c Driver:File -c
Filename:tmp.db; done

Luego, en el script, agregas usas como entrada el archivo que se creo:

---------------------- version 2 -----------------------
#!/bin/bash

DEBIAN_FRONTEND=noninteractive DEBCONF_DB_OVERRIDE=Pipe sudo apt-get
-y --force-yes install slapd << EOF
[aqui insertas el archivo tmp.db]
EOF

cd /
patch << EOF
[aqui copias el patch]
EOF
---------------------- version 2 -----------------------


Mira debconf(7) que esta en el paquete debconf-doc. Eventualmente,
puedes utilizar la misma configuracion que tienes en la maquina
"padre", los archivos estan en /var/cache/debconf/ .


> salu2 y gracias por todos los aportes.

De nada, cuentanos finalmente que solucion tomaste.

-- 
Aldrin Martoq



Más información sobre la lista de distribución Linux