Usando la shell para generar ficheros de configuración a partir de plantillas

Mediante el uso de envsubst se facilita la generación de ficheros de configuración (o de cualquier otro tipo) a partir de plantillas (ficheros con variables de entorno). Estos ficheros plantilla tienen la configuración, por ejemplo de Nginx, pero implementando variables para el parámetro “server_name”, el puerto, ruta a ficheros de logs, etc.

Usando envsubst se envian esos valores de las variables a la plantilla y sustituirán a las variables de ese fichero por sus valores correspondientes. De esta manera partiendo de una plantilla se pueden crear varias configuraciones diferentes. Por supuesto la creación de ficheros con el método envsubst está limitado simplemente al uso de variables. Para plantillas más sofisticadas que requieran de lógicas de programación como bucles, implementar condiciones, etc hay otro tipo de frameworks más centrados en esa temática como Puppet, Ansible, terraform, etc.

Plantilla_nginx: SERVER_NAME, HOSTNAME, VHOST, NGINX_ROOT y PROXY_PASS.

server {
    listen       80;
    server_name  ${SERVER_NAME};
 
    charset utf-8;
 
    access_log  /var/log/docker/${HOSTNAME}/nginx/access/${VHOST}.log  main;
    error_log /var/log/docker/${HOSTNAME}/nginx/error/${VHOST}.log  warn;
 
    index index.php index.html;
    root ${NGINX_ROOT};
 
    location / {
       proxy_pass ${PROXY_PASS};
    }
}

Exportamos las variables con los valores que sean pertinentes.

export SERVER_NAME=www.dominio.com HOSTNAME=${SERVER_NAME} VHOST=www NGINX_ROOT=/usr/share/nginx/html>PROXY_PASS=https://www.proxypass.com

Generamos la plantilla.

envsubst '${SERVER_NAME} ${HOSTNAME} ${VHOST} ${NGINX_ROOT} ${PROXY_PASS}' < plantilla_nginx > configuración.nginx

Si se quiere visualizar primero como sería el fichero resultante,es suficiente no redirigir la salida.

envsubst '${SERVER_NAME} ${HOSTNAME} ${VHOST} ${NGINX_ROOT} ${PROXY_PASS}' < plantilla_nginx
 
 
server {
    listen       80;
    server_name  www.dominio.com;
 
    charset utf-8;
 
    access_log  /var/log/docker/www.dominio.com/nginx/access/www.log  main;
    error_log /var/log/docker/www.dominio.com/nginx/error/www.log  warn;
 
    index index.php index.html;
    root /usr/share/nginx/html;
 
    location / {
       proxy_pass https://www.proxypass.com;
    }
}