2012-01-12 4 views
6

Estoy tratando de automatizar la configuración de la creación del sitio para nuestro servidor de desarrollo interno.¿Cómo puedo guiar la generación de archivos desde una plantilla usando bash?

Actualmente, esto consiste en crear un usuario de sistema, usuario de mysql, base de datos y configuración de apache. Sé cómo puedo hacer todo en un solo archivo bash, pero quería preguntar si había una manera de generar más limpiamente la configuración de Apache.

Esencialmente, lo que quiero hacer es generar un archivo conf basado en una plantilla, similar al uso de printf. Definitivamente podría usar printf, pero pensé que podría haber una manera más limpia, usando sed o awk.

La razón por la que no solo quiero utilizar printf es porque la configuración de apache tiene 20 líneas de longitud, ocupará la mayor parte del script bash y dificultará su lectura.

Cualquier ayuda es apreciada.

+0

Guarde el archivo httpd.conf prototípico por separado y haga que el script edite el archivo de plantilla (prototipo) en el archivo real mientras se ejecuta. Por supuesto, eso significa que se necesitan dos archivos: el script y la plantilla. Pero mantiene los dos archivos lógicamente disjuntos realmente disjuntos. –

+0

Sí, eso es lo que estaba preguntando (lo siento si no estaba claro) pero necesitaba saber cómo hacerlo. Creo que la respuesta de Péter Varga me llevará allí con algunos ajustes. – Brendan

Respuesta

7

Elija una forma de marcar parámetros. Una posibilidad es :parameter:, pero cualquier par similar de marcadores que no se confunda con texto legítimo para los archivos de plantilla es bueno.

escribir un guión sed (en sed, awk, perl, ...) similar al siguiente:

sed -e "s/:param1:/$param1/g" \ 
    -e "s/:param2:/$param2/g" \ 
    -e "s/:param3:/$param3/g" \ 
    httpd.conf.template > $HTTPDHOME/etc/httpd.conf 

Si se llega a un punto en que a veces es necesario modificar algo ya veces no lo hace , puede que le resulte más fácil crear las sed comandos relevantes en un archivo de comandos y luego ejecutar ese:

{ 
echo "s/:param1:/$param1/g" 
echo "s/:param2:/$param2/g" 
echo "s/:param3:/$param3/g" 
if [ "$somevariable" = "somevalue" ] 
then echo "s/normaldefault/somethingspecial/g" 
fi 
} >/tmp/sed.$$ 
sed -f /tmp/sed.$$ httpd.conf.template > $HTTPDHOME/etc/httpd.conf 

en cuenta que debe utilizar una trampa para asegurar el temporal o no utlive su utilidad:

tmp=/tmp/sed.$$ # Consider using more secure alternative schemes 
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15 # aka EXIT HUP INT QUIT PIPE TERM 
...code above... 
rm -f $tmp 
trap 0 

Esto asegura que su archivo temporal se elimina cuando el script finaliza para señales más plausibles. Puede conservar un estado de salida distinto de cero de comandos anteriores y usar exit $exit_status después del comando trap 0.

+0

Esto es perfecto, gracias. – Brendan

1

usar sed como por ejemplo

sed s/%foo%/$foo/g template.conf > $newdir/httpd.conf 
+0

¿Cómo reemplazaría múltiples marcadores con múltiples valores diferentes? es decir,% foo% reemplazado por $ foo y% bar% reemplazado por $ bar. – Brendan

+1

Fácil: 'sed" s /% foo%/$ foo/g; s /% bar%/$ bar/g "' – tripleee

4

Me sorprende que nadie haya mencionado aquí los documentos. Probablemente, esto no es lo que desea el OP, pero sin duda es una forma de mejorar la legibilidad del script con el que comenzó. Solo tenga cuidado de escapar o parametrizar cualquier construcción sobre la cual el shell realizará sustituciones.

#!/bin/sh 
# For example's sake, a weird value 
# This is in single quotes, to prevent substitution 
literal='$%"?*=`!!' 
user=me 

cat <<HERE >httpd.conf 
# Not a valid httpd.conf 
User=${user} 
Uninterpolated=${literal} 
Escaped=\$dollar 
HERE 

En este contexto, recomendaría $ {variable} sobre la variable $ equivalente para mayor claridad y para evitar cualquier ambigüedad posible.

Cuestiones relacionadas