PICA: Perl Installation and Configuration Agent: Una solución inteligente para administración de sistemas | ||
---|---|---|
Anterior | Siguiente |
Como dijimos al principio, todos los ficheros de configuración y de distribución de PICA se preprocesan antes de pasar por el analizador sintáctico. Este componente es uno de los puntos más importantes de PICA, porque es el que le da gran parte de su flexibilidad. Es fácil de usar y entender y da unas posibilidades a la hora de tratar los ficheros a distribuir que, al menos de forma tan sencilla, no hemos encontrado en ninguna otra herramienta.
El preprocesador es una función escrita en Perl que hace las sustituciones necesarias en el fichero, generando uno nuevo ya preprocesado. Es muy parecido al preprocesador de C, pero con algunas diferencias importantes:
Hay dos primitivas para incluir programas en Perl, para generar dinámicamente partes de los ficheros.
Las expresiones que ponemos en las condiciones y similares son Perl puro (que se evalúan), que pueden consultar el espacio de nombres de la aplicación para consultar ciertas variables del estado interno, como el fichero o la máquina actual que se están procesando, etc.
La lista completa de opciones que nos da el preprocesador es:
Una directiva #if/#elsif/#else/#fi para condiciones simples. En estas condiciones podemos poner expresiones genéricas en Perl.
Una directiva #include para incluir ficheros (que serán procesados recursivamente), como en el caso del C.
Una directiva #perl/#lrep para generar dinámicamente partes del fichero a distribuir. Lo que se devuelva en el entorno #perl/#lrep quedará en el fichero final a copiar.
Una directiva <#/#> que funciona igual que la anterior, pero es una versión reducida, más cómoda, para usar en una sola línea.
Veamos un ejemplo del preprocesador de PICA en acción, con uno de los ficheros de ejemplo que vienen en la distribución oficial:
Ejemplo 11. Ejemplo de fichero de distribución de PICA
Well, this is just a test file to see if it worked... The value of the (local) variable myvar is '<# $myvar #>' The value of the (local) variable mythirdvar is '<# $mythirdvar #>' $myvar is <# ($myvar lt $mythirdvar)?'less':'greater' #> than $mythirdvar... The crypt'ed version of $mythirdvar is '<# crypt $mythirdvar, 'aa' #>'. Now, a little list from 0 to <# $limit #>: #perl my @result; for (my $i = 0; $i < $limit; ++$i) { push @result, "$i\n"; } @result; #lrep |
Suponiendo una definición como la siguiente:
Ejemplo 12. Ejemplo de definición del fichero pica-rules en objects.conf
file pica-rules { path = '<#$picaroot#>/rules'; # Esto también se # preprocesará source = 'pica-rules'; vars { myvar = 'foo'; limit = '2'; mythirdvar = 'enough'; } } |
el resultado del fichero, ya preprocesado, sería:
Ejemplo 13. Fichero preprocesado por PPP
Well, this is just a test file to see if it worked...
The value of the (local) variable myvar is 'foo'
The value of the (local) variable mythirdvar is 'enough'
$myvar is greater than $mythirdvar...
The crypt'ed version of $mythirdvar is 'aaVxUBNI9d3lI'.
Now, a little list from 0 to 2:
0
1
Esta versión es, naturalmente, la que se instalaría en las máquinas. Nótese además que el fichero de configuración de definición de objetos (objects.conf) y los ficheros de distribución vuelven a leerse y preprocesarse por cada máquina, así que podemos hacer que éstos dependan del objetivo donde se instalarán (ver ejemplo "Creación de varios ficheros a partir de un solo fuente" en el siguiente apartado).