Distribuir variables con consul/envconsul


El siguiente ejemplo pretende mostrar como almacenar variables en consul y mediates envconsul utilizarlas como variables de ambiente en un servicio. Se realizará utilizando contenedores docker, el código fuente se encuentra disponible en el repositorio envconsul with a service.

Levantar consul, usando el docker-compose de este enlace y el comando

docker-compose up -d

Crear una variable llamada max_conns de valor 10 y prefijo hello-app

docker-compose exec consul-server-bootstrap consul kv put hello-app/max_conns 10

Levantar el servicio con el docker-compose del siguiente enlace

docker-compose -f docker-compose-services.yaml build
docker-compose -f docker-compose-services.yaml up -d

El servicio está desarrollado con python/flask, cada vez que recibe una consulta retorna el valor de la variable de entorno max_conns.

# -*- coding: utf-8 -*-
import os
from flask import Flask
from flask import jsonify
app = Flask(__name__)

@app.route("/")
def hello():
    return jsonify(value=os.environ['max_conns'])

if __name__ == '__main__':
   app.run(host='0.0.0.0')

El servicio se ejecuta en un contener docker, es iniciado y mantenido en ejecución por envconsul, el cual obtiene las variables desde consul y las disponibiliza como variables de entorno. Si una variable es actualizada, envconsul reinicia el servicio.

CMD envconsul \
    -consul-addr "consul-server-bootstrap:8500" \
    -prefix hello-app \
    python hello.py

Consultar al servicio

curl localhost:5000

Para obtener el valor definido anteriormente

{"value":"10"}

Actualizar el valor de la variable

docker-compose exec consul-server-bootstrap consul kv put hello-app/max_conns 20

Volvemos a invocar el servicio

curl localhost:5000

Finalmente obtenemos el último valor asignado a la variable

{"value":"20"}

Referencias